Windows XP下Service的编程入门[2]
// _dse.cpp : Defines the entry point for the console application.
// 作者: 秋镇菜
// E-mail: cyin8@msn.com
// 本程序很简单
#include "stdafx.h"
#include "windows.h"
int main(int argc, char* argv[])
{
SC_HANDLE hSCManager = NULL;
int nRet = 0;
//
// 打开服务控制管理器
//
hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if(hSCManager == NULL)
{
printf("OpenSCManager() failed. --err: %d/n", GetLastError());
return -1;
}
//
// 调用EnumServices列举系统中的服务
//
DWORD dwServicesReturned = 0;
DWORD cbBytesNeeded = 0;
DWORD cbBufSize = 0;
//
// 首次调用EnumServicesStatus确定缓冲区的大小,由cbBytesNeeded返回
//
nRet = EnumServicesStatus(
hSCManager,
SERVICE_DRIVER,
SERVICE_STATE_ALL,
NULL,
0,
&cbBytesNeeded,
&dwServicesReturned,
0);
/* ==============================================================================================
BOOL EnumServicesStatus(
SC_HANDLE hSCManager,
DWORD dwServiceType,
DWORD dwServiceState,
LPENUM_SERVICE_STATUS lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD lpResumeHandle);
EnumServicesStatus函数用于枚举NT下存在的Service。
其中参数hSCManager是指向service control manager database的句柄,由OpenSCManager函数返回,且必须有SC_MANAGER_ENUMERATE_SERVICE的权限。
参数dwServiceType指定按服务的类型枚举。
参数dwServiceState指定按服务的状态枚举。
参数lpServices指向ENUM_SERVICE_STATUS结构,用于存放返回的服务的名字和状态信息。
参数cbBufSize返回参数lpServices的长度,以字节为单位。
参数pcbBytesNeeded返回获取剩余的Service所需字节的个数。
参数lpServicesReturned返回服务的个数。
参数lpResumeHandle,当第一次调用时该参数为0,当该函数再次被调用以获取另外的信息时,该参数表示下一个被读的Service。
函数返回值:函数执行成功则返回True,失败则返回False。
值得注意的是通常情况下该函数返回的结果为FALSE,我们可以调用GetLastError()来获取进一步信息。因为一台机器上有多种服务存在,所以GetLastError()应为ERROR_MORE_DATA,此时应再次调用EnumServicesStatus函数以获取正确的Service列表。
============================================================================================== */
ENUM_SERVICE_STATUS *lpServices = new ENUM_SERVICE_STATUS[cbBytesNeeded];
cbBufSize = cbBytesNeeded;
nRet = EnumServicesStatus(
hSCManager,
SERVICE_DRIVER,
SERVICE_STATE_ALL,
lpServices,
cbBufSize,
&cbBytesNeeded,
&dwServicesReturned,
0);
if(nRet == 0)
{
printf("EnumServicesStatus() failed.");
return NULL;
}
if(lpServices == 0)
{
CloseServiceHandle(hSCManager);
return -1;
}
for(DWORD i = 0; i < dwServicesReturned; i++, lpServices++)
{
printf("%s/r/n->[%s]/n", lpServices->lpServiceName,
lpServices->lpDisplayName);
}
printf("/r/nTotal %d Service(s)./n/n", dwServicesReturned);
CloseServiceHandle(hSCManager);
return 0;
}
// 请参考:
// Windows XP下Service的编程入门[1]->http://blog.youkuaiyun.com/i_like_cpp/archive/2005/06/03/387296.aspx