Función ZwFreeVirtualMemory (ntifs.h)
El ZwFreeVirtualMemory versiones rutinarias, descommits 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 libre de páginas.
Si la marca MEM_RELEASE está establecida 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 MEM_RELEASE está establecida 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 MEM_DECOMMIT se establece en el parámetro freeType
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. Los valores posibles son los siguientes:
MEM_DECOMMIT
ZwFreeVirtualMemory descommita la región especificada de las páginas. Las páginas entran en el estado reservado.
ZwFreeVirtualMemory no falla si intenta descommitar una página no confirmada. 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 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 descommite y, a continuación, las libera.
ZwFreeVirtualMemory no produce un error si intenta liberar páginas que están en diferentes estados, algunas reservadas y algunas 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. Entre los códigos de estado de error posibles se incluyen los siguientes:
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 |
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. |
Observaciones
Cada página del espacio de direcciones virtuales del proceso se encuentra en uno de los tres estados descritos de la manera siguiente.
El estado es GRATIS
La página no se confirma ni está 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 RESERVED
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 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 para 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 están en estado libre.
- Descommita y libera una región de páginas confirmadas o no confirmadas. Después de esta operación, las páginas están en 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 descommitir 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. El intervalo completo de páginas reservadas originalmente por ZwAllocateVirtualMemory debe liberarse 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 puede 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 con la administración de memoria para controladores en modo kernel, consulte Administración de memoria para controladores de Windows.
Nota
Si la llamada a la función
En el caso de las llamadas desde controladores en modo kernel, las NtXxx y Zwversiones de Xxx de una rutina de Servicios del sistema nativo de Windows pueden comportarse 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 de NtXxx y ZwXxx de una rutina, vea Using Nt and Zw Versions of the Native System Services Routines.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows 2000 |
de la plataforma de destino de |
Universal |
encabezado de |
ntifs.h (incluya Ntifs.h, Fltkernel.h) |
biblioteca de |
NtosKrnl.lib |
DLL de |
NtosKrnl.exe |
irQL | PASSIVE_LEVEL |
reglas de cumplimiento de DDI | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm) |