winbase.h


VirtualAllocEx

[Nuevo - Windows NT]

La función VirtualAllocEx reserva, asigna o ambas cosas, una región de páginas del espacio de direcciones virtual del proceso que la invoca. Esta función inicializada la memoria ubicada a cero.

Sintaxis

LPVOID VirtualAllocEx(
    HANDLE hProcess,         // proceso en el que se obtendrá la memoria
    LPVOID lpAddress,        // dirección de la región a reservar o asignar
    DWORD dwSize,            // tamaño de la región
    DWORD flAllocationType,  // tipo de petición
    DWORD flProtect          // tipo de protección de acceso
   );

Parámetros

hProcess: manipulador de proceso. La función ubica memoria dentro del espacio virtual de direcciones de este proceso.

Se debe tener el acceso PROCESS_VM_OPERATION para el proceso. So no se tiene, la función falla.

lpAddress: especifica la dirección de comienzo deseada de la región a acomodar.

Si la memoria va a ser reservada, la dirección especificada es redondeada a la baja al siguiente límite de 64 kilobytes.

Si la memoria ya está reservada y va a ser asignada, la dirección se redondea a la baja al siguiente límite de página. Para determinar el tamaño de una página del ordenador anfitrión, usar la función GetSystemInfo.

Si este parámetro es NULL, el sistema determina el lugar en que se acomodará la región.

dwSize: especifica el tamaño, en bytes, de la región.

Si el parámetro lpAddress es NULL, este valor se redondea dwSize hacia arriba al siguiente límite de página.

Si lpAddress no es NULL, las páginas acomodadas incluyen todas las páginas que contengan uno o más bytes en el rango de lpAddress a (lpAddress+dwSize). Esto significa que un rango de dos bytes a caballo entre dos límites de página hace que ambas página se incluyan en la región acomodada.

flAllocationType: especifica el tipo de acomodo. Se puede especificar cualquier combinación de las siguientes banderas:

Bandera Significado
MEM_COMMIT Acomoda almacenamiento físico en memoria o en el fichero de paginación de disco para la región especificada de páginas. La función inicializa esta memoria a cero.
Un intento de asignar una página ya asignada no hará que la función falle. Esto significa que un rango de páginas asignadas o liberadas puede ser asignado sin tener que preocuparse de algún fallo.
Si una página de memoria no está ya reservada, activar esta bandera hace que la función reserve y asigne la página de memoria.
MEM_RESERVE Reserva un rango del espacio de direcciones virtual del proceso sin asignar almacenamiento físico.
El rango reservado no puede ser usado por otra operación de acomodo (la función malloc, LocalAlloc, etc) hasta que sea liberado.
MEM_TOP_DOWN Acomoda memoria en la dirección más alta posible.

flProtect: un conjunto de bits de bandera que especifican la protección de acceso para la región de páginas que se están asignando. Se puede especificar una cualquiera de las siguientes banderas, junto con los modificadores de protección PAGE_GUARD y PAGE_NOCACHE, como se desee:

Bandera Significado
PAGE_READONLY Permite el acceso de lectura en las páginas de la región asignadas. Un intento de escribir en la región asignada producirá una violación de acceso. Si el sistema diferencia entre acceso de sólo lectua y acceso de ejecución, un intento de ejecutar código en la región asignada también producirá una violación de acceso.
PAGE_READWRITE Permite tanto el acceso de lectura como el de escritura en las páginas de la región asignada.
PAGE_EXECUTE Permite el acceso de ejecución en las páginas de la región asignada. Un intento de leer o escribir en la región asignada provocará una violación de acceso.
PAGE_EXECUTE_READ Permite el acceso de ejecución y lectura en las páginas de la región asignda. Un intento de escribir en la región asignada provocará una violación de acceso.
PAGE_EXECUTE_READWRITE Permite el acceso de ejecución, lectura y escritura en las páginas de la región asignada.
PAGE_GUARD Las páginas de la región se convierten en protegidas. Cualquier intento de leer desde o de escribir en una página protegida hace que el sistema operativo lance una excepción STATUS_GUARD_PAGE y desactive el estado de página protegida. De este modo, las páginas protegidas se comportan como alarma de un único acceso.
La bandera PAGE_GUARD es un modificador de protección de página. Las aplicaciones la usan con cualquiera de las otras banderas de protección, con una excepción: no puede ser usada con PAGE_NOACCESS. Cuando un acceso intenta obligar al sistema operativo a desactivar el estado de página protegida, la protección de página subyacente se activa.
Si ocurre una excepción de protección de página durante un servicio del sistema, el servicio generalmente regresa con un indicador de estado de fallo.
PAGE_NOACCESS Desactiva todos los accesos en las páginas de la región asignada. Cualquier intento de leer desde, escribir o ejecutar en la región asignada provocará una excepción de violación de acceso, llamada un fallo de protección general (GP).
PAGE_NOCACHE Permite no "cachear" las páginas de la región asignada. Los atributos del hardware para la memoria física deben ser especificadas como "no cache". Esto no se recomienda para uso general. Es frecuente para manejadores de dispositivos; por ejemplo, mapear un buffer de cuadros de video sin caché. Esta bandera es un modificador de protección de página, válido sólo cuando se usa con una de las protecciones de páginas que no sean PAGE_NOACCESS.

Valor de retorno

Si la función tiene éxito, el valor de retorno es la dirección base de las páginas de la región acomodada.

Si la función falla, el valor de retorno es NULL. Para obtener información más detallada sobre el error, llamar a la función GetLastError.

Observaciones

VirtualAllocEx puede realizar las operaciones siguientes:

  • Asignar una región de páginas reservadas por una llamada previa a la función VirtualAllocEx.
  • Reservar una región de páginas libres.
  • Reservar y asignar una región de páginas libres.

Se puede usar VirtualAllocEx para reservar un bloque de páginas y después hacer llamadas adicionales a VirtualAllocEx para asignar páginas del bloque reservado. Esto permite a un proceso reservar un rango de su espacio de direcciones virtuales sin consumir almacenamiento físico hasta que sea necesario.

Cada página en el espacio de direcciones virtual del proceso está en uno de estos tres estados:

Estado Significado
Libre La página no está asignada ni reservada y no es accesible para el proceso. VirtualAllocEx puede reservar o reservar y asignar simultáneamente, una página libre.
Reservada El rango de direcciones no puede ser usado por otras funciones de acomodo, pero la página no es accesible y no tiene almacenamiento físico asociado con ella. VirtualAllocEx puede asignar una página reservada, pero no la puede reservar una segunda vez. Se puede usar la función VirtualFreeEx para liberar una página reservada en un proceso especificado, convirtiéndola en una página libre.
Asignada Hay almacenamiento físico asignado para esta página, y el acceso está controlado por un código de protección. El sistema inicializa y carga cada página asignada en memoria física sólo en el primer intento de lectura o escritura de la página. Cuando el proceso termina, el sistema libera el almacenamiento de las páginas asignadas. VirtualAllocEx puede asignar una página previamente asignada. Esto significa que se puede asignar un rango de páginas, a pesar de que estén ya asignadas, y la función no fallará. VirtualFreeEx puede desasignar una página asignada en un proceso especificado, liberando su almacenamiento, o puede desasignarla y liberarla simultáneamente.

Si el parámetro lpAddress no es NULL, la función usa los parámetros lpAddress y dwSize para calcular la región de páginas a ubicar. El estado actual del rango completo de páginas debe ser compatible con el tipo de ubicación especificado por el parámetro flAllocationType. En caso contrario, la función falla y ninguna de las páginas será ubicada. Este requisito de compatibilidad no excluye una página previamente asignada; ver la lista anterior.

El modificador de protección PAGE_GUARD establece páginas protegidas. Las páginas protegidas se comportan como alarmas de acceso de un acceso.