Función VirtualFreeEx (memoryapi.h)
Libera, descommite o libera y descommite una región de memoria dentro del espacio de direcciones virtuales de un proceso especificado.
Sintaxis
BOOL VirtualFreeEx(
[in] HANDLE hProcess,
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD dwFreeType
);
Parámetros
[in] hProcess
Identificador de un proceso. La función libera memoria dentro del espacio de direcciones virtuales del proceso.
El identificador debe tener el derecho de acceso PROCESS_VM_OPERATION. Para obtener más información, consulte Derechos de acceso y seguridad de procesos.
[in] lpAddress
Puntero a la dirección inicial de la región de memoria que se va a liberar.
Si el parámetro dwFreeType es MEM_RELEASE, lpAddress debe ser la dirección base devuelta por la función VirtualAllocEx cuando se reserva la región.
[in] dwSize
Tamaño de la región de memoria que se va a liberar, en bytes.
Si el parámetro dwFreeType es MEM_RELEASE, dwSize debe ser 0 (cero). La función libera toda la región reservada en la llamada de asignación inicial a VirtualAllocEx.
Si dwFreeType es MEM_DECOMMIT, la función descommite todas las páginas de memoria que contienen uno o varios bytes en el intervalo desde el parámetro lpAddress a (lpAddress+dwSize)
. Esto significa, por ejemplo, que una región de 2 bytes de memoria que extiende un límite de página hace que ambas páginas se descommitan. Si lpAddress es la dirección base devuelta por VirtualAllocEx y dwSize es 0 (cero), la función descommite toda la región asignada por VirtualAllocEx. Después de eso, toda la región está en estado reservado.
[in] dwFreeType
Tipo de operación libre. Este parámetro puede ser uno de los siguientes valores.
Value | Significado |
---|---|
|
Descommite la región especificada de las páginas confirmadas. Después de la operación, las páginas están en estado reservado.
La función no produce un error si intenta descommitar una página sin confirmar. Esto significa que puede descommitr un intervalo de páginas sin determinar primero el estado de compromiso actual. El valor de MEM_DECOMMIT no se admite cuando el parámetro lpAddress proporciona la dirección base para un enclave. Esto es así para enclaves que no admiten la administración de memoria dinámica (es decir, SGX1). Los enclaves SGX2 permiten MEM_DECOMMIT en cualquier lugar del enclave. |
|
Libera la región especificada de páginas o marcador de posición (para un marcador de posición, el espacio de direcciones se libera y está disponible para otras asignaciones). Después de esta operación, las páginas quedan en el estado libre.
Si especifica este valor, dwSize debe ser 0 (cero) y lpAddress debe apuntar a la dirección base devuelta por la función VirtualAlloc cuando se reserva la región. Se produce un error en la función si no se cumple cualquiera de estas condiciones. Si se confirma actualmente alguna página de la región, la función se descommite primero y, a continuación, las libera. La función no produce un error si intenta liberar páginas que están en diferentes estados, algunas reservadas y otras confirmadas. Esto significa que puede liberar un intervalo de páginas sin determinar primero el estado de compromiso actual. |
Al usar MEM_RELEASE, este parámetro también puede especificar uno de los valores siguientes.
Valor | Significado |
---|---|
|
Para fusionar dos marcadores de posición adyacentes, especifique MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS . Cuando se combinan marcadores de posición, lpAddress y dwSize deben coincidir exactamente con el intervalo general de los marcadores de posición que se van a combinar.
|
|
Libera una asignación a un marcador de posición (después de reemplazar un marcador de posición por una asignación privada mediante VirtualAlloc2 o Virtual2AllocFromApp).
Para dividir un marcador de posición en dos marcadores de posición, especifique |
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es un valor distinto de cero.
Si la función no se realiza correctamente, el valor devuelto es 0 (cero). Para obtener información de error extendida, llame a GetLastError.
Comentarios
Cada página de memoria de un espacio de direcciones virtuales de proceso tiene un estado de página. La función VirtualFreeEx puede descommitar un intervalo de páginas que están en diferentes estados, algunos confirmados y algunos no confirmados. Esto significa que puede descommitr un intervalo de páginas sin determinar primero el estado de compromiso actual de cada página. Al omitir una página, se libera su almacenamiento físico, ya sea en memoria o en el archivo de paginación en el disco.
Si se descommite una página pero no se libera, su estado cambia a reservado. Posteriormente, puede llamar a VirtualAllocEx para confirmarlo o VirtualFreeEx para liberarlo. Si se intenta leer o escribir en una página reservada, se produce una excepción de infracción de acceso.
La función VirtualFreeEx puede liberar un intervalo de páginas que están en diferentes estados, algunos reservados y algunos confirmados. Esto significa que puede liberar un intervalo de páginas sin determinar primero el estado de compromiso actual de cada página. El intervalo completo de páginas reservadas originalmente por VirtualAllocEx debe publicarse al mismo tiempo.
Si se libera una página, su estado cambia a gratis y está disponible para las operaciones de asignación posteriores. Una vez que se libere o se descommita la memoria, nunca podrá volver a hacer referencia a la memoria. Cualquier información que pueda haber estado en esa memoria se ha ido para siempre. Los intentos de lectura o escritura en una página gratuita producen una excepción de infracción de acceso. Si necesita mantener la información, no descommita ni libere memoria que contenga la información.
La función VirtualFreeEx se puede usar en una región de AWE de memoria y invalida las asignaciones de páginas físicas de la región al liberar el espacio de direcciones. Sin embargo, las páginas físicas no se eliminan y la aplicación puede usarlas. La aplicación debe llamar explícitamente a FreeUserPhysicalPages para liberar las páginas físicas. Cuando finaliza el proceso, todos los recursos se limpian automáticamente.
Windows 10, versión 1709 y posteriores y Windows 11: para eliminar el enclave cuando termine de usarlo, llame a DeleteEnclave. No se puede eliminar un enclave de VBS llamando a la función VirtualFree o VirtualFreeEx . Todavía puede eliminar un enclave SGX llamando a VirtualFree o VirtualFreeEx.
Windows 10, versión 1507, Windows 10, versión 1511, Windows 10, versión 1607 y Windows 10, versión 1703: para eliminar el enclave cuando termine de usarlo, llame a la función VirtualFree o VirtualFreeEx y especifique los valores siguientes:
- Dirección base del enclave para el parámetro lpAddress .
- 0 para el parámetro dwSize .
- MEM_RELEASE para el parámetro dwFreeType .
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows XP [aplicaciones de escritorio | aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | memoryapi.h (incluya Windows.h, Memoryapi.h) |
Library | onecore.lib |
Archivo DLL | Kernel32.dll |