Содержание материала

  

Сервисы и драйверы

 

Системные сервисы и драйверы обрабатываются четырьмя независимыми

API-функциями. Их связи различны в каждой версии Windows. Поэтому мы вынуждены

перехватывать все четыре функции.

 

BOOL EnumServicesStatusA(

SC_HANDLE hSCManager,

DWORD dwServiceType,

DWORD dwServiceState,

LPENUM_SERVICE_STATUS lpServices,

DWORD cbBufSize,

LPDWORD pcbBytesNeeded,

LPDWORD lpServicesReturned,

LPDWORD lpResumeHandle

);

 

BOOL EnumServiceGroupW(

SC_HANDLE hSCManager,

DWORD dwServiceType,

DWORD dwServiceState,

LPBYTE lpServices,

DWORD cbBufSize,

LPDWORD pcbBytesNeeded,

LPDWORD lpServicesReturned,

LPDWORD lpResumeHandle,

DWORD dwUnknown

);

 

BOOL EnumServicesStatusExA(

SC_HANDLE hSCManager,

SC_ENUM_TYPE InfoLevel,

DWORD dwServiceType,

DWORD dwServiceState,

LPBYTE lpServices,

DWORD cbBufSize,

LPDWORD pcbBytesNeeded,

LPDWORD lpServicesReturned,

LPDWORD lpResumeHandle,

LPCTSTR pszGroupName

);

 

BOOL EnumServicesStatusExW(

SC_HANDLE hSCManager,

SC_ENUM_TYPE InfoLevel,

DWORD dwServiceType,

DWORD dwServiceState,

LPBYTE lpServices,

DWORD cbBufSize,

LPDWORD pcbBytesNeeded,

LPDWORD lpServicesReturned,

LPDWORD lpResumeHandle,

LPCTSTR pszGroupName

);

 

 

Наиболее важен здесь параметр lpServices, которое указывает на буфер,

где должен быть размещен список сервисов. lpServicesReturned, которое указывает

на количество записей в буфере, также важно. Структура данных в выходном буфере

зависит от типа функции. Для функций EnumServicesStatusA и EnumServicesGroupW

возвращается структура:

 

typedef struct _ENUM_SERVICE_STATUS {

LPTSTR lpServiceName;

LPTSTR lpDisplayName;

SERVICE_STATUS ServiceStatus;

} ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;

 

typedef struct _SERVICE_STATUS {

DWORD dwServiceType;

DWORD dwCurrentState;

DWORD dwControlsAccepted;

DWORD dwWin32ExitCode;

DWORD dwServiceSpecificExitCode;

DWORD dwCheckPoint;

DWORD dwWaitHint;

} SERVICE_STATUS, *LPSERVICE_STATUS;

 

а для EnumServicesStatusExA и EnumServicesStatusExW:

 

typedef struct _ENUM_SERVICE_STATUS_PROCESS {

LPTSTR lpServiceName;

LPTSTR lpDisplayName;

SERVICE_STATUS_PROCESS ServiceStatusProcess;

} ENUM_SERVICE_STATUS_PROCESS, *LPENUM_SERVICE_STATUS_PROCESS;

 

typedef struct _SERVICE_STATUS_PROCESS {

DWORD dwServiceType;

DWORD dwCurrentState;

DWORD dwControlsAccepted;

DWORD dwWin32ExitCode;

DWORD dwServiceSpecificExitCode;

DWORD dwCheckPoint;

DWORD dwWaitHint;

DWORD dwProcessId;

DWORD dwServiceFlags;

} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;

 

 

Нас интересует только поле lpServiceName, которое содержит имя

сервиса. Записи имеют фиксированный размер, поэтому, если мы хотим скрыть

одну, мы передвинем все последующие записи на ее размер. Здесь мы должны

помнить о различии размеров SERVICE_STATUS и SERVICE_STATUS_PROCESS.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить