// static member function (callback) to handle commands from the // service control manager void WINAPI CNTService::Handler(DWORD dwOpcode) { // Get a pointer to the object CNTService* pService = m_pThis; pService->DebugMsg("CNTService::Handler(%lu)", dwOpcode); switch (dwOpcode) { case SERVICE_CONTROL_STOP: // 1 pService->SetStatus(SERVICE_STOP_PENDING); pService->OnStop(); pService->m_bIsRunning = FALSE; pService->LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STOPPED); pService->SetStatus(SERVICE_STOPPED); break; case SERVICE_CONTROL_PAUSE: // 2 pService->OnSignal(); pService->OnPause(); break; case SERVICE_CONTROL_CONTINUE: // 3 pService->OnSignal(); pService->OnContinue(); break; case SERVICE_CONTROL_INTERROGATE: // 4 pService->OnInterrogate(); pService->OnSignal(); break; case SERVICE_CONTROL_SHUTDOWN: // 5 pService->DebugMsg("CNTService::Handler - Calling Shutdown"); pService->SetStatus(SERVICE_STOP_PENDING); pService->OnShutdown(); pService->m_bIsRunning = FALSE; pService->LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STOPPED); pService->SetStatus(SERVICE_STOPPED); pService->m_bIsRunning = FALSE; break; default: pService->OnSignal(); if (dwOpcode >= SERVICE_CONTROL_USER) { if (!pService->OnUserControl(dwOpcode)) { pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST); } } else { pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST); } break; } // Report current status pService->DebugMsg("Updating status (%lu, %lu)", pService->m_hServiceStatus, pService->m_Status.dwCurrentState); ::SetServiceStatus(pService->m_hServiceStatus, &pService->m_Status); }
// static member function (callback) to handle commands from the // service control manager void CNTService::Handler(DWORD dwOpcode) { #ifdef _DEBUG cout << "NTService: handling service control manager command:"; #endif // Get a pointer to the object CNTService* pService = m_pThis; switch (dwOpcode) { case SERVICE_CONTROL_STOP: // 1 #ifdef _DEBUG cout << "stop" << endl; #endif pService->SetStatus(SERVICE_STOP_PENDING); pService->OnStop(); pService->m_bIsRunning = FALSE; pService->LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STOPPED); break; case SERVICE_CONTROL_PAUSE: // 2 #ifdef _DEBUG cout << "pause" << endl; #endif pService->OnPause(); break; case SERVICE_CONTROL_CONTINUE: // 3 #ifdef _DEBUG cout << "continue" << endl; #endif pService->OnContinue(); break; case SERVICE_CONTROL_INTERROGATE: // 4 #ifdef _DEBUG cout << "interrogate" << endl; #endif pService->OnInterrogate(); break; case SERVICE_CONTROL_SHUTDOWN: // 5 #ifdef _DEBUG cout << "shutdown" << endl; #endif pService->OnShutdown(); break; default: if (dwOpcode >= SERVICE_CONTROL_USER) { #ifdef _DEBUG cout << "user control" << endl; #endif if (!pService->OnUserControl(dwOpcode)) { pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST); } } else { #ifdef _DEBUG cout << "unknown" << endl; #endif pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST); } break; } // Report current status ::SetServiceStatus(pService->m_hServiceStatus, &pService->m_Status); }