【原創】驅動枚舉之EnumServicesStatusEx


  1. BOOL WINAPI EnumServicesStatusEx(
  2. _In_ SC_HANDLE hSCManager,
  3. _In_ SC_ENUM_TYPE InfoLevel,
  4. _In_ DWORD dwServiceType,
  5. _In_ DWORD dwServiceState,
  6. _Out_opt_ LPBYTE lpServices,
  7. _In_ DWORD cbBufSize,
  8. _Out_ LPDWORD pcbBytesNeeded,
  9. _Out_ LPDWORD lpServicesReturned,
  10. _Inout_opt_ LPDWORD lpResumeHandle,
  11. _In_opt_ LPCTSTR pszGroupName
  12. );
函數作用:枚舉指定SCM數據庫中的驅動
參數:
1. hSCManager:SCM數據庫句柄,由 OpenSCManager   函數獲得 獲同時需要具有 SC_MANAGER_ENUMERATE_SERVICE 權限
2.  InfoLevel:返回哪種服務屬性。目前只定義了一種 SC_ENUM_PROCESS_INFO,用來獲取名字和服務狀態信息,這種情況下, lpServices是一個緩沖區指針,用來接收一個 ENUM_SERVICE_STATUS_PROCESS 結構體數組,緩沖區大小一定要足夠大,以容納結構體以及它們成員所指向的字符串。
3.  dwServiceType:要枚舉的服務類型
Value Meaning
SERVICE_DRIVER
0x0000000B

Services of type SERVICE_KERNEL_DRIVER and SERVICE_FILE_SYSTEM_DRIVER.

SERVICE_FILE_SYSTEM_DRIVER
0x00000002

File system driver services.

SERVICE_KERNEL_DRIVER
0x00000001

Driver services.

SERVICE_WIN32
0x00000030

Services of type SERVICE_WIN32_OWN_PROCESS and SERVICE_WIN32_SHARE_PROCESS.

SERVICE_WIN32_OWN_PROCESS
0x00000010

Services that run in their own processes.

SERVICE_WIN32_SHARE_PROCESS
0x00000020

Services that share a process with one or more other services. For more information, see Service Programs.

4. dwServiceState:要枚舉的服務狀態,
Value Meaning
SERVICE_ACTIVE
0x00000001

Enumerates services that are in the following states: SERVICE_START_PENDING, SERVICE_STOP_PENDING, SERVICE_RUNNING, SERVICE_CONTINUE_PENDING, SERVICE_PAUSE_PENDING, and SERVICE_PAUSED.

SERVICE_INACTIVE
0x00000002

Enumerates services that are in the SERVICE_STOPPED state.

SERVICE_STATE_ALL
0x00000003

Combines the SERVICE_ACTIVE and SERVICE_INACTIVE states.

5. lpServices[out, optional] :緩沖區指針,用於接收狀態信息。數據的格式取決於第二個形參InfoLevel的值。
數組的最大大小是256K字節。為了獲取實際需要的大小,我們可以將此形參賦值為NULL,同時將下一個形參cbBufSize賦值為0,pcbBytesNeeded返回的就是實際的數組大小,同時函數調用失敗並返回ERROR_MORE_DATA。XP和2003下,數組的最大大小是64K 字節
6. cbBufSize:緩沖區大小
7. pcbBytesNeeded[out]:指針變量,如果緩沖區太小,該指針指向的變量存儲返回剩余服務信息所需要的字節大小。
8. lpServicesReturned [out]:一個指向實際返回的服務的個數
9. lpResumeHandle [in, out, optional]:一個指向變量的指針。在輸入上,指定枚舉的開始點;在第一次調用 EnumServicesStatusEx 函數時,指針指向的變量必須設置為0。在輸出上,如果函數成功,那么指向的變量的值為0。但是,如果函數返回0,且GetLastError函數得到了 ERROR_MORE_DATA錯誤碼,則這個值表示下一個服務的開始點,可以用作下次枚舉 lpResumeHandle的值。
10. pszGroupName [in, optional] :服務組名字。如果該形參是一個字符串,那么只枚舉指定服務組的服務。如果形參為空字符串"",那么只枚舉不屬於任何服務組的服務。如果形參為NULL,那么枚舉所有服務。
 
返回值:
成功返回非0;失敗返回0。失敗時可以用GetLastError獲取錯誤碼
Return code Description
ERROR_ACCESS_DENIED

The handle does not have the SC_MANAGER_ENUMERATE_SERVICE access right.

ERROR_MORE_DATA

The buffer is too small. Not all data in the active database could be returned. The pcbBytesNeeded parameter contains the number of bytes required to receive the remaining entries.

ERROR_INVALID_PARAMETER

An illegal parameter value was used.

ERROR_INVALID_HANDLE

The handle is invalid.

ERROR_INVALID_LEVEL

The InfoLevel parameter contains an unsupported value.

ERROR_SHUTDOWN_IN_PROGRESS

The system is shutting down; this function cannot be called.

說明:如果沒有SERVICE_QUERY_STATUS權限,那么服務將會被靜默忽略,不會返回任何信息。

本文鏈接:http://www.cnblogs.com/cposture/p/4720685.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM