winbase.h


VirtualAlloc

La función VirtualAlloc reserva o asigna una región de páginas del espacio de direcciones virtual del proceso que la invoca. La memoria obtenida por esta función es automáticamente inicializada a cero.

Sintaxis

LPVOID VirtualAlloc(
    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

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 hacia arriba al siguiente límite de página. En caso contrario, 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.
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.
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. Las páginas reservadas pueden ser asignadas en llamadas posteriores a VirtualAlloc.
MEM_TOP_DOWN Acomoda memoria en la dirección más alta posible.

flProtect: especifica el tipo de protección de acceso. Si las páginas van a ser asignadas, 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ña 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 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 normal 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

VirtualAlloc puede realizar las operaciones siguientes:

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

Se puede usar VirtualAlloc para reservar un bloque de páginas y después hacer llamadas adicionales a VirtualAlloc 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. VirtualAlloc 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. VirtualAlloc puede asignar una página reservada, pero no la puede reservar una segunda vez. La función VirtualFree puede liberar una página reservada, 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. VirtualAlloc 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á. VirtualFree puede desasignar una página asignada, 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.