- •1. Краткие теоретические сведения
- •1.1. Методы управления виртуальной памятью
- •1.2. Функции и структуры данных для получения информации о параметрах и состоянии виртуальной памяти
- •1.3. Функции получения информации о структуре виртуальной памяти
- •1.4. Резервирование регионов виртуального адраесного пространства
- •1.5. Использование куч
- •1.6. Файлы, проецируемые в память
- •2. Методика выполнения
- •3. Отчет о работе
- •Контрольные вопросы
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
);
Эта функция отличается от предыдущей тем, что дает возможность получить информацию о виртуальном адресном пространстве любого процесса, для которого известен его описатель.