//枚举Windows系统服务
//使用到的函数以及MSDN的说明如下:
//1、OpenSCManager说明
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms684323(v=vs.85).aspx
//2、EnumServicesStatusEx说明
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms682640(v=vs.85).aspx
//3、CloseServiceHandle说明
//http://msdn.microsoft.com/en-us/library/windows/desktop/ms682028(v=vs.85).aspx
// 测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <windows.h>
int main(int argc, char *argv[])
{
LONG lRet = 0;
BOOL bRet = FALSE;
SC_HANDLE hSCM = NULL; // 服务数据库句柄
char *pBuf = NULL; // 缓冲区指针
DWORD dwBufSize = 0; // 传入的缓冲长度
DWORD dwBufNeed = 0; // 需要的缓冲长度
DWORD dwNumberOfService = 0; // 返回的服务个数
ENUM_SERVICE_STATUS_PROCESS *pServiceInfo = NULL; // 服务信息
// 建立了一个到服务控制管理器的连接,并打开指定的数据库
hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);
if(NULL == hSCM)
{
printf("OpenSCManager error.\n");
return -1;
}
// 获取需要的缓冲区大小
EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
NULL, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
// 多设置存放1个服务信息的长度
dwBufSize = dwBufNeed + sizeof(ENUM_SERVICE_STATUS_PROCESS);
pBuf = (char *)malloc(dwBufSize);
if(NULL == pBuf)
{
printf("malloc error.\n");
return -1;
}
memset(pBuf, 0, dwBufSize);
// 获取服务信息
bRet = EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL,
(LPBYTE)pBuf, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
if(bRet == FALSE)
{
printf("EnumServicesStatusEx error.\n");
::CloseServiceHandle(hSCM);
free(pBuf);
return -1;
}
// 关闭打开的服务句柄
bRet = ::CloseServiceHandle(hSCM);
if(bRet == FALSE)
{
printf("CloseServiceHandle error.\n");
}
printf("Service Num:%d\n", dwNumberOfService);
pServiceInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf;
// 打印取得的服务信息
for(unsigned int i = 0; i < dwNumberOfService; i++)
{
printf("----------%d----------\n", i);
printf("DisplayName \t\t : %s \n", pServiceInfo[i].lpDisplayName);
printf("ServiceName \t\t : %s \n", pServiceInfo[i].lpServiceName);
printf("ServiceType \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwServiceType);
printf("CurrentState \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwCurrentState);
printf("ControlsAccepted \t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwControlsAccepted);
printf("Win32ExitCode \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwWin32ExitCode);
printf("ServiceSpecificExitCode : %d \n", pServiceInfo[i].ServiceStatusProcess.dwServiceSpecificExitCode);
printf("CheckPoint \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwCheckPoint);
printf("WaitHint \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwWaitHint);
printf("Process Id \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwProcessId);
printf("ServiceFlags \t\t : %d \n", pServiceInfo[i].ServiceStatusProcess.dwServiceFlags);
}
free(pBuf);
system("PAUSE");
return 0;
}
// 既然能够获取到所有的服务信息,
// 那么根据进程ID查询该进程是否为服务,取得服务名等一系列的操作就可以按自己的需求来完成了
// 获取进程ID GetCurrentProcessId()