您的位置:首页 > 其它

获取本地服务列表

2009-11-17 19:09 405 查看
#include <Windows.h>
#include <iostream>
#define ERRORINGETLOCALSERVICELIST 1
DWORD GetLocalServiceList()
{
DWORD dwErrorCode = NULL;
DWORD dwRet = NULL;
DWORD dwBufSize = NULL;
DWORD dwByteNeeded = NULL;
DWORD dwServicesReturned = NULL;
DWORD dwServiceCoutRet = NULL;
DWORD dwResumeHandle = 0;
DWORD dwReturn = NULL;
BOOL bRet = false;
ENUM_SERVICE_STATUS_PROCESS *lpServicesBuffer = NULL;
//开启服务管理器
SC_HANDLE sc_hHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(NULL == sc_hHandle)
{
dwErrorCode = GetLastError();
printf("Error in OpenSCManager/n");
dwReturn = ERRORINGETLOCALSERVICELIST;
goto END;
}
//第一次调用EnumServicesStatusEx,使得函数返回(dwByteNeeded)确切的bpServicesBuffer空间需求
dwResumeHandle = 0;
bRet = EnumServicesStatusEx(sc_hHandle, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, 0, &dwByteNeeded, &dwServiceCoutRet, &dwResumeHandle, NULL);

//分配获得服务列表所需的空间
lpServicesBuffer = (ENUM_SERVICE_STATUS_PROCESS*)malloc(dwByteNeeded);
if(NULL == lpServicesBuffer)
{
printf("Error in mallco a buffer./n");
dwReturn = ERRORINGETLOCALSERVICELIST;
goto END;
}
SecureZeroMemory(lpServicesBuffer, dwByteNeeded);
//获取服务列表
dwBufSize = dwByteNeeded;
bRet = EnumServicesStatusEx(sc_hHandle, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, (PBYTE)lpServicesBuffer, dwBufSize, &dwByteNeeded, &dwServiceCoutRet, &dwResumeHandle, NULL);
if(0 == bRet)
{
printf("Error in second enum./n");
dwReturn = ERRORINGETLOCALSERVICELIST;
goto END;
}
for(DWORD i=0; i<dwServiceCoutRet; i++)
{
printf("%d: ==========================================/n", i+1);
printf("lpDisplayName: %ws/n", lpServicesBuffer[i].lpDisplayName);
printf("lpServiceName: %ws/n", lpServicesBuffer[i].lpServiceName);
printf("ServiceStatusProcess: %d/n", lpServicesBuffer[i].ServiceStatusProcess.dwCurrentState);
}
dwReturn = ERROR_SUCCESS;
END:
if(NULL !=lpServicesBuffer)
{
free(lpServicesBuffer);
lpServicesBuffer = NULL;
}
getchar();
return dwReturn;
}
int _tmain(int argc, _TCHAR* argv[])
{
//本地中文化,防止服务名称为中文
setlocale(LC_ALL, "chs");
GetLocalServiceList();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: