#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; }