Функция 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 будет выполнять для указанной области страниц. Возможные значения перечислены в следующей таблице.

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

Комментарии

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

Состояние Значение
FREE Страница не зафиксирована и не зарезервирована. Страница недоступна для процесса. Попытка выполнить чтение с бесплатной страницы или запись на нее приводит к исключению нарушения доступа. NtFreeVirtualMemory можно использовать для передачи зарезервированных или зафиксированных страниц в свободное состояние.
RESERVED Страница зарезервирована. Диапазон адресов не может использоваться другими функциями выделения. Страница недоступна для процесса и не имеет связанного с ней физического хранилища. Попытка чтения или записи на зарезервированной странице приводит к исключению нарушения доступа. NtFreeVirtualMemory можно использовать, чтобы поместить зафиксированные страницы памяти в зарезервированное состояние, а зарезервированные страницы памяти — в свободное состояние.
СОВЕРШИЛ Страница зафиксирована. Для страницы выделяется физическое хранилище в памяти или в файле подкачки на диске, а доступ контролируется кодом защиты. Система инициализирует и загружает каждую зафиксированную страницу в физическую память только при первой попытке чтения или записи на нее. Когда процесс завершается, система освобождает все хранилище для зафиксированных страниц. NtAllocateVirtualMemory можно использовать, чтобы поместить зафиксированные страницы памяти в зарезервированное или свободное состояние.

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

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

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

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

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

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

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

Примечание

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

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

NtAllocateVirtualMemory