Поделиться через


Функция 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)

См. также раздел

ZwAllocateVirtualMemory