Шаг 14 - Перечисление сервисов 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 перебирает все сервисы и заносит их в буфер. Но нужно указать менеджера, тип сервисов, буфер, размер буфера и так далее.

А вот результат работы.

14.gif (6174 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.