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