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); }
void SFServiceController::ServiceMain(DWORD argc, LPTSTR *argv) { UNREFERENCED_PARAMETER(argc); BOOL success; nServiceStatusHandle = RegisterServiceCtrlHandler(argv[0], (LPHANDLER_FUNCTION)ServiceCtrlHandler); if(!nServiceStatusHandle) { return; } success=UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,1,3000); if(!success) { return; } killServiceEvent=CreateEvent(0,TRUE,FALSE,0); if(killServiceEvent==NULL) { return; } success=UpdateServiceStatus(SERVICE_START_PENDING,NO_ERROR,0,2,1000); if(!success) { return; } success=StartServiceThread(); if(!success) { return; } nServiceCurrentStatus=SERVICE_RUNNING; success=UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0); if(!success) { return; } WaitForSingleObject(killServiceEvent,INFINITE); CloseHandle(killServiceEvent); }
//-------------------------------------------------------------------------------- BOOL CNTService::ProcessCommandLine(LPCTSTR pCmdLine) { AFX_MANAGE_STATE_IF_DLL CCmdLine cmdLine(pCmdLine); int nIndex; if(cmdLine.HasParam('D', nIndex) || cmdLine.HasParam(_T("-debug"), nIndex)) return FALSE; if(cmdLine.HasParam('I', nIndex) || cmdLine.HasParam(_T("-install"), nIndex)) { InstallService(); return TRUE; } if(cmdLine.HasParam('R', nIndex) || cmdLine.HasParam(_T("-remove"), nIndex)) { RemoveService(); return TRUE; } if(cmdLine.HasParam('E', nIndex) || cmdLine.HasParam(_T("-end"), nIndex) || cmdLine.HasParam(_T("-stop"), nIndex)) { EndService(); return TRUE; } if(cmdLine.HasParam('S', nIndex) || cmdLine.HasParam(_T("-start"), nIndex)) { StartupService(); return TRUE; } StartServiceThread(); return FALSE; }
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); }