Функция VirtualFreeEx (memoryapi.h)
Освобождает, снимает или освобождает и удаляет область памяти в виртуальном адресном пространстве указанного процесса.
Синтаксис
BOOL VirtualFreeEx(
[in] HANDLE hProcess,
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD dwFreeType
);
Параметры
[in] hProcess
Дескриптор процесса. Функция освобождает память в пределах виртуального адресного пространства процесса.
Дескриптор должен иметь право доступа PROCESS_VM_OPERATION . Дополнительные сведения см. в разделе Управление правами на доступ и безопасность процесса.
[in] lpAddress
Указатель на начальный адрес области памяти для освобождения.
Если параметр dwFreeType имеет значение MEM_RELEASE, lpAddress должен быть базовым адресом, возвращаемым функцией VirtualAllocEx , когда регион зарезервирован.
[in] dwSize
Размер освобождаемой области памяти в байтах.
Если параметр dwFreeType имеет значение MEM_RELEASE, параметр dwSize должен иметь значение 0 (ноль). Функция освобождает весь регион, зарезервированный в начальном вызове выделения VirtualAllocEx.
Если параметру dwFreeTypeMEM_DECOMMIT, функция удаляет все страницы памяти, содержащие один или несколько байтов в диапазоне от параметра lpAddress до (lpAddress+dwSize)
. Это означает, например, что 2-байтовая область памяти, которая пронизывает границу страницы, приводит к списанию обеих страниц. Если lpAddress — это базовый адрес, возвращаемый VirtualAllocEx , а dwSize — 0 (ноль), функция удаляет весь регион, выделенный VirtualAllocEx. После этого весь регион находится в зарезервированном состоянии.
[in] dwFreeType
Тип свободной операции. Этот параметр должен иметь одно из следующих значений.
Значение | Значение |
---|---|
|
Удаляет указанную область зафиксированных страниц. После выполнения операции страницы находятся в зарезервированном состоянии.
Функция не завершается ошибкой при попытке вывести незафиксированную страницу. Это означает, что можно высвоить диапазон страниц без предварительного определения текущего состояния обязательств. Значение MEM_DECOMMIT не поддерживается, если параметр lpAddress предоставляет базовый адрес для анклава. Это верно для анклавов, которые не поддерживают динамическое управление памятью (например, SGX1). Анклавы SGX2 позволяют MEM_DECOMMIT в любом месте анклава. |
|
Освобождает указанную область страниц или заполнитель (для заполнителя пространство адресов освобождается и доступно для других выделений). После выполнения этой операции страницы находятся в свободном состоянии.
Если указать это значение, dwSize должно иметь значение 0 (ноль), а lpAddress должно указывать на базовый адрес, возвращаемый функцией VirtualAlloc , когда регион зарезервирован. Функция завершается сбоем, если ни одно из этих условий не выполняется. Если какие-либо страницы в регионе фиксируются в данный момент, функция сначала удаляется, а затем освобождает их. Функция не завершается ошибкой при попытке освободить страницы, которые находятся в разных состояниях, некоторые зарезервированы и зафиксированы. Это означает, что можно освободить диапазон страниц без предварительного определения текущего состояния обязательств. |
При использовании MEM_RELEASE этот параметр может дополнительно указать одно из следующих значений.
Значение | Значение |
---|---|
|
Чтобы объединить два смежных заполнителя, укажите MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS . При объединии заполнителей lpAddress и dwSize должны точно соответствовать общему диапазону заполнителей для объединения.
|
|
Освобождает выделение обратно в заполнитель (после замены заполнителя частным выделением с помощью VirtualAlloc2 или Virtual2AllocFromApp).
Чтобы разделить заполнитель на два заполнителя, укажите |
Возвращаемое значение
Если функция выполняется успешно, возвращаемое значение будет ненулевым.
Если функция завершается сбоем, возвращается значение 0 (ноль). Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
Каждая страница памяти в виртуальном адресном пространстве процесса имеет состояние страницы. Функция VirtualFreeEx может выводить из эксплуатации диапазон страниц, которые находятся в разных состояниях, некоторые из которых зафиксированы, а некоторые — незафиксированы. Это означает, что можно высвоить диапазон страниц без предварительного определения текущего состояния обязательств для каждой страницы. При выводе страницы из эксплуатации ее физическое хранилище освобождается в памяти или в файле подкачки на диске.
Если страница была списана, но не освобождена, ее состояние изменится на зарезервированное. Затем можно вызвать VirtualAllocEx , чтобы зафиксировать его, или VirtualFreeEx , чтобы освободить его. Попытка чтения с зарезервированной страницы или записи на нее приводит к исключению нарушения доступа.
Функция VirtualFreeEx может освободить диапазон страниц, которые находятся в разных состояниях, некоторые зарезервированы и зафиксированы. Это означает, что можно освободить диапазон страниц без предварительного определения текущего состояния обязательств для каждой страницы. Весь диапазон страниц, изначально зарезервированных VirtualAllocEx , должен быть освобожден одновременно.
Если страница освобождена, ее состояние изменяется на бесплатную и становится доступной для последующих операций выделения. После освобождения или списания памяти вы никогда не сможете снова обратиться к ней. Любая информация, которая могла быть в этой памяти, исчезнет навсегда. Попытки чтения с бесплатной страницы или записи на нее приводят к исключению нарушения доступа. Если необходимо сохранить сведения, не снимайте и не освобождайте память, содержащую эти сведения.
Функция VirtualFreeEx может использоваться в области памяти AWE и делает недействительными любые сопоставления физических страниц в этом регионе при освобождении адресного пространства. Однако физические страницы не удаляются, и приложение может использовать их. Приложение должно явно вызвать FreeUserPhysicalPages , чтобы освободить физические страницы. После завершения процесса все ресурсы автоматически очищаются.
Windows 10 версии 1709 и более поздних версий и Windows 11. Чтобы удалить анклав после его использования, вызовите Метод DeleteEnclave. Вы не можете удалить анклав VBS, вызвав функцию VirtualFree или VirtualFreeEx . Вы по-прежнему можете удалить анклав SGX, вызвав VirtualFree или VirtualFreeEx.
Windows 10 версии 1507, Windows 10, версии 1511, Windows 10 версии 1607 и Windows 10 версии 1703. Чтобы удалить анклав после его использования, вызовите функцию VirtualFree или VirtualFreeEx и укажите следующие значения:
- Базовый адрес анклава для параметра lpAddress .
- 0 для параметра dwSize .
- MEM_RELEASE для параметра dwFreeType .
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows XP [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2003 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | memoryapi.h (включая Windows.h, Memoryapi.h) |
Библиотека | onecore.lib |
DLL | Kernel32.dll |