Función ZwAllocateVirtualMemory (ntifs.h)

La rutina ZwAllocateVirtualMemory reserva, confirma o ambas, una región de páginas dentro del espacio de direcciones virtuales en modo de usuario de un proceso especificado.

Sintaxis

NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
  [in]      HANDLE    ProcessHandle,
  [in, out] PVOID     *BaseAddress,
  [in]      ULONG_PTR ZeroBits,
  [in, out] PSIZE_T   RegionSize,
  [in]      ULONG     AllocationType,
  [in]      ULONG     Protect
);

Parámetros

[in] ProcessHandle

Identificador del proceso para el que se debe realizar la asignación. 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 base de la región asignada de páginas. Si el valor inicial de este parámetro no es NULL, la región se asigna a partir de la dirección virtual especificada redondeada hacia abajo hasta el siguiente límite de dirección de tamaño de página del host. Si el valor inicial de este parámetro es NULL, el sistema operativo determinará dónde asignar la región.

[in] ZeroBits

Número de bits de dirección de orden superior que deben ser cero en la dirección base de la vista de sección. Este valor debe ser menor que 21 y solo se usa cuando el sistema operativo determina dónde asignar la región, como cuando BaseAddress es NULL.

[in, out] RegionSize

Puntero a una variable que recibirá el tamaño real, en bytes, de la región asignada de páginas. El valor inicial de este parámetro especifica el tamaño, en bytes, de la región y se redondea hasta el siguiente límite de tamaño de página host. *RegionSize no puede ser cero en la entrada.

[in] AllocationType

Máscara de bits que contiene marcas que especifican el tipo de asignación que se va a realizar. En la tabla siguiente se describen estas marcas.

Marca Significado
MEM_COMMIT La región especificada de páginas se confirmará. Se debe establecer uno de MEM_COMMIT, MEM_RESET o MEM_RESERVE.
MEM_PHYSICAL Asigne memoria física. Esta marca se usa únicamente con la memoria de extensiones de ventanas de direcciones (AWE). Si se establece MEM_PHYSICAL, también se debe establecer MEM_RESERVE, no se puede establecer ninguna otra marca y Proteger debe establecerse en PAGE_READWRITE.
MEM_RESERVE La región especificada de páginas se va a reservar. Se debe establecer uno de MEM_COMMIT, MEM_RESET o MEM_RESERVE.
MEM_RESET Restablezca el estado de la región especificada para que, si las páginas están en el archivo de paginación, se descartan y se introducen páginas de ceros. Si las páginas están en memoria y modificadas, se marcan como no modificadas para que no se escriban en el archivo de paginación. El contenido no está cero. El parámetro Protect no se usa, pero debe establecerse en un valor válido. Se debe establecer uno de MEM_COMMIT, MEM_RESET o MEM_RESERVE; si se establece MEM_RESET, no se puede establecer ninguna otra marca.
MEM_TOP_DOWN La región especificada debe crearse en la dirección virtual más alta posible en función de ZeroBits.

[in] Protect

Máscara de bits que contiene marcas de protección de páginas que especifican la protección deseada para la región confirmada de páginas. En la tabla siguiente se describen estas marcas.

Marca Significado
PAGE_NOACCESS No se permite ningún acceso a la región confirmada de las páginas. Un intento de leer, escribir o ejecutar la región confirmada produce una excepción de infracción de acceso, denominada error de protección general (GP).
PAGE_READONLY Se permite el acceso de solo lectura y ejecución a la región confirmada de páginas. Un intento de escribir la región confirmada produce una infracción de acceso.
PAGE_READWRITE Se permite el acceso de lectura, escritura y ejecución a la región confirmada de páginas. Si se permite el acceso de escritura a la sección subyacente, se comparte una sola copia de las páginas. De lo contrario, las páginas se comparten de solo lectura o copia en escritura.
PAGE_EXECUTE Se permite ejecutar el acceso a la región confirmada de las páginas. Un intento de leer o escribir en la región confirmada produce una infracción de acceso.
PAGE_EXECUTE_READ Se permite el acceso de ejecución y lectura a la región confirmada de las páginas. Un intento de escritura en la región confirmada produce una infracción de acceso.
PAGE_EXECUTE_READWRITE Se permite el acceso de ejecución, lectura y escritura a la región confirmada de las páginas.
PAGE_GUARD Las páginas de la región se convierten en páginas de protección. Cualquier intento de lectura o escritura en una página de protección hace que el sistema genere una excepción de STATUS_GUARD_PAGE. Por lo tanto, las páginas de protección actúan como una alarma de acceso único. Esta marca es un modificador de protección de páginas, válido solo cuando se usa con una de las marcas de protección de páginas distintas de PAGE_NOACCESS. Cuando un intento de acceso conduce al sistema a desactivar el estado de la página de protección, la protección de página subyacente se hace cargo. Si se produce una excepción de página de protección durante un servicio del sistema, el servicio normalmente devuelve un indicador de estado de error.
PAGE_NOCACHE La región de las páginas debe asignarse como no accesible. PAGE_NOCACHE no se permite para las secciones.
PAGE_WRITECOMBINE Habilita la combinación de escritura, es decir, la fusión de escrituras de la memoria caché a la memoria principal, donde el hardware lo admite. Esta marca se usa principalmente para la memoria del búfer de fotogramas para que las escrituras en la misma línea de caché se combinen siempre que sea posible antes de escribirse en el dispositivo. Esto puede reducir considerablemente las escrituras en el bus a la memoria de vídeo (por ejemplo). Si el hardware no admite la combinación de escritura, se omite la marca. Esta marca es un modificador de protección de páginas, válido solo cuando se usa con una de las marcas de protección de páginas distintas de PAGE_NOACCESS.

Valor devuelto

ZwAllocateVirtualMemory devuelve STATUS_SUCCESS o un código de estado de error. Entre los posibles códigos de estado de error se incluyen los siguientes:

Comentarios

ZwAllocateVirtualMemory puede realizar las siguientes operaciones:

  • Confirme una región de páginas reservadas por una llamada anterior a ZwAllocateVirtualMemory.

  • Reserve una región de páginas gratuitas.

  • Reserve y confirme una región de páginas gratuitas.

Los controladores en modo kernel pueden usar ZwAllocateVirtualMemory para reservar un intervalo de direcciones virtuales accesibles para la aplicación en el proceso especificado y, a continuación, realizar llamadas adicionales a ZwAllocateVirtualMemory para confirmar páginas individuales desde el intervalo reservado. Esto permite que un proceso reserve un intervalo de su espacio de direcciones virtuales sin consumir almacenamiento físico hasta que sea necesario.

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 está confirmada o reservada y no es accesible para el proceso. ZwAllocateVirtualMemory puede reservar, o reservar y confirmar simultáneamente, una página gratuita.
RESERVED Otras funciones de asignación no pueden usar el intervalo de direcciones, pero la página no es accesible para el proceso y no tiene ningún almacenamiento físico asociado. ZwAllocateVirtualMemory puede confirmar una página reservada, pero no puede reservarla una segunda vez. ZwFreeVirtualMemory puede liberar una página reservada, por lo que es una página gratuita.
COMPROMETIDO El almacenamiento físico se asigna a 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 el proceso, el sistema libera el almacenamiento de las páginas confirmadas. ZwAllocateVirtualMemory puede confirmar una página ya confirmada. Esto significa que puede confirmar un intervalo de páginas, independientemente de si ya se han confirmado y no se producirá un error en la función. ZwFreeVirtualMemory puede descommitir una página confirmada, liberar el almacenamiento de la página o puede descommitir y liberar simultáneamente una página confirmada.

La memoria asignada mediante una llamada a ZwAllocateVirtualMemory debe liberarse llamando a ZwFreeVirtualMemory.

Para obtener más información sobre la administración de memoria, consulte Administración de memoria para controladores de Windows.

Nota

Si la llamada a la función ZwAllocateVirtualMemory se produce en modo de usuario, debe usar el nombre "NtAllocateVirtualMemory" en lugar de "ZwAllocateVirtualMemory".

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)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Reglas de cumplimiento de DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

Consulte también

Uso de las versiones Nt y Zw de las rutinas nativas de System Services

ZwFreeVirtualMemory