Перечисление сервисов NT EnumServicesStatus

В Windows NT есть понятие сервисов. Сервис - это исполняемый объект. Простым языком это модуль или драйвер, но сделанный так, что его работой можно управлять - запускать и останавливать в любое время. Посмотреть существующие сервисы можно здесь - Control Panel -> Services.

Давайте попробуем создать свою программу, которая будет перечислять сервисы.

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

#define SIZE_BUF 4096

void main()
{
ENUM_SERVICE_STATUS Status[SIZE_BUF];
DWORD Size = sizeof(Status);
DWORD Needed = 0;
DWORD Return = 0;
DWORD Handle = 0;
SC_HANDLE Manager;

Manager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);

if (Manager!=NULL)
{
if (EnumServicesStatus(Manager,SERVICE_WIN32,SERVICE_ACTIVE,
(LPENUM_SERVICE_STATUS)&Status,Size,&Needed,&Return,&Handle))
{
for (unsigned int x=0; x < Return; x++)
cout << Status[x].lpServiceName << endl;
}
else cout << "Error Open Manager " << endl;
}
else cout << "Error enum Services" << endl;
}

Давайте попробуем разобраться. Первая функция, которую мы вызываем это OpenSCManager. Эта функция устанавливает связь с менеджером NT ответственным за работу с сервисами. Вот она:

SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // имя машина
LPCTSTR lpDatabaseName, // имя менеджера
DWORD dwDesiredAccess // тип доступа
);

Как видите некоторые значения можно устанавливать в NULL. Функция EnumServicesStatus перебирает все сервисы и заносит их в буфер. Но нужно указать менеджера, тип сервисов, буфер, размер буфера и так далее.