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


Функция NtFreeVirtualMemory (ntifs.h)

NtFreeVirtualMemory стандартных выпусках, вывода из эксплуатации или выпусках и выводах, регион страниц в виртуальном адресном пространстве указанного процесса.

Синтаксис

__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
  [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 должен быть базовым адресом, возвращаемым NtAllocateVirtualMemory при зарезервировании региона.

[in, out] RegionSize

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

Если флаг MEM_RELEASE задан в *FreeType, *RegionSize должно быть равно нулю. NtFreeVirtualMemory освобождает весь регион, зарезервированный в первоначальном вызове выделения NtAllocateVirtualMemory.

Если флаг MEM_DECOMMIT задан в *FreeType, NtFreeVirtualMemory выводит из эксплуатации все страницы памяти, содержащие один или несколько байтов в диапазоне от *BaseAddress до (*BaseAddress + *RegionSize). Это означает, например, что если область памяти двухбайтовой области памяти привязана к границе страницы, обе страницы удаляются.

NtFreeVirtualMemory освобождает весь регион, зарезервированный NtAllocateVirtualMemory. Если выполнены следующие три условия, весь регион вводит зарезервированное состояние:

  • Установлен флаг MEM_DECOMMIT.
  • *BaseAddress — это базовый адрес, возвращаемый NtAllocateVirtualMemory при зарезервировании региона.
  • *RegionSize равно нулю.

[in] FreeType

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

Флаг Значение
MEM_DECOMMIT NtFreeVirtualMemory будет выводить указанный регион страниц. Страницы введите зарезервированное состояние. NtFreeVirtualMemory не завершается ошибкой, если вы пытаетесь отключить незафиксированную страницу. Это означает, что можно выводить из эксплуатации диапазон страниц, не определяя текущее состояние обязательств.
MEM_RELEASE NtFreeVirtualMemory выпустит указанный регион страниц. Страницы введите свободное состояние. Если указать этот флаг, RegionSize должно быть равно нулю, и BaseAddress должен указывать на базовый адрес, возвращаемый NtAllocateVirtualMemory, когда регион был зарезервирован. NtFreeVirtualMemory завершается ошибкой, если одно из этих условий не выполнено. Если в настоящее время все страницы в регионе зафиксированы, NtFreeVirtualMemory сначала выводить из эксплуатации, а затем освобождает их. NtFreeVirtualMemory не завершается ошибкой, если вы пытаетесь освободить страницы, которые находятся в разных состояниях, некоторые зарезервированные и некоторые зафиксированные. Это означает, что можно освободить диапазон страниц, не определяя текущее состояние обязательств.

Возвращаемое значение

NtFreeVirtualMemory возвращает STATUS_SUCCESS или код состояния ошибки. Возможные коды состояния ошибок включают следующие.

Возвращаемый код Описание
STATUS_ACCESS_DENIED Процесс запрашивает доступ к объекту, но не предоставляет эти права доступа.
STATUS_INVALID_HANDLE Было указано недопустимое значение ProcessHandle.
STATUS_OBJECT_TYPE_MISMATCH Существует несоответствие между типом объекта, требуемого запрошенной операцией, и типом объекта, указанного в запросе.

Замечания

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

Государство Значение
СВОБОДНЫЙ Страница не фиксируется и не зарезервирована. Страница недоступна для процесса. Попытка чтения или записи на бесплатную страницу приводит к исключению нарушения доступа. Вы можете использовать NtFreeVirtualMemory, чтобы поместить зарезервированные или зафиксированные страницы в свободное состояние.
СКРЫТНЫЙ Страница зарезервирована. Диапазон адресов нельзя использовать другими функциями выделения. Страница недоступна для процесса и не связана с ним физическим хранилищем. Попытка считывания или записи на зарезервированную страницу приводит к исключению нарушения доступа. Вы можете использовать NtFreeVirtualMemory, чтобы поместить зафиксированные страницы памяти в зарезервированное состояние и поместить зарезервированные страницы памяти в свободное состояние.
ПРЕДАННЫЙ ИДЕЕ Страница зафиксирована. Физическое хранилище в памяти или в файле разбиения на диске выделяется для страницы, а доступ управляется кодом защиты. Система инициализирует и загружает каждую зафиксированную страницу в физическую память только при первой попытке чтения или записи на эту страницу. Когда процесс завершается, система освобождает все хранилище для зафиксированных страниц. Вы можете использовать NtAllocateVirtualMemory для размещения выделенных страниц памяти в зарезервированном или свободном состоянии.

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

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

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

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

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

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

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

Заметка

Если вызов функции NtFreeVirtualMemory происходит в пользовательском режиме, следует использовать имя "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 HwStorPortProhibitedDDIs, PowerIrpDDis

См. также

NtAllocateVirtualMemory