Определение состояния адресного пространства
В Windows имеется функция, позволяющая запрашивать определенную информацию об участке памяти по заданному адресу (в пределах адресного пространства вызыва ющего процесса): размер, тип памяти и атрибуты защиты. В частности, с ее помощью программа VMMap (ее листинг см. на рис. 14-4) выводит карты виртуальной памяти, с которыми мы познакомились в главе 13- Вот эта функция:
DWORD VirtualQuery( LPCVOID pvAddress, PMEMORY_BASIC_INFORMATION pmbi, DWORD dwLength);
Парная ей функция, VirtualQueryEx, сообщает ту же информацию о памяти, но в другом процессе:
DWORD VirtualQueryEx( HANDLE hProcess, LPCVOID pvAddress, PMEMORY_BASIC_INFORMATION pmbi, DWORD dwLength);
Эти функции идентичны с тем исключением, что VirtualQueryEx принимает опи сатель процесса, об адресном пространстве которого Вы хотите получить информа цию Чаще всего функцией VirtualQueryEx пользуются отладчики и системные утили ты — остальные приложения обращаются к VirtitalQuery. При вызове VirtualQitery(Ex) параметр pvAddress должен содержать адрес виртуальной памяти, о которой Вы хо тите получить информацию Параметр ртbi — это адрес структуры MEMORY_BA SIC_INFORMATION, которую надо создать перед вызовом функции. Данная структура определена в файле WinNT.h так
typedef struct _MFMORY_BASIC_INFORMATION
{
PVOID BaseAddress;
PVOID AllocationBase;
DWORD AllocationProtect;
SIZE_T RegionSize;
DWORO State;
DWORD Protect;
DWORD Type;
} MEMORY_BASIC_INFORMATION, PMEMORY_BASIC_INFORMATION;
Параметр dwLength задает размер структуры MEMORY_BASIC_INFORMATION. Фун кция VirtualQuery(Ex) возвращает число байтов, скопированных в буфер.
Используя адрес, указанный Вами в параметре pvAddress, функция VirtualQuery(Ex) заполняет структуру информацией о диапазоне смежных страниц, имеющих одина ковые состояние, атрибуты защиты и тип. Описание элементов структуры приведено в таблице ниже
Элемент |
Описание |
BaseAddress |
Сообщает то же значение, что и параметр pvAddress, но округленное до ближайшего меньшею адреса, кратного размеру страницы |
AllocationBase |
Идентифицирует базовый адрес региона, включающего в себя адрес, указанный в параметре pvAddress |
AllocationProtect |
Идентифицирует атрибут защиты, присвоенный региону при его резервировании |
RegionSize |
Сообщаем суммарный размер (в байтах) группы страниц, которые на чинаются с базового адреса BaseAddress и имеют тс же атрибуты защи ты, состояние и тип, что и страница, расположенная по адресу, укачан ному в параметре pvAddress |
State |
Сообщает состояние (MEM_FRFF, MFM_RFSFRVE или MEM_COMMIT) всех смежных страниц, которые имеют те же атрибуты защиты, состо яние и тип, что и страница, расположенная по адресу, указанному в параметре pvAddress. При MEM_FREE элементы AllocationBase, AllocationProtect, Protect и Туре содержат неопределенные значения, а при MEM_RESERVE неопреде ленное значение содержит элемент Protect. |
Protect |
Идентифицирует атрибут защиты (PAGE *) всех смежных страниц, ко торые имеют те же трибуты защиты, состояние и тип, что и страница, расположенная по адресу, указанному в параметре pvAddress |
Type |
Идентифицируем тип физической памяти (MEM_IMAGE, MEM_MAPPED или MEM PRIVATE), связанной с группой смежных страниц, которые имеют те же атрибуты защиты, состояние и тип, что и страница, рас положенная по адресу, указанному в пара метре pvAddress В Windows 98 этот элемент всегда дает MFM_PRIVATE |