static void WINAPI ServiceMain(DWORD argc, LPSTR *argv) { hstatus = RegisterServiceCtrlHandlerA("MSIServer", ServiceCtrlHandler); if (!hstatus) { fprintf(stderr, "Failed to register service ctrl handler\n"); return; } UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0); kill_event = CreateEventW(0, TRUE, FALSE, 0); if (!kill_event) { fprintf(stderr, "Failed to create event\n"); KillService(); UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0); return; } if (!StartServiceThread()) { KillService(); UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0); return; } UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0); WaitForSingleObject(kill_event, INFINITE); KillService(); UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0); }
static void WINAPI ServiceCtrlHandler(DWORD code) { WINE_TRACE("%d\n", code); switch (code) { case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0); KillService(); return; default: fprintf(stderr, "Unhandled service control code: %d\n", code); break; } UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0); }
VOID ServiceCtrlHandler(DWORD controlCode) { BOOL success; DWORD serviceCurrentStatus = controlCode; switch (controlCode) { case SERVICE_CONTROL_PAUSE: if (g_serviceRunning && !g_servicePaused) { success = UpdateSCMStatus(SERVICE_PAUSE_PENDING, NO_ERROR, 0, 1, 1000); g_servicePaused = TRUE; } break; case SERVICE_CONTROL_CONTINUE: if (g_serviceRunning && g_servicePaused) { success = UpdateSCMStatus(SERVICE_CONTINUE_PENDING, NO_ERROR, 0, 1, 1000); g_servicePaused = FALSE; } break; case SERVICE_CONTROL_INTERROGATE: break; case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: success = UpdateSCMStatus(SERVICE_STOP_PENDING, NO_ERROR, 0, 1, 5000); KillService(); return; default: break; } UpdateSCMStatus(serviceCurrentStatus, NO_ERROR, 0, 0, 0); }
VOID ServiceMain(DWORD argc, LPTSTR *argv) { #if _DEBUG ::OutputDebugString(L"ServiceMain started.\n"); #endif BOOL success; g_serviceStatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, (LPHANDLER_FUNCTION)ServiceCtrlHandler); if (!g_serviceStatusHandle) { OutputError(L"RegisterServiceCtrlHandler fails! (%d)", GetLastError()); return; } do { success = UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0, 1, 5000); if (!success) { OutputError(L"1. UpdateSCMStatus fails! (%d)", GetLastError()); break; } g_killSafeExitEvent = CreateEvent(0, TRUE, FALSE, 0); if (!g_killSafeExitEvent) { OutputError(L"CreateEvent-2 fails! (%d)", GetLastError()); break; } success = UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0, 2, 1000); if (!success) { OutputError(L"2. UpdateSCMStatus fails! (%d)", GetLastError()); break; } success = UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0, 3, 5000); if (!success) { OutputError(L"3. UpdateSCMStatus fails! (%d)", GetLastError()); break; } success = StartServiceThread(); if (!success) { OutputError(L"StartServiceThread fails! (%d)", GetLastError()); break; } success = UpdateSCMStatus(SERVICE_RUNNING, NO_ERROR, 0, 0, 0); if (!success) { OutputError(L"4. UpdateSCMStatus fails! (%d)", GetLastError()); break; } #if _DEBUG ::OutputDebugString(L"WaitForSingleObject - started.\n"); #endif WaitForSingleObject(g_killSafeExitEvent, INFINITE); UpdateSCMStatus(SERVICE_STOPPED, NO_ERROR, 0, 0, 0); #if _DEBUG ::OutputDebugString(L"WaitForSingleObject - end.\n"); #endif } while (false); }