2. Набор функций вирт. с префикс. (ВП), которые предназначены для непосредственной работы с памятью. Работают минимально со страницей.
LPVOID VirtualAlloc(
LPVOID Addres,
SIZE_T Bytes,
DWORD Alloctype,
DWORD Protection,
);
Небольшое отступление:
В Windows ВП могут находиться в трех состояниях
1. Free – свободное
2. Reserve – зарезервированное
3. Commit – выделенная
Free – физических носителей не выделено, адресного пространства не выделено
Reserve – выделено множество адресов, а физической памяти не выделено
Commit – есть адреса и физическое хранилище
Функция VirtualAlloc позволяет двигаться в направлении Free->Reserve->Commit
Addres – адрес, по которому мы хотели бы выделить память, если все равно где выделять, то можно указать 0.
Bytes – размер участка, который нам нужен. Но размер будет округлен в большую сторону до размера страницы
Alloctype – что именно мы хотим сделать:
MEM_RESERVE – зарезервировать
MEM_COMMIT – выделить кусок
MEM_RESET - указывает системе, что вам временно указанный участок памяти не нужен, но мы его не освобождаем
MEM_DOWN – приказ системе найти участок памяти в как можно более старших адресах
|
|
Protection – атрибуты защиты системы
PAGE_READONLY – страницу можно только читать
PAGE_READWRITE – данные, которые можно и читать и писать
PAGE_EXECUTE – код, но его нельзя ни читать ни писать
PAGE_EXECUTE_READ – код, который можно читать как данные
PAGE_EXECUTE_READWRITE – код, который можно и читать и писать как данные
PAGE_NOACCESS – никакого доступа (нельзя читать и писать)
PAGE_WRITECOPY:
PAGE_NOCACHE – не кэшировать страницы в проц-ый кэш
Небольшое отступление:
ПИРАМИДА ПАМЯТИ
Чем ниже память, тем она больше и дешевле. Кэширование: используется часть из более быстрой памяти для хранения данных из более медленной с целью уменьшить среднее время доступа.
PAGE_GUARD - защитная страница
3.
BOOL VirtualFree(
LPVOID Ptr,
SIZE_T Bytes,
DWORD FreeType
);
FreeType: MEM_DECOMMIT – переводим из COMMIT в RESERVE(физической памяти нет, а адреса остались)
MEM_RELEASE – освобождаем память
Указатель Ptr должен быть установлен на начало выделенного блока, а размер установлен в 0, Bytes округляется в меньшую сторону до размера страницы.
BOOL Virtual[lock/unlock](
LPVOID Ptr,
SIZE_T Bytes
);
Virtuallock блокирует участок страниц в физической памяти, запрещая механизм SWAP. Процесс не может заблокировать страниц памяти меньше, чем размер его рабочего набора, который по умолчанию =32страницы – 128 Кб. Увеличивать рабочий размер можно, но для этого нужны права администратора.
Virtualunlock – наоборот.
BOOL VirtualProtect(
LPVOID Ptr,
SIZE_T Bytes,
DWORD Protection,
DWORD OldProtect
);
Изменяет защиту страницы.
Protection – новые атрибуты защиты
В OldProtect будет записан старый атрибут защиты.
4. Функции для работы с кучей.
Куча – системный объект, который в участке ВП организует динамическое выделение памяти. Используется, когда надо работать с небольшими участками с постоянным выделением и освобождением памяти. Кучу можно создать.
|
|
Возвращает дескриптор системного блока.
HANDLE HeapCreate(
DWORD Options,
SIZE_T ImtSize,
SIZE_T MaxSize
);
Options – опции при создании кучи:0.
ImtSize – начальный размер кучи.
MaxSize – максимальный размер кучи.
Если не получается создать кучу, то функция возвращает значение INVALID_HANDLE_VALUE.
Выделить кусок памяти из кучи
LPVOID HeapAlloc(
HANDLE heap,
DWORD Options,
SIZE_T Bytes
);
heap – из какой кучи выделить.
Options – HEAP_ZERO_MEMORY – выделить и занулить участок памяти.
Bytes – размер в байтах.
Освободить память:
BOOL HeapFree(
HANDLE heap,
DWORD Options,
LPVOID Ptr
);
Заблокировать/разблокировать общую кучу(с этой кучей могут/не могут выполнять различные операции другие процессы)
BOOL Heap[lock/unlock] (HANDLE heap);
Удаляет кучу полностью:
BOOL HeapDestroy (HANDLE heap);