Compartir a través de


Función ZwAllocateVirtualMemory (ntifs.h)

El ZwAllocateVirtualMemory reservas rutinarias, confirmaciones 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 esNULL, 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 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 alto 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.

Bandera Significado
MEM_COMMIT La región especificada de páginas se va a confirmar. Se debe establecer uno de MEM_COMMIT, MEM_RESET o MEM_RESERVE.
MEM_PHYSICAL Asignar memoria física. Esta marca solo se usa con la memoria de extensiones de ventanas de direcciones (AWE). Si se establece MEM_PHYSICAL, también se debe establecer MEM_RESERVE, no se pueden establecer otras marcas 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 incorporan páginas de ceros. Si las páginas están en memoria y se modifican, se marcan como no modificadas para que no se escriban en el archivo de paginación. El contenido no ceros. No se usa el parámetro Protect, 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.

Bandera Significado
PAGE_NOACCESS No se permite ningún acceso a la región confirmada de 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 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 páginas. Un intento de escribir 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 páginas.
PAGE_GUARD Las páginas de la región se convierten en páginas de protección. Cualquier intento de leer o escribir 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ágina, válido solo cuando se usa con una de las marcas de protección de página que no sean PAGE_NOACCESS. Cuando un intento de acceso lleva al sistema a desactivar el estado de la página de protección, la protección de páginas subyacente toma el control. 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 noquecheable. 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ágina, válido solo cuando se usa con una de las marcas de protección de página que no sean PAGE_NOACCESS.

Valor devuelto

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

Observaciones

ZwAllocateVirtualMemory puede realizar las siguientes operaciones:

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

  • Reserva 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 aplicaciones en el proceso especificado y, a continuación, realizar llamadas adicionales a ZwAllocateVirtualMemory confirmar páginas individuales desde el intervalo reservado. Esto permite que un proceso reserve un intervalo de su espacio de direcciones virtual 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.

Estado Significado
GRATIS 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.
RESERVADO 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, lo que lo convierte en una página gratuita.
COMPROMETIDO El almacenamiento físico 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 al intentar leer o escribir en esa página. Cuando finaliza el proceso, el sistema libera el almacenamiento para 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 la función no producirá un error. ZwFreeVirtualMemory puede descommitir una página confirmada, liberar el almacenamiento de la página o 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 al ZwAllocateVirtualMemory función 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 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)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL PASSIVE_LEVEL
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

Consulte también

usar versiones Nt y Zw de las rutinas de servicios del sistema nativo

ZwFreeVirtualMemory