#include <stdio.h>
#include <Windows.h>
int main()
{
//Open the Service Control Manager
SC_HANDLE sc = ::OpenSCManager (NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
//Check if OpenSCManager returns NULL. Otherwise proceed
if (sc != NULL)
{
printf("Opened SCM using OpenSCManager n");
ENUM_SERVICE_STATUS service_data, *lpservice;
BOOL retVal;
DWORD bytesNeeded,srvCount,resumeHandle = 0,srvType, srvState;
srvType = SERVICE_WIN32;
srvState = SERVICE_STATE_ALL;
//Call EnumServicesStatus using the handle returned by OpenSCManager
retVal = ::EnumServicesStatus (sc,srvType,srvState,&service_data,sizeof(service_data),
&bytesNeeded,&srvCount,&resumeHandle);
DWORD err = GetLastError();
//Check if EnumServicesStatus needs more memory space
if ((retVal == FALSE) || err == ERROR_MORE_DATA)
{
DWORD dwBytes = bytesNeeded + sizeof(ENUM_SERVICE_STATUS);
lpservice = new ENUM_SERVICE_STATUS [dwBytes];
EnumServicesStatus (sc,srvType,srvState,lpservice,dwBytes,
&bytesNeeded,&srvCount,&resumeHandle);
}
printf("Count of NT Services using EnumServicesStatus : %dnn",srvCount);
for(int i=0;i<srvCount;i++)
{
printf("%sn",lpservice[i].lpDisplayName);
}
}
//Close the SC_HANLDE returned by OpenSCManager
CloseServiceHandle(sc);
}