Improve: Add client update logic for client type EXE

This commit is contained in:
yuanyuanxiang
2026-01-20 22:03:34 +01:00
parent 51c0658e18
commit 2fb77d512b
14 changed files with 242 additions and 11 deletions

View File

@@ -265,6 +265,11 @@ int main(int argc, const char *argv[])
SAFE_CLOSE_HANDLE(hMutex);
Mprintf("结束运行.\n");
Sleep(500);
if (isService) {
Mprintf("CALL ServiceWrapper_Stop.\n");
int r = ServiceWrapper_Stop();
}
Logger::getInstance().stop();
return 0;

View File

@@ -949,6 +949,25 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
TerminateProcess(GetCurrentProcess(), 0xABCDEF);
}
Mprintf("CKernelManager: [%s] Update FAILED.\n", curFile);
} else if(typ == CLIENT_TYPE_ONE){
ULONGLONG size = 0;
memcpy(&size, (const char*)szBuffer + 1, sizeof(ULONGLONG));
const char* name = "updater.exe";
char curFile[_MAX_PATH] = {};
GetModuleFileName(NULL, curFile, MAX_PATH);
GET_FILEPATH(curFile, name);
DeleteFileA(curFile);
if (!WriteBinaryToFile((const char*)szBuffer + 1 + sizeof(ULONGLONG), size, name)) {
Mprintf("CKernelManager: Write \"%s\" failed.\n", curFile);
break;
}
if (IsPowerShellAvailable() && StartAdminLauncherAndExit(curFile, false)) {
g_bExit = S_CLIENT_UPDATE;
Mprintf("CKernelManager: [%s] Will be executed.\n", curFile);
Sleep(1000);
TerminateProcess(GetCurrentProcess(), 0xABCDEF);
}
Mprintf("CKernelManager: [%s] Execute FAILED.\n", curFile);
} else {
Mprintf("=====> 客户端类型'%d'不支持文件升级\n", typ);
}

View File

@@ -315,6 +315,67 @@ DWORD WINAPI ServiceWrapper_WorkerThread(LPVOID lpParam)
return ERROR_SUCCESS;
}
int ServiceWrapper_Stop(void)
{
// 打开SCM
SC_HANDLE hSCM = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT);
if (!hSCM) {
return (int)GetLastError();
}
// 打开服务
SC_HANDLE hService = OpenServiceA(hSCM, g_MyService.Name, SERVICE_STOP | SERVICE_QUERY_STATUS);
if (!hService) {
int err = (int)GetLastError();
CloseServiceHandle(hSCM);
return err;
}
// 查询当前状态
SERVICE_STATUS status;
if (!QueryServiceStatus(hService, &status)) {
int err = (int)GetLastError();
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return err;
}
// 如果服务未运行,直接返回成功
if (status.dwCurrentState == SERVICE_STOPPED) {
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return ERROR_SUCCESS;
}
// 发送停止控制命令
if (!ControlService(hService, SERVICE_CONTROL_STOP, &status)) {
DWORD err = GetLastError();
if (err != ERROR_SERVICE_NOT_ACTIVE) {
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return (int)err;
}
}
// 等待服务停止最多3秒
int waitCount = 0;
while (status.dwCurrentState != SERVICE_STOPPED && waitCount < 3) {
Sleep(1000);
waitCount++;
if (!QueryServiceStatus(hService, &status)) {
break;
}
}
int result = (status.dwCurrentState == SERVICE_STOPPED) ? ERROR_SUCCESS : ERROR_TIMEOUT;
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return result;
}
BOOL ServiceWrapper_Install(void)
{
SC_HANDLE schSCManager;

View File

@@ -62,6 +62,9 @@ int ServiceWrapper_StartSimple(void);
// 返回: ERROR_SUCCESS 或错误码
int ServiceWrapper_Run(void);
// 停止服务 0- 成功,其他值-错误码
int ServiceWrapper_Stop(void);
// 安装服务
BOOL ServiceWrapper_Install(void);

View File

@@ -319,7 +319,11 @@ int main(int argc, const char *argv[])
status = 0;
Mprintf("结束运行.\n");
Sleep(1000);
Sleep(500);
if (isService) {
Mprintf("CALL ServiceWrapper_Stop.\n");
int r = ServiceWrapper_Stop();
}
Logger::getInstance().stop();
return 0;