Função VirtualProtect (memoryapi.h)
Altera a proteção em uma região de páginas confirmadas no espaço de endereço virtual do processo de chamada.
Para alterar a proteção de acesso de qualquer processo, use a função VirtualProtectEx .
Sintaxe
BOOL VirtualProtect(
[in] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flNewProtect,
[out] PDWORD lpflOldProtect
);
Parâmetros
[in] lpAddress
O endereço da página inicial da região de páginas cujos atributos de proteção de acesso devem ser alterados.
Todas as páginas na região especificada devem estar dentro da mesma região reservada alocada ao chamar a função VirtualAlloc ou VirtualAllocEx usando MEM_RESERVE. As páginas não podem abranger regiões reservadas adjacentes alocadas por chamadas separadas para VirtualAlloc ou VirtualAllocEx usando MEM_RESERVE.
[in] dwSize
O tamanho da região cujos atributos de proteção de acesso devem ser alterados, em bytes. A região das páginas afetadas inclui todas as páginas que contêm um ou mais bytes no intervalo do parâmetro lpAddress até (lpAddress+dwSize)
. Isso significa que um intervalo de 2 bytes que atravessa um limite de página faz com que os atributos de proteção de ambas as páginas sejam alterados.
[in] flNewProtect
A opção de proteção de memória. Esse parâmetro pode ser uma das constantes de proteção de memória.
Para exibições mapeadas, esse valor deve ser compatível com a proteção de acesso especificada quando a exibição foi mapeada (consulte MapViewOfFile, MapViewOfFileEx e MapViewOfFileExNuma).
[out] lpflOldProtect
Um ponteiro para uma variável que recebe o valor de proteção de acesso anterior da primeira página na região de páginas especificada. Se esse parâmetro for NULL ou não apontar para uma variável válida, a função falhará.
Valor retornado
Se a função for bem-sucedida, o valor retornado será diferente de zero.
Se a função falhar, o valor retornado será zero. Para obter informações de erro estendidas, chame GetLastError.
Comentários
Você pode definir o valor de proteção de acesso somente em páginas confirmadas. Se o estado de qualquer página na região especificada não for confirmado, a função falhará e retornará sem modificar a proteção de acesso de nenhuma página na região especificada.
O modificador de proteção PAGE_GUARD estabelece páginas de proteção. As páginas de proteção atuam como alarmes de acesso único. Para obter mais informações, consulte Criando páginas de proteção.
É melhor evitar usar o VirtualProtect para alterar as proteções de página em blocos de memória alocados por GlobalAlloc, HeapAlloc ou LocalAlloc, pois vários blocos de memória podem existir em uma única página. O gerenciador de heap pressupõe que todas as páginas no heap concedam pelo menos acesso de leitura e gravação.
Ao proteger uma região que será executável, o programa de chamada é responsável por garantir a coerência do cache por meio de uma chamada apropriada para FlushInstructionCache depois que o código for definido em vigor. Caso contrário, as tentativas de executar o código fora da região executável recentemente podem produzir resultados imprevisíveis.
Requisitos
Cliente mínimo com suporte | Windows XP [aplicativos da área de trabalho | aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | memoryapi.h (inclua Windows.h, Memoryapi.h) |
Biblioteca | onecore.lib |
DLL | Kernel32.dll |
Confira também
Funções de gerenciamento da memória