Windows - статьи



         

Вызываемые интерфейсы ядра


Как уже было указано, соответствующие библиотеки транслируют API-вызовы в вызовы к Ntdll.dll для переключения в режим ядра. Вызываемые функции Ntdll.dll, называются интерфейсами диспетчера системных сервисов или вызываемыми интерфейсами ядра. Microsoft некоим образом не документирует эти функции, а если и можно встретить в Platform SDK какую-то функцию, экспортируемую из Ntdll.dll, то будет указано, что лучше использовать соответствующие функции Win32 API и не лезть в библиотеку системной поддержки.

Для того, чтобы вызвать системный сервис из Ntdll.dll, нужно получить ее адрес в виртуальном адресном пространстве процесса функцией LoadLibrary, а затем получить указатель на соответствующую функцию вызовом GetProcAddress. Например, в следующем коде показано, как вызвать сервис NtQuerySystemInformation из Ntdll.dll для получения информации о количестве процессоров, установленных в системе.

//Определяем таким образом для Windows XP #define _WIN32_WINNT 0x0501

#include

#include

#include

#define STATUS_SUCCESS (NTSTATUS)0x00000000L

void main() { SYSTEM_BASIC_INFORMATION sysinfo; ULONG ReturnLength;

NTSTATUS (WINAPI *pNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS, PVOID,ULONG,PULONG); HMODULE hModule=LoadLibrary("Ntdll.dll"); pNtQuerySystemInformation= (NTSTATUS (WINAPI*)(SYSTEM_INFORMATION_CLASS,PVOID,ULONG,PULONG)) GetProcAddress(hModule,"NtQuerySystemInformation"); if(pNtQuerySystemInformation==NULL) abort(); if(((pNtQuerySystemInformation)(SystemBasicInformation,&sysinfo, sizeof(sysinfo),&ReturnLength))!=STATUS_SUCCESS) abort(); printf("Number of processors: %d\n",sysinfo.NumberOfProcessors); }

Здесь в качестве примера вызывается внутренний сервис NtQuerySystemInformation в Ntdll.dll. Обратите внимание, что Ntdll.dll не проецируется на виртуальное адресное пространство процесса при вызове LoadLibrary, т. к. она проецируется на начальном этапе запуска процесса. Здесь получается лишь ее базовый адрес в виртуальном адресном пространстве процесса.




Содержание  Назад  Вперед