DWORD CService:: ServiceCtrlHandlerEx( DWORD dwControl, DWORD dwEventType, LPVOID lpEventData) { switch (dwControl) { // Standard Handlers case SERVICE_CONTROL_CONTINUE: return OnServiceResume(); case SERVICE_CONTROL_INTERROGATE: return OnServiceInterrogate(); case SERVICE_CONTROL_PARAMCHANGE: return OnServiceParamChange(); case SERVICE_CONTROL_PAUSE: return OnServicePause(); case SERVICE_CONTROL_SHUTDOWN: return OnServiceShutdown(); case SERVICE_CONTROL_STOP: return OnServiceStop(); // Extended Handlers case SERVICE_CONTROL_DEVICEEVENT: return OnServiceDeviceEvent(dwEventType, lpEventData); case SERVICE_CONTROL_HARDWAREPROFILECHANGE: return OnServiceHardwareProfileChange(dwEventType, lpEventData); case SERVICE_CONTROL_POWEREVENT: return OnServicePowerEvent(dwEventType, lpEventData); #if (WINVER >= 0x510) case SERVICE_CONTROL_SESSIONCHANGE: return OnServiceSessionChange(dwEventType, lpEventData); #endif // This control code has been deprecated. use PnP functionality instead case SERVICE_CONTROL_NETBINDADD: case SERVICE_CONTROL_NETBINDDISABLE: case SERVICE_CONTROL_NETBINDENABLE: case SERVICE_CONTROL_NETBINDREMOVE: return ERROR_CALL_NOT_IMPLEMENTED; default: // User-defined control code if (dwControl >= 128 && dwControl <= 255) { return OnServiceUserControl(dwControl, dwEventType, lpEventData); } else { return ERROR_CALL_NOT_IMPLEMENTED; } } }
DWORD CNdasService::Impl::ThreadStart(LPVOID) { // // Stop NdasBus auto-plugin feature to take over plugin facility. // BOOL fSuccess = LsBusCtlStartStopRegistrarEnum(FALSE, NULL); XTLASSERT(fSuccess); ////////////////////////////////////////////////////////////////////////// // Get the initialized instance ////////////////////////////////////////////////////////////////////////// if (!InitializeInstances()) { OnServiceStop(); return 1; } ////////////////////////////////////////////////////////////////////////// // Bootstrap registrar from the registry ////////////////////////////////////////////////////////////////////////// XTLVERIFY( m_cDeviceRegistrar.Bootstrap() ); ////////////////////////////////////////////////////////////////////////// // Start Queuing Work Items ////////////////////////////////////////////////////////////////////////// m_nWorkItems = 0; if (!StartWorkItems(m_nWorkItems)) { OnServiceStop(); return 1; } // Release semaphore to start workers (semaphore increment) LONG prev; XTLVERIFY( ::ReleaseSemaphore(m_hWorkItemSemaphore, m_nWorkItems, &prev) ); XTLASSERT( 0 == prev ); ////////////////////////////////////////////////////////////////////////// // Start Command Processor Thread ////////////////////////////////////////////////////////////////////////// if (!m_wiCmdServer.CreateThreadEx( &m_cCmdServer, &CNdasCommandServer::ThreadStart, LPVOID(m_hStopServiceEvent))) { OnServiceStop(); return 1; } ////////////////////////////////////////////////////////////////////////// // Initialization thread is done ////////////////////////////////////////////////////////////////////////// return 0; }