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