winbase.h


VirtualProtect

La función VirtualProtect cambia la protección de acceso en una región de páginas acomodadas en el espacio de direcciones virtual del proceso que la llama. Esta función se diferencia de VirtualProtectEx, en que esta cambia la protección de acceso de cualquier proceso.

Sintaxis

BOOL VirtualProtect(
    LPVOID lpAddress,      // dirección de la región de páginas acomodadas
    DWORD dwSize,          // tamaño de la región
    DWORD flNewProtect,    // protección de acceso deseada
    PDWORD lpflOldProtect  // dirección de la variable para obtener la protección anterior
   );

Parámetros

lpAddress: apunta a la dirección base de la región de páginas cuyos atributos de acceso serán modificados.

Todas las páginas en la región especificada deben haber sido acomodadas en una única llamada a las funciones VirtualAlloc o VirtualAllocEx. Las páginas no pueden ocupar regiones adyacentes que hayan sido acomodadas por llamadas separadas a VirtualAlloc o VirtualAllocEx.

dwSize: especifica el tamaño, en bytes, de la región cuyos atributos de acceso serán modificados. La región de páginas afectadas incluye todas las páginas que contengan uno o más bytes en el rango entre el parámetro lpAddress a (lpAddress+dwSize). Esto significa que un rango de dos bytes a caballo entre dos páginas hace que los atributos de protección se ambas páginas sean modificados.

flNewProtect: especifica la nueva protección de acceso. Se puede especificar cualquiera de las siguientes banderas, junto con las banderas de protección modificadoras PAGE_GUARD y PAGE_NOCACHE, como sea necesario:

Valor 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 lectura 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_WRITECOPY Proporciona el acceso copiar-en-lectura (copy-on-write) a la región de páginas asignadas.
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_EXECUTE_WRITECOPY Permite acceso de ejecuciónr, lectura y escritura a las páginas de la región asignada. Las páginas son de lectura-en-escritura (read-on-write) y copia-en-escritura (copy-on-write).
PAGE_GUARD Las páginas de la región se convierten en protegidas. Cualquier intento de acceso a 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.

lpflOldProtect: apunta a una variable a la que la función asigna el valor previo de la protección de acceso de la primera página de la región de páginas especificada. Si este parámetro es NULL o no apunta a una variable válida, la función falla.

Valor de retorno

Si la función tiene éxito, el valor de retorno es distinto de cero.

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

Observaciones

Sólo se puede modificar la protección de acceso de páginas acomodadas. Si el estado de cualquier página en la región especificada no es el de acomodada, la función falla y regresa sin modificar la protección de acceso de ninguna de las páginas en la región especificada.

La función VirtualProtect modifica la protección de acceso de memoria del proceso que la invoca, y la función VirtualProtectEx cambia la protección de acceso de memoria del proceso especificado.

La bandera modificadora de protección PAGE_GUARD establece páginas protegidas. Las páginas protegidas actúan como alarmas de un acceso.