Функция ZwFreeVirtualMemory (ntifs.h)
Подпрограмма ZwFreeVirtualMemory освобождает, отменяет или и то, и другое— область страниц в виртуальном адресном пространстве указанного процесса.
Синтаксис
NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
Параметры
[in] ProcessHandle
Дескриптор процесса, в контексте которого находятся освобождаемые страницы. Используйте макрос NtCurrentProcess , определенный в ntddk.h, чтобы указать текущий процесс.
[in, out] BaseAddress
Указатель на переменную, которая получит виртуальный адрес освобожденной области страниц.
Если флаг MEM_RELEASE задан в параметре FreeType , BaseAddress должен быть базовым адресом, возвращенным ZwAllocateVirtualMemory , когда регион был зарезервирован.
[in, out] RegionSize
Указатель на переменную, которая получит фактический размер освобожденной области страниц (в байтах). Подпрограмма округляет начальное значение этой переменной до следующей границы размера главной страницы и записывает округленное значение обратно в эту переменную.
Если флаг MEM_RELEASE задан в параметре FreeType , переменная, на которую указывает RegionSize, должна иметь нулевое значение. ZwFreeVirtualMemory освобождает весь регион, который был зарезервирован в первоначальном вызове выделения для ZwAllocateVirtualMemory.
Если флаг MEM_DECOMMIT задан в параметре FreeType , ZwFreeVirtualMemory удаляет все страницы памяти, содержащие один или несколько байтов в диапазоне от параметра BaseAddress до (BaseAddress + RegionSize). Это означает, например, что если двухбайтовая область памяти переплетается между границами страницы, обе страницы будут списаны.
ZwFreeVirtualMemory удаляет весь регион, зарезервированный ZwAllocateVirtualMemory. При выполнении следующих трех условий весь регион переходит в зарезервированное состояние:
- Установлен флаг MEM_DECOMMIT.
- BaseAddress — это базовый адрес, возвращенный ZwAllocateVirtualMemory , когда регион был зарезервирован.
- RegionSize< равно нулю.
[in] FreeType
Битовая маска, содержащая флаги, описывающие тип свободной операции, которую ZwFreeVirtualMemory будет выполнять для указанной области страниц. Возможны следующие значения:
MEM_DECOMMIT
ZwFreeVirtualMemory выводит из эксплуатации указанную область страниц. Страницы переходит в зарезервированное состояние.
ZwFreeVirtualMemory не завершается ошибкой при попытке удалить незафиксированную страницу. Это означает, что диапазон страниц можно высвоить без предварительного определения текущего состояния обязательств.
MEM_RELEASE
ZwFreeVirtualMemory выпустит указанную область страниц. Страницы переходить в свободное состояние.
Если этот флаг задан, переменная, на которую указывает RegionSize , должна быть равна нулю, а BaseAddress — на базовый адрес, возвращенный ZwAllocateVirtualMemory , когда регион был зарезервирован. ZwFreeVirtualMemory завершается ошибкой , если не выполняется ни одно из этих условий.
Если какие-либо страницы в регионе в настоящее время зафиксированы, ZwFreeVirtualMemory сначала отменяет фиксацию, а затем освобождает их.
ZwFreeVirtualMemory не завершается ошибкой, если вы пытаетесь освободить страницы, которые находятся в разных состояниях, некоторые зарезервированы, а некоторые зафиксированы. Это означает, что можно освободить диапазон страниц, не определяя их текущее состояние обязательств.
Возвращаемое значение
ZwFreeVirtualMemory возвращает либо STATUS_SUCCESS, либо код состояния ошибки. Возможные коды состояния ошибок включают следующие.
Код возврата | Описание |
---|---|
STATUS_ACCESS_DENIED | Процесс запросил доступ к объекту, но не получил эти права доступа. |
STATUS_INVALID_HANDLE | Указано недопустимое значение ProcessHandle . |
STATUS_OBJECT_TYPE_MISMATCH | Существует несоответствие между типом объекта, требуемым для запрошенной операции, и типом объекта, который указан в запросе. |
Комментарии
Каждая страница в виртуальном адресном пространстве процесса находится в одном из трех состояний, описанных ниже.
Состояние бесплатно
Страница не зафиксирована и не зарезервирована. Страница недоступна для процесса. Попытка выполнить чтение с бесплатной страницы или запись на нее приводит к исключению нарушения доступа.
Вы можете использовать ZwFreeVirtualMemory , чтобы поместить зарезервированные или зафиксированные страницы в свободное состояние.
Состояние зарезервировано
Страница зарезервирована. Диапазон адресов не может использоваться другими функциями выделения. Страница недоступна для процесса и не имеет связанного с ней физического хранилища. Попытка чтения или записи на зарезервированной странице приводит к исключению нарушения доступа.
Вы можете использовать ZwFreeVirtualMemory , чтобы поместить зафиксированные страницы памяти в зарезервированное состояние, а зарезервированные страницы памяти — в свободное состояние.
Состояние — COMMITTED
Страница зафиксирована. Для страницы выделяется физическое хранилище в памяти или в файле подкачки на диске, а доступ контролируется кодом защиты.
Система инициализирует и загружает каждую зафиксированную страницу в физическую память только при первой попытке чтения или записи на нее.
Когда процесс завершается, система освобождает все хранилище для зафиксированных страниц.
Вы можете использовать ZwAllocateVirtualMemory , чтобы поместить зафиксированные страницы памяти в зарезервированное или свободное состояние.
ZwFreeVirtualMemory может выполнять следующие операции:
- Отмена фиксации области зафиксированных или незафиксированных страниц. После этой операции страницы находятся в зарезервированном состоянии.
- Освобождение области зарезервированных страниц. После этой операции страницы находятся в свободном состоянии.
- Отмена фиксации и освобождение области зафиксированных или незафиксированных страниц. После этой операции страницы находятся в свободном состоянии.
ZwFreeVirtualMemory может отменить фиксацию диапазона страниц, которые находятся в разных состояниях, некоторые из которых зафиксированы, а некоторые — незафиксированы. Это означает, что можно удалить диапазон страниц, не определяя текущее состояние обязательств каждой страницы. При списании страницы освобождается ее физическое хранилище в памяти или в файле подкачки на диске.
Если страница списана, но не освобождена, ее состояние меняется на зарезервированное. Затем можно вызвать ZwFreeVirtualMemory , чтобы зафиксировать его, или ZwFreeVirtualMemory , чтобы освободить его. Попытка чтения или записи на зарезервированной странице приводит к исключению нарушения доступа.
ZwFreeVirtualMemory может освободить диапазон страниц, которые находятся в разных состояниях, некоторые зарезервированы и зафиксированы. Это означает, что вы можете освободить диапазон страниц без предварительного определения текущего состояния обязательств каждой страницы. Весь диапазон страниц, первоначально зарезервированных ZwAllocateVirtualMemory , должен быть выпущен одновременно.
Если страница освобождена, ее состояние меняется на свободное и становится доступной для последующих операций выделения. После освобождения или списания памяти вы больше не сможете ссылаться на нее. Любая информация, которая могла быть в этой памяти, исчезнет навсегда. Попытка выполнить чтение с бесплатной страницы или запись на нее приводит к исключению нарушения доступа. Если требуется информация, не выключайте или освобождайте память, содержащую эти сведения.
Дополнительные сведения о поддержке управления памятью для драйверов в режиме ядра см. в разделе Управление памятью для драйверов Windows.
Примечание
Если вызов функции ZwFreeVirtualMemory происходит в пользовательском режиме, следует использовать имя NtFreeVirtualMemory вместо ZwFreeVirtualMemory.
Для вызовов из драйверов режима ядра версии NtXxx и ZwXxx подпрограммы Собственные системные службы Windows могут вести себя по-разному, так как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между версиями подпрограмм NtXxx и ZwXxx см. в разделе Использование версий NT и Zw подпрограмм собственных системных служб.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 2000 |
Целевая платформа | Универсальное |
Верхняя часть | ntifs.h (включая Ntifs.h, Fltkernel.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Правила соответствия DDI | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |