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


Функция 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 Существует несоответствие между типом объекта, требуемого запрошенной операцией, и типом объекта, указанного в запросе.

Замечания

Каждая страница в виртуальном адресном пространстве процесса находится в одном из трех состояний, описанных ниже.

  • Состояние — FREE

    Страница не фиксируется и не зарезервирована. Страница недоступна для процесса. Попытка чтения или записи на бесплатную страницу приводит к исключению нарушения доступа.

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

  • Состояние зарезервировано

    Страница зарезервирована. Диапазон адресов нельзя использовать другими функциями выделения. Страница недоступна для процесса и не связана с ним физическим хранилищем. Попытка считывания или записи на зарезервированную страницу приводит к исключению нарушения доступа.

    Вы можете использовать ZwFreeVirtualMemory, чтобы поместить выделенные страницы памяти в зарезервированное состояние и поместить зарезервированные страницы памяти в свободное состояние.

  • Состояние IS COMMITTED

    Страница зафиксирована. Физическое хранилище в памяти или в файле разбиения на диске выделяется для страницы, а доступ управляется кодом защиты.

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

    Когда процесс завершается, система освобождает все хранилище для зафиксированных страниц.

    Вы можете использовать ZwAllocateVirtualMemory, чтобы поместить выделенные страницы памяти в зарезервированное или свободное состояние.

ZwFreeVirtualMemory могут выполнять следующие операции:

  • Отмените фиксацию или незафиксированные страницы. После этой операции страницы находятся в зарезервированном состоянии.
  • Выпустите область зарезервированных страниц. После этой операции страницы находятся в свободном состоянии.
  • Отмените и отпустите регион зафиксированных или незафиксированных страниц. После этой операции страницы находятся в свободном состоянии.

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

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

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

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

Дополнительные сведения о поддержке управления памятью для драйверов в режиме ядра см. в разделе Управление памятью для драйверов Windows.

Заметка

Если вызов функции ZwFreeVirtualMemory происходит в пользовательском режиме, следует использовать имя "NtFreeVirtualMemory" вместо "ZwFreeVirtualMemory".

Для вызовов драйверов в режиме ядра NtXxx и ZwXxx версии подпрограммы Windows Native System Services могут вести себя по-разному в том, как они обрабатывают и интерпретируют входные параметры. Дополнительные сведения о связи между NtXxx и ZwXxx версиями подпрограммы см. в разделе Using Nt and Zw Versions of the Native System Services Routines.

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows 2000
целевая платформа Всеобщий
заголовка ntifs.h (include Ntifs.h, Fltkernel.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
правил соответствия DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

См. также

ZwAllocateVirtualMemory