Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО от Тихомирова / Лаб работы СПО ЗО 2014 / Управление виртуальной памятью 5 лр.doc
Скачиваний:
12
Добавлен:
08.06.2015
Размер:
134.14 Кб
Скачать

1.3. Функции получения информации о структуре виртуальной памяти

Для запроса информации об участке памяти (регионе) по заданному адресу (размер, тип памяти, атрибуты защиты) текущего процесса служит функция:

VirtualQuery (lpAddress: Pointer;

var lpBuffer: TMemoryBasicInformation; dwLength: DWORD): DWORD;

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

Второй параметр – переменная типа, описанного как

TMemoryBasicInformation = record

BaseAddress : Pointer; // значение параметра lpAddress, округленное до значения,

// кратного размеру страницы

AllocationBase : Pointer; // базовый адрес региона, включающего адрес запроса

AllocationProtect : DWORD; // атрибут защиты региона – некоторые из возможных

// значений PAGE_NOACCESS, PAGE_READONLY, PAGE_READWRITE

RegionSize : DWORD;// суммарный размер (в байтах) группы страниц, начинающихся

// с базового адреса и имеющих те же атрибуты защиты, состояние и тип, что и страница,

// обнаруженная по адресу lpAddress

State : DWORD; //указывает состояние (MEM_FREE, MEM_RESERVE, MEM_COMMIT) всех

// смежных страниц,имеющих те же атрибуты защиты,состояние и тип, что и страница,

// расположенная по адресу lpAddress

// Числовые значения констант состояния приведены в файле windows.pas

// Для состояния MEM_FREE элементы Allocationbase, Alloocation, Protect и Type не определя-ются

Protect : DWORD; //содержит атрибут защиты (PAGE_*),общий для всех смежных страниц,

// имеющих те же атрибуты защиты, состояние и тип, что и страница, расположенная по

// адресу lpAddress

Type : DWORD; //определяет тип физической памяти (MEM_IMAGE, MEM_MAPPED или

// MEM_PRIVATE), связанной с группой смежных страниц, имеющих имеющих те же атрибуты

// защиты,состояние и тип, что и страница, расположенная по адресу lpAddress

end;

Параметр dwLength задает размер структуры TmemoryBasicInformation.

VirtualQuery возвращает число байт, скопированных в буфер. Если возвращено нулевое значение, информация о запрошенном участке НЕ ПОЛУЧЕНА.

Сканируя память в диапазоне от 0 до максимального адреса, можно построить карту виртуальной памяти процесса.

В MSDNданная структура описана следующим образом:

typedef struct _MEMORY_BASIC_INFORMATION {

PVOID BaseAddress;

PVOID AllocationBase;

DWORD AllocationProtect;

SIZE_T RegionSize;

DWORD State;

DWORD Protect;

DWORD Type;

} MEMORY_BASIC_INFORMATION,

*PMEMORY_BASIC_INFORMATION;

Поля структуры

BaseAddress

Указатель на базовый адрес региона.

AllocationBase

Указатель на базовый адрес диапазона страниц, размещенных функцией VirtualAlloc

AllocationProtect

Опция защиты памяти, с которой регион был создан.

RegionSize

Размер региона в байтах .

State

Состояние страниц региона. Может принимать следующие значения.

Состояние - State

Пояснение

MEM_COMMIT 0x1000

Указывает, что страницам выделена физическая память.

MEM_FREE 0x10000

Указывает, что страницы свободны.

MEM_RESERVE 0x2000

Указывает, что страницы зарезервированы, но не имеют физической памяти.

Protect - Защита доступа страниц региона.

Type - Тип страниц региона. Определены следующие типы страниц региона.

Тип

Пояснение

MEM_IMAGE 0x1000000

Указывает, что страницы памяти региона принадлежат образу exe файла.

MEM_MAPPED 0x40000

Указывает, что страницы памяти региона принадлежат файлу, спроецированному в память.

MEM_PRIVATE 0x20000

Указывает, что страницы памяти региона принадлежат процессу и не разделяются с другими процессами

Константы защиты памяти

Определены следующие атрибуты защиты страниц виртуальной памяти

Константа/значение

Описание

PAGE_NOACCESS 0x01

Попытки чтения, записи или исполнения содержимого памяти на этой странице вызывают нарушение доступа

PAGE_READONLY 0x02

Попытки записи или исполнения содержимого памяти на этой странице вызывают нарушение доступа

PAGE_READWRITE 0x04

Попытки исполнения содержимого памяти на этой странице вызывают нарушение доступа

PAGE_WRITECOPY 0x08

Попытки исполнения содержимого памяти на этой странице вызывают нарушение доступа; попытка записи приводит к тому, что процессу предоставляется «личная» копия данной страницы

PAGE_EXECUTE 0x10

Попытки чтения или записи на этой странице вызывают нарушение доступа

PAGE_EXECUTE_READ 0x20

Попытки записи на этой странице вызывают нарушение доступа.

PAGE_EXECUTE_READWRITE

0x40

На этой странице возможны любые операции.

PAGE_EXECUTE_WRITECOPY

0x80

На этой странице возможны любые операции; попытка записи приводит к тому, что процессу предоставляется «личная» копия данной страницы

PAGE_GUARD 0x100

При обращении к странице возникает исключение STATUS_GUARD_PAGE_VIOLATION и атрибут сбрасывается (признак достижения границы массива).

PAGE_NOCACHE 0x200

Запрет кеширования содержимого распределенных (commit) страниц в кеше CPU. Атрибут полезен для драйверов устройств.

Более широкими возможностями обладает функция VirtualQueryEx (

HANDLE hProcess, // handle of process – описатель процесса, о виртуальном адресном пространстве которого необходимо получить информацию

LPCVOID lpAddress, // address of region

PMEMORY_BASIC_INFORMATION lpBuffer, // address of information buffer

DWORD dwLength // size of buffer

);

Эта функция отличается от предыдущей тем, что дает возможность получить информацию о виртуальном адресном пространстве любого процесса, для которого известен его описатель.