Función ZwFreeVirtualMemory (ntifs.h)
La rutina ZwFreeVirtualMemory libera, descommite o ambas, una región de páginas dentro del espacio de direcciones virtuales de un proceso especificado.
Sintaxis
NTSYSAPI NTSTATUS ZwFreeVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in, out] PSIZE_T RegionSize,
[in] ULONG FreeType
);
Parámetros
[in] ProcessHandle
Identificador del proceso en cuyo contexto residen las páginas que se van a liberar. Use la macro NtCurrentProcess , definida en Ntddk.h, para especificar el proceso actual.
[in, out] BaseAddress
Puntero a una variable que recibirá la dirección virtual de la región de páginas libres.
Si la marca de MEM_RELEASE se establece en el parámetro FreeType , BaseAddress debe ser la dirección base devuelta por ZwAllocateVirtualMemory cuando se reservó la región.
[in, out] RegionSize
Puntero a una variable que recibirá el tamaño real, en bytes, de la región libre de páginas. La rutina redondea el valor inicial de esta variable hasta el siguiente límite de tamaño de página host y escribe el valor redondeado en esta variable.
Si la marca de MEM_RELEASE se establece en el parámetro FreeType , la variable a la que apunta RegionSize debe ser cero. ZwFreeVirtualMemory libera toda la región reservada en la llamada de asignación inicial a ZwAllocateVirtualMemory.
Si la marca de MEM_DECOMMIT se establece en el parámetro FreeType , ZwFreeVirtualMemory descommite todas las páginas de memoria que contengan uno o varios bytes en el intervalo desde el parámetro BaseAddress a (BaseAddress + RegionSize). Esto significa, por ejemplo, que si una región de dos bytes de memoria estraba un límite de página, ambas páginas se descommiten.
ZwFreeVirtualMemory descommite toda la región reservada por ZwAllocateVirtualMemory. Si se cumplen las tres condiciones siguientes, toda la región entra en el estado reservado:
- Se establece la marca MEM_DECOMMIT.
- BaseAddress es la dirección base devuelta por ZwAllocateVirtualMemory cuando se reservó la región.
- RegionSize< es cero.
[in] FreeType
Máscara de bits que contiene marcas que describen el tipo de operación libre que ZwFreeVirtualMemory realizará para la región especificada de páginas. A continuación se indican los posibles valores:
MEM_DECOMMIT
ZwFreeVirtualMemory descommita la región especificada de las páginas. Las páginas escriben el estado reservado.
ZwFreeVirtualMemory no falla si intenta descommitar una página sin confirmar. Esto significa que puede descommitr un intervalo de páginas sin determinar primero su estado de compromiso actual.
MEM_RELEASE
ZwFreeVirtualMemory liberará la región especificada de las páginas. Las páginas entran en el estado libre.
Si especifica esta marca, la variable que RegionSize apunta a debe ser cero y BaseAddress debe apuntar a la dirección base devuelta por ZwAllocateVirtualMemory cuando se reservó la región. ZwFreeVirtualMemory produce un error si no se cumple alguna de estas condiciones.
Si hay alguna página en la región confirmada actualmente, ZwFreeVirtualMemory primero se descommite y, a continuación, las libera.
ZwFreeVirtualMemory no falla 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 su estado de compromiso actual.
Valor devuelto
ZwFreeVirtualMemory devuelve STATUS_SUCCESS o un código de estado de error. Los posibles códigos de estado de error incluyen lo siguiente.
Código devuelto | Descripción |
---|---|
STATUS_ACCESS_DENIED | Un proceso ha solicitado acceso a un objeto, pero no se le han concedido esos derechos de acceso. |
STATUS_INVALID_HANDLE | Se especificó un valor ProcessHandle no válido. |
STATUS_OBJECT_TYPE_MISMATCH | Hay una discrepancia entre el tipo de objeto requerido por la operación solicitada y el tipo de objeto especificado en la solicitud. |
Comentarios
Cada página del espacio de direcciones virtuales del proceso se encuentra en uno de los tres estados descritos de la siguiente manera.
El estado es FREE
La página no está confirmada ni reservada. La página no es accesible para el proceso. Si se intenta leer o escribir en una página gratuita, se produce una excepción de infracción de acceso.
Puede usar ZwFreeVirtualMemory para colocar páginas reservadas o confirmadas en el estado libre.
El estado es RESERVADO
La página está reservada. Otras funciones de asignación no pueden usar el intervalo de direcciones. La página no es accesible para el proceso y no tiene ningún almacenamiento físico asociado a él. Si se intenta leer o escribir en una página reservada, se produce una excepción de infracción de acceso.
Puede usar ZwFreeVirtualMemory para colocar páginas de memoria confirmadas en el estado reservado y para colocar páginas de memoria reservadas en el estado libre.
El estado es COMMITTED
La página se confirma. El almacenamiento físico en memoria o en el archivo de paginación del disco se asigna para la página y un código de protección controla el acceso.
El sistema inicializa y carga cada página confirmada en memoria física solo en el primer intento de leer o escribir en esa página.
Cuando finaliza un proceso, el sistema libera todo el almacenamiento de las páginas confirmadas.
Puede usar ZwAllocateVirtualMemory para colocar páginas de memoria confirmadas en el estado reservado o libre.
ZwFreeVirtualMemory puede realizar las siguientes operaciones:
- Descommita una región de páginas confirmadas o no confirmadas. Después de esta operación, las páginas están en estado reservado.
- Liberar una región de páginas reservadas. Después de esta operación, las páginas quedan en el estado libre.
- Descommita y libere una región de páginas confirmadas o no confirmadas. Después de esta operación, las páginas quedan en el estado libre.
ZwFreeVirtualMemory puede descommitar un intervalo de páginas que se encuentran 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 ZwFreeVirtualMemory para confirmarlo o ZwFreeVirtualMemory para liberarlo. Si se intenta leer o escribir en una página reservada, se produce una excepción de infracción de acceso.
ZwFreeVirtualMemory puede liberar un intervalo de páginas que se encuentran 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. Toda la gama de páginas reservadas originalmente por ZwAllocateVirtualMemory 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 haya liberado o descommitido 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. Si se intenta leer o escribir en una página gratuita, se produce una excepción de infracción de acceso. Si necesita información, no descommita ni libere memoria que contenga esa información.
Para obtener más información sobre la compatibilidad de administración de memoria con controladores en modo kernel, consulte Administración de memoria para controladores de Windows.
Nota
Si la llamada a la función ZwFreeVirtualMemory se produce en modo de usuario, debe usar el nombre "NtFreeVirtualMemory" en lugar de "ZwFreeVirtualMemory".
En el caso de las llamadas desde controladores en modo kernel, las versiones NtXxx y ZwXxx de una rutina de Servicios del sistema nativo de Windows se pueden comportar de forma diferente en la forma en que controlan e interpretan los parámetros de entrada. Para obtener más información sobre la relación entre las versiones NtXxx y ZwXxx de una rutina, vea Using Nt and Zw Versions of the Native System Services Routines.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 2000 |
Plataforma de destino | Universal |
Encabezado | ntifs.h (incluya Ntifs.h, Fltkernel.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Reglas de cumplimiento de DDI | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm) |