static DWORD WINAPI ServiceControlHandler(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext) { DPRINT("ServiceControlHandler() called\n"); switch (dwControl) { case SERVICE_CONTROL_STOP: DPRINT(" SERVICE_CONTROL_STOP received\n"); LogfReportEvent(EVENTLOG_INFORMATION_TYPE, 0, EVENT_EventlogStopped, 0, NULL, 0, NULL); /* Stop listening to incoming RPC messages */ RpcMgmtStopServerListening(NULL); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; case SERVICE_CONTROL_PAUSE: DPRINT(" SERVICE_CONTROL_PAUSE received\n"); UpdateServiceStatus(SERVICE_PAUSED); return ERROR_SUCCESS; case SERVICE_CONTROL_CONTINUE: DPRINT(" SERVICE_CONTROL_CONTINUE received\n"); UpdateServiceStatus(SERVICE_RUNNING); return ERROR_SUCCESS; case SERVICE_CONTROL_INTERROGATE: DPRINT(" SERVICE_CONTROL_INTERROGATE received\n"); SetServiceStatus(ServiceStatusHandle, &ServiceStatus); return ERROR_SUCCESS; case SERVICE_CONTROL_SHUTDOWN: DPRINT(" SERVICE_CONTROL_SHUTDOWN received\n"); LogfReportEvent(EVENTLOG_INFORMATION_TYPE, 0, EVENT_EventlogStopped, 0, NULL, 0, NULL); UpdateServiceStatus(SERVICE_STOPPED); return ERROR_SUCCESS; default: DPRINT1(" Control %lu received\n", dwControl); return ERROR_CALL_NOT_IMPLEMENTED; } }
static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv) { DWORD dwError; UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); DPRINT("ServiceMain() called\n"); ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, ServiceControlHandler, NULL); if (!ServiceStatusHandle) { dwError = GetLastError(); DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError); return; } UpdateServiceStatus(SERVICE_START_PENDING); dwError = ServiceInit(); if (dwError != ERROR_SUCCESS) { DPRINT("Service stopped (dwError: %lu\n", dwError); UpdateServiceStatus(SERVICE_START_PENDING); } else { DPRINT("Service started\n"); UpdateServiceStatus(SERVICE_RUNNING); ReportProductInfoEvent(); LogfReportEvent(EVENTLOG_INFORMATION_TYPE, 0, EVENT_EventlogStarted, 0, NULL, 0, NULL); } DPRINT("ServiceMain() done\n"); }
static VOID ReportProductInfoEvent(VOID) { OSVERSIONINFOW versionInfo; WCHAR szBuffer[512]; DWORD dwLength; HKEY hKey; DWORD dwValueLength; DWORD dwType; LONG lResult = ERROR_SUCCESS; ZeroMemory(&versionInfo, sizeof(OSVERSIONINFO)); versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); /* Get version information */ if (!GetVersionExW(&versionInfo)) return; ZeroMemory(szBuffer, 512 * sizeof(WCHAR)); /* Write version into the buffer */ dwLength = swprintf(szBuffer, L"%lu.%lu", versionInfo.dwMajorVersion, versionInfo.dwMinorVersion) + 1; /* Write build number into the buffer */ dwLength += swprintf(&szBuffer[dwLength], L"%lu", versionInfo.dwBuildNumber) + 1; /* Write service pack info into the buffer */ wcscpy(&szBuffer[dwLength], versionInfo.szCSDVersion); dwLength += wcslen(versionInfo.szCSDVersion) + 1; /* Read 'CurrentType' from the registry and write it into the buffer */ lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, &hKey); if (lResult == ERROR_SUCCESS) { dwValueLength = 512 - dwLength; lResult = RegQueryValueEx(hKey, L"CurrentType", NULL, &dwType, (LPBYTE)&szBuffer[dwLength], &dwValueLength); RegCloseKey(hKey); } /* Log the product information */ LogfReportEvent(EVENTLOG_INFORMATION_TYPE, 0, EVENT_EventLogProductInfo, 4, szBuffer, 0, NULL); }