int main( int argc, char **argv ) { /* * We are invoked as a standard executable; we act in a * "lazy" manner. We register our interfaces and endpoints, and hang around * until we all user processes exit, and then silently terminate. */ if (RPCSS_Initialize()) { WaitForSingleObject(exit_event, INFINITE); RPCSS_Shutdown(); } return 0; }
VOID WINAPI ServiceMain(DWORD argc, LPWSTR argv[]) { DWORD dwError; ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, ServiceControlHandler, NULL); if (!ServiceStatusHandle) { dwError = GetLastError(); DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError); return; } ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = 0; ServiceStatus.dwWin32ExitCode = NO_ERROR; ServiceStatus.dwServiceSpecificExitCode = 0; ServiceStatus.dwCheckPoint = 0; ServiceStatus.dwWaitHint = 1000; SetServiceStatus(ServiceStatusHandle, &ServiceStatus); if (RPCSS_Initialize()) { ServiceStatus.dwCurrentState = SERVICE_RUNNING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; SetServiceStatus(ServiceStatusHandle, &ServiceStatus); WaitForSingleObject(exit_event, INFINITE); ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(ServiceStatusHandle, &ServiceStatus); RPCSS_Shutdown(); } }