WIn32API サービスの状態を列挙する EnumServicesStatus
Windowsサービスの状態を列挙するには、EnumServiceStatus関数を用いる。
EnumServiceStatus関数のプロトタイプは以下のとおり
BOOL EnumServicesStatus( SC_HANDLE hSCManager, // SCM データベースのハンドル DWORD dwServiceType, // サービスタイプ DWORD dwServiceState, // サービスの状態 LPENUM_SERVICE_STATUS lpServices, // ステータスバッファ DWORD cbBufSize, // ステータスバッファのサイズ LPDWORD pcbBytesNeeded, // 必要なバッファサイズ LPDWORD lpServicesReturned, // 返されたエントリの数 LPDWORD lpResumeHandle // 次のエントリ );
第二引数のdwServiceTypeには、どのようなタイプのサービスを列挙するかを指定する。指定できる値は以下のとおり
値 | 説明 |
SERVICE_WIN32 | SERVICE_WIN32_OWN_PROCESS とSERVICE_WIN32_SHARE_PROCESS を列挙する |
SERVICE_DRIVER | SERVICE_KERNEL_DRIVER と SERVICE_FILE_SYSTEM_DRIVER を列挙する |
#include <windows.h> #include <stdio.h> #include <locale.h> const TCHAR *GetCurrentStateString(DWORD dwCurrentState) { switch (dwCurrentState) { case SERVICE_STOPPED: return TEXT("SERVICE_STOPPED"); case SERVICE_START_PENDING: return TEXT("SERVICE_START_PENDING"); case SERVICE_STOP_PENDING: return TEXT("SERVICE_STOP_PENDING"); case SERVICE_RUNNING: return TEXT("SERVICE_RUNNING"); case SERVICE_CONTINUE_PENDING: return TEXT("SERVICE_CONTINUE_PENDING"); case SERVICE_PAUSE_PENDING: return TEXT("SERVICE_PAUSE_PENDING"); case SERVICE_PAUSED: return TEXT("SERVICE_PAUSED"); default: return TEXT("Unkown State"); } } const TCHAR *GetServiceTypeString(DWORD dwServiceType) { switch (dwServiceType) { case SERVICE_FILE_SYSTEM_DRIVER: return TEXT("SERVICE_FILE_SYSTEM_DRIVER"); case SERVICE_KERNEL_DRIVER: return TEXT("SERVICE_KERNEL_DRIVER"); case SERVICE_WIN32_OWN_PROCESS: return TEXT("SERVICE_WIN32_OWN_PROCESS"); case SERVICE_WIN32_SHARE_PROCESS: return TEXT("SERVICE_WIN32_SHARE_PROCESS"); case SERVICE_INTERACTIVE_PROCESS: return TEXT("SERVICE_INTERACTIVE_PROCESS"); default: return TEXT("Unknown service type"); } } int main() { SC_HANDLE hSCM; LPENUM_SERVICE_STATUS lpEnumServiceStatus; DWORD dwBytesNeeded; DWORD dwServicesReturned; DWORD i; setlocale(LC_ALL, setlocale(LC_CTYPE, "")); hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE); //サービスの状態を格納するために必要なメモリサイズ(Byte)をdwBytesNeededに取得する ::EnumServicesStatus(hSCM, SERVICE_WIN32 | SERVICE_DRIVER, SERVICE_STATE_ALL, NULL, 0, &dwBytesNeeded, &dwServicesReturned, 0); //サービスの状態を格納するためのメモリを確保する lpEnumServiceStatus = (LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, dwBytesNeeded); if (lpEnumServiceStatus == NULL) { return 1; } //サービスの状態を取得する EnumServicesStatus(hSCM, SERVICE_WIN32 | SERVICE_DRIVER, //すべてのサービスのタイプを取得する SERVICE_STATE_ALL, lpEnumServiceStatus, dwBytesNeeded, &dwBytesNeeded, &dwServicesReturned, 0); for (i = 0; i < dwServicesReturned; i++) { wprintf(L"------------------------------------------\n"); //表示名 _tprintf(TEXT("DisplayName: %s\n"), lpEnumServiceStatus[i].lpDisplayName); //サービス名 _tprintf(TEXT("ServiceName: %s\n"), lpEnumServiceStatus[i].lpServiceName); //現在の状態 _tprintf(TEXT("CurrentState: %s\n"), GetCurrentStateString(lpEnumServiceStatus[i].ServiceStatus.dwCurrentState)); //サービスタイプ _tprintf(TEXT("ServiceType: %s\n"), GetServiceTypeString(lpEnumServiceStatus[i].ServiceStatus.dwServiceType)); printf("\n"); } LocalFree(lpEnumServiceStatus); CloseServiceHandle(hSCM); return 0; }
------------------------------------------ DisplayName: 1394 OHCI Compliant Host Controller ServiceName: 1394ohci CurrentState: SERVICE_STOPPED ServiceType: SERVICE_KERNEL_DRIVER ------------------------------------------ DisplayName: Microsoft ACPI Driver ServiceName: ACPI CurrentState: SERVICE_RUNNING ServiceType: SERVICE_KERNEL_DRIVER ------------------------------------------ DisplayName: ACPI 電源メーター ドライバー ServiceName: AcpiPmi CurrentState: SERVICE_STOPPED ServiceType: SERVICE_KERNEL_DRIVER ------------------------------------------ DisplayName: Adobe Acrobat Update Service ServiceName: AdobeARMservice CurrentState: SERVICE_RUNNING ServiceType: SERVICE_WIN32_OWN_PROCESS ------------------------------------------ DisplayName: adp94xx ServiceName: adp94xx CurrentState: SERVICE_STOPPED ServiceType: SERVICE_KERNEL_DRIVER (さらに続く)
http://msdn.microsoft.com/ja-jp/library/cc429097.aspx