主要函数:
SC_HANDLE hSCM = OpenSCManager:连接到指定的服务控制管理器,并打开指定数据库
CloseServiceHandle :关闭OPenSCManager和OpenService打开的句柄
EnumServiceStatus :枚举服务
函数详解:
SC_HANDLE WINAPI OpenSCManager(
_In_opt_ LPCTSTR lpMachineName,
_In_opt_ LPCTSTR lpDatabaseName,
_In_ DWORD dwDesiredAccess
);
参数:
lpMachineName
指向零终止字符串,命名为目标计算机。如果该指针为NULL ,或者如果它指向一个空字符串,函数连接到服务控制管理器在本地计算机上。
lpDatabaseName
指向零终止字符串,名称的服务控制管理数据库,以开放。此字符串应指定ServicesActive 。如果该指针为NULL ,该ServicesActive数据库默认情况下打开。
dwDesiredAccess
指定服务的访问控制管理。才准予进入的要求,系统会检查访问令牌的调用进程对任意访问控制列表的安全描述符与服务控制管理器对象。访问类型的SC_MANAGER_CONNECT是含蓄地指明调用这个函数。此外,任何或所有下列服务控制管理器对象的访问类型可以指定:
SC_MANAGER_ALL_ACCESS
包括STANDARD_RIGHTS_REQUIRED ,除了所有类型的访问此表中列出。
SC_MANAGER_CONNECT
可以连接到服务控制管理器。
SC_MANAGER_CREATE_SERVICE
使要求的CreateService函数创建一个服务对象,并将其添加到数据库中。
SC_MANAGER_ENUMERATE_SERVICE
使要求的EnumServicesStatus功能清单的服务,这是在数据库中。
SC_MANAGER_LOCK
使要求的LockServiceDatabase功能获得锁定数据库。
SC_MANAGER_QUERY_LOCK_STATUS
使要求的QueryServiceLockStatus检索功能锁定状态信息的数据库。
返回值
如果函数成功,返回值是一个句柄指定的服务控制管理器数据库。如果函数失败,返回值为NULL 。要获得扩展错误信息,请使用GetLastError 获德错误代码。
错误代码
ERROR_ACCESS_DENIED 访问被拒绝.
ERROR_DATABASE_DOES_NOT_EXIST 指定的数据库不存在。
ERROR_INVALID_PARAMETER 参数无效。
注意:如果出现OpenSCManager标识符未定义等错误,说明需要包含Winsvc.h头文件,MSDN上说Winsvc.h包含在了windows.h中,但在我的VS2010中并没有包含,我是手动添加的#include<Winsvc.h>。
另外,声明包含Winsvc.h或windows.h等头文件时必须放在#include "stdafx.h"之后,否则也会出现上面的错误.。
BOOL WINAPI EnumServicesStatus(
_In_ SC_HANDLE hSCManager,
_In_ DWORD dwServiceType,
_In_ DWORD dwServiceState,
_Out_opt_ LPENUM_SERVICE_STATUS lpServices,
_In_ DWORD cbBufSize,
_Out_ LPDWORD pcbBytesNeeded,
_Out_ LPDWORD lpServicesReturned,
_Inout_opt_ LPDWORD lpResumeHandle
);
hSCManager:
The OpenSCManager function returns this handle, which must have SC_MANAGER_ENUMERATE_SERVICE access.
dwServiceType:
Specifies the type of services to enumerate.
SERVICE_DRIVER : SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER (Reserved)
SERVICE_WIN32 : SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS.
dwServiceState:
SERVICE_ACTIVE
表示以下服务: SERVICE_START_PENDING, SERVICE_STOP_PENDING, SERVICE_RUNNING, SERVICE_CONTINUE_PENDING, SERVICE_PAUSE_PENDING, and SERVICE_PAUSED.
SERVICE_INACTIVE:
表示SERVICE_STOPPED服务.
SERVICE_STATE_ALL
表示SERVICE_ACTIVE 和 SERVICE_INACTIVE.
lpServices [out, optional]
ENUM_SERVICE_STATUS 结构体数组指针,接受返回的服务相关信息,要注意数组结构必须大一些,但最大不能超过256KB。
可以检测需要的大小:该参数设为NULL,下一个参数cbBufSize设为0,下下个参数pcbBytesNeeded就会返回需要的字节大小。
当然这种调用一会产生ERROR_INSUFFICIENT_BUFFER错误。
cbBufSize [in]
The size of the buffer pointed to by the lpServices parameter, in bytes.
pcbBytesNeeded [out]
如果接受数组开的太小的话会返回需要开辟的空间最小值。
lpServicesReturned [out]
返回的结果数。
lpResumeHandle [in, out, optional]
它指向的变量应该是保存了函数返回后已经遍历到了第几条服务记录。所以第一次调用EnumServiceStatus时应该传入0,否则获得的结果不完全。当函数返回ERROR_MORE_DATA(开辟的数组无法保存全部记录时会返回)错误时,这个参数就有用了,可以传入它再次调用EnumServiceStatus继续遍历服务
返回值:
失败返回0.
有以下Error情况:
ERROR_ACCESS_DENIED :hScm没有SC_MANAGER_ENUMERATE_SERVICE权限。
ERROR_INVALID_HANDLE :hScm不合法吧。
ERROR_INVALID_PARAMETER :传参错误。
ERROR_MORE_DATA :There are more service entries。