void GimuDaemonCtrlHandler(DWORD nControlCode) { switch (nControlCode) { case SERVICE_CONTROL_SHUTDOWN: if (!IsGimuAppStart ()) { // // 如果软件没有启动,需要启动备份完成后才能关机。 // vector<GmJobItem*> & jobs = ctx.Jobs; if (jobs.empty ()) break; wxString jobsname; for (size_t index = 0; index < jobs.size (); ++index) { if (IsThisJobAtScheduleTime (jobs[index])) { jobsname += jobs[index]->Name (); jobsname += wxT (" "); } } // // 如果没有任务需要执行,那么就不需要启动 Gimu。 // if (jobsname.IsEmpty ()) break; AbortSystemShutdown (0); wxString szExePath = GmAppInfo::GetAppPath (); wxString gimuexe = AssemblePath (szExePath, GIMU_APP_NAME); wxString format = wxT ("%s -"); format += START_MINIMIZE; format += wxT (" -"); format += START_RUN_NAMED_JOBS; format += wxT (" -"); format += SHUTDOWN_SYS_AFTER_FINISH; format += wxT (" "); format += wxT ("%s"); wxString run = wxString::Format (format, gimuexe.c_str (), jobsname); wxExecute (run); } break; case SERVICE_CONTROL_STOP: UpdateServiceStatus (SERVICE_STOP_PENDING, NO_ERROR, 0, 3000); KillService(); break; default: break; } return; }
int wmain(int iArgc, LPWSTR *iArgv) { HANDLE hEventQuit = CreateEvent(NULL, true, false, "ASSDQUITEVENT"); if (hEventQuit == NULL) return 1; if (iArgc > 1) if (wcsicmp(iArgv[1], L"/QUIT") == 0) return !SetEvent(hEventQuit); HANDLE hToken; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { struct { DWORD PrivilegeCount; LUID_AND_ATTRIBUTES Privileges[2]; } TP; TP.PrivilegeCount = 2; LookupPrivilegeValue("", SE_SHUTDOWN_NAME, &(TP.Privileges[0].Luid)); TP.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; LookupPrivilegeValue("", SE_REMOTE_SHUTDOWN_NAME, &(TP.Privileges[1].Luid)); TP.Privileges[1].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, (PTOKEN_PRIVILEGES) &TP, NULL, NULL, NULL); } for (;;) { AbortSystemShutdown(NULL); if (WaitForSingleObject(hEventQuit, 0) == WAIT_OBJECT_0) return 0; WaitForSingleObject(hEventQuit, 600000); } }