Example #1
0
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;
}
Example #2
0
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);
    }
}