BOOL WINAPI EnumServicesStatusEx(
_In_ SC_HANDLE hSCManager,
_In_ SC_ENUM_TYPE InfoLevel,
_In_ DWORD dwServiceType,
_In_ DWORD dwServiceState,
_Out_opt_ LPBYTE lpServices,
_In_ DWORD cbBufSize,
_Out_ LPDWORD pcbBytesNeeded,
_Out_ LPDWORD lpServicesReturned,
_Inout_opt_ LPDWORD lpResumeHandle,
_In_opt_ LPCTSTR pszGroupName
);
函数作用:枚举指定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