Función NtFreeVirtualMemory (ntifs.h)

La rutina NtFreeVirtualMemory libera, descommite o ambas versiones y descommite, una región de páginas dentro del espacio de direcciones virtuales de un proceso especificado.

Sintaxis

__kernel_entry NTSYSCALLAPI NTSTATUS NtFreeVirtualMemory(
  [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 base de la región de páginas libres.

Si la marca MEM_RELEASE se establece en el parámetro FreeType , *BaseAddress debe ser la dirección base devuelta por NtAllocateVirtualMemory 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 se establece en *FreeType, *RegionSize debe ser cero. NtFreeVirtualMemory libera toda la región reservada en la llamada de asignación inicial a NtAllocateVirtualMemory.

Si la marca MEM_DECOMMIT se establece en *FreeType, NtFreeVirtualMemory descommite todas las páginas de memoria que contienen uno o más bytes en el intervalo de *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, se descommiten ambas páginas.

NtFreeVirtualMemory descommite toda la región reservada por NtAllocateVirtualMemory. 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 NtAllocateVirtualMemory 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 NtFreeVirtualMemory realizará para la región especificada de páginas. Los valores posibles se enumeran en la tabla siguiente.

Marca Significado
MEM_DECOMMIT NtFreeVirtualMemory descommite la región especificada de las páginas. Las páginas especifican el estado reservado. NtFreeVirtualMemory no produce un error si intenta anular la confirmación de 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 NtFreeVirtualMemory liberará la región especificada de páginas. Las páginas entran en el estado libre. Si especifica esta marca, RegionSize debe ser cero y BaseAddress debe apuntar a la dirección base devuelta por NtAllocateVirtualMemory cuando se reservó la región. NtFreeVirtualMemory produce un error si no se cumple alguna de estas condiciones. Si las páginas de la región se confirman actualmente, NtFreeVirtualMemory primero descommite y, a continuación, las libera. NtFreeVirtualMemory 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 su estado de compromiso actual.

Valor devuelto

NtFreeVirtualMemory devuelve STATUS_SUCCESS o un código de estado de error. Entre los posibles códigos de estado de error 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 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 en la tabla siguiente.

State Significado
FREE La página no se confirma ni se reserva. 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 NtFreeVirtualMemory para colocar páginas reservadas o confirmadas en el estado libre.
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. Si se intenta leer o escribir en una página reservada, se produce una excepción de infracción de acceso. Puede usar NtFreeVirtualMemory para colocar las páginas de memoria confirmadas en el estado reservado y colocar páginas de memoria reservadas en el estado libre.
COMPROMETIDO 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 NtAllocateVirtualMemory para colocar páginas de memoria confirmadas en el estado reservado o libre.

NtFreeVirtualMemory 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.

NtFreeVirtualMemory puede descommitar un intervalo de páginas que se encuentran en diferentes estados, algunos confirmados y algunos no confirmados. Esto significa que puede anular la confirmación de un intervalo de páginas sin determinar primero el estado de compromiso actual de cada página. Al anular la confirmación de 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 NtAllocateVirtualMemory para confirmarlo o NtFreeVirtualMemory para liberarlo. Si se intenta leer o escribir en una página reservada, se produce una excepción de infracción de acceso.

NtFreeVirtualMemory 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 NtAllocateVirtualMemory debe liberarse al mismo tiempo.

Si se libera una página, su estado cambia a libre 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 NtFreeVirtualMemory 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 Windows Native System Services 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 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, PowerIrpDDis

Consulte también

NtAllocateVirtualMemory