Função VirtualAllocEx (memoryapi.h)
Reserva, confirma ou altera o estado de uma região de memória dentro do espaço de endereço virtual de um processo especificado. A função inicializa a memória alocada a zero.
Para especificar o nó NUMA para a memória física, consulte VirtualAllocExNuma.
Sintaxe
LPVOID VirtualAllocEx(
[in] HANDLE hProcess,
[in, optional] LPVOID lpAddress,
[in] SIZE_T dwSize,
[in] DWORD flAllocationType,
[in] DWORD flProtect
);
Parâmetros
[in] hProcess
O identificador de um processo. A função aloca memória dentro do espaço de endereço virtual desse processo.
O identificador deve ter o acesso PROCESS_VM_OPERATION correto. Para obter mais informações, consulte Process Security and Access Rights.
[in, optional] lpAddress
O ponteiro que especifica um endereço inicial desejado para a região das páginas que você deseja alocar.
Se você estiver reservando memória, a função arredonda esse endereço para baixo para o múltiplo mais próximo da granularidade de alocação.
Se você estiver confirmando memória que já está reservada, a função arredonda esse endereço para baixo até o limite de página mais próximo. Para determinar o tamanho de uma página e a granularidade de alocação no computador host, use a função GetSystemInfo.
Se lpAddress for NULL, a função determinará onde alocar a região.
Se esse endereço estiver dentro de um enclave que você não inicializou chamando InitializeEnclave, VirtualAllocEx alocará uma página de zeros para o enclave nesse endereço. A página deve ser não confirmada anteriormente e não será medida com a instrução EEXTEND do modelo de programação extensões do Intel Software Guard.
Se o endereço em um enclave que você inicializou, a operação de alocação falhará com o erro ERROR_INVALID_ADDRESS. Isso é verdade para enclaves que não dão suporte ao gerenciamento dinâmico de memória (ou seja, SGX1). Os enclaves SGX2 permitirão a alocação e a página deve ser aceita pelo enclave depois de alocada.
[in] dwSize
O tamanho da região da memória a ser alocada, em bytes.
Se lpAddress for NULL, a função arredonda dwSize até o limite da próxima página.
Se lpAddress não for NULL, a função alocará todas as páginas que contêm um ou mais bytes no intervalo de lpAddress a lpAddress+dwSize. Isso significa, por exemplo, que um intervalo de 2 bytes que ultrapassa um limite de página faz com que a função aloque ambas as páginas.
[in] flAllocationType
O tipo de alocação de memória. Esse parâmetro deve conter um dos valores a seguir.
Esse parâmetro também pode especificar os valores a seguir, conforme indicado.
Valor | Significado |
---|---|
|
Aloca memória usando de suporte de página grande.
O tamanho e o alinhamento devem ser múltiplos do mínimo de página grande. Para obter esse valor, use a função GetLargePageMinimum. Se você especificar esse valor, também deverá especificar MEM_RESERVE e MEM_COMMIT. |
|
Reserva um intervalo de endereços que pode ser usado para mapear páginas do AWE ( de Extensões de Janela de Endereço).
Esse valor deve ser usado com MEM_RESERVE e nenhum outro valor. |
|
Aloca memória no endereço mais alto possível. Isso pode ser mais lento do que as alocações regulares, especialmente quando há muitas alocações. |
[in] flProtect
A proteção de memória para a região das páginas a ser alocada. Se as páginas estiverem sendo confirmadas, você poderá especificar qualquer uma das constantes de proteção de memória .
Se lpAddress especificar um endereço dentro de um enclave, flProtect não poderá ser nenhum dos seguintes valores:
- PAGE_NOACCESS
- PAGE_GUARD
- PAGE_NOCACHE
- PAGE_WRITECOMBINE
Ao alocar memória dinâmica para um enclave, o parâmetro flProtect deve ser PAGE_READWRITE ou PAGE_EXECUTE_READWRITE.
Valor de retorno
Se a função for bem-sucedida, o valor retornado será o endereço base da região alocada de páginas.
Se a função falhar, o valor retornado será NULL. Para obter informações de erro estendidas, chame GetLastError.
Observações
Cada página tem um estado de página associado. A função VirtualAllocEx pode executar as seguintes operações:
- Confirmar uma região de páginas reservadas
- Reservar uma região de páginas gratuitas
- Reservar e confirmar simultaneamente uma região de páginas gratuitas
Você pode usar VirtualAllocEx para reservar um bloco de páginas e, em seguida, fazer chamadas adicionais para VirtualAllocEx para confirmar páginas individuais do bloco reservado. Isso permite que um processo reserve um intervalo de seu espaço de endereço virtual sem consumir armazenamento físico até que seja necessário.
Se o parâmetro lpAddress não for NULL, a função usará os parâmetros lpAddress e dwSize para calcular a região das páginas a serem alocadas. O estado atual de todo o intervalo de páginas deve ser compatível com o tipo de alocação especificado pelo parâmetro
Para executar código gerado dinamicamente, use VirtualAllocEx para alocar memória e a função VirtualProtectEx para conceder acesso PAGE_EXECUTE.
A função
A função VirtualFreeEx pode descompromissar uma página confirmada, liberar o armazenamento da página ou descompromissar e liberar simultaneamente uma página confirmada. Ele também pode liberar uma página reservada, tornando-a uma página gratuita.
Ao criar 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 tiver sido definido em vigor. Caso contrário, as tentativas de executar código fora da região recém-executável podem produzir resultados imprevisíveis.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows XP [aplicativos da área de trabalho | Aplicativos UWP] |
servidor com suporte mínimo | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
da Plataforma de Destino |
Windows |
cabeçalho | memoryapi.h (inclua Windows.h, Memoryapi.h) |
biblioteca | onecore.lib |
de DLL |
Kernel32.dll |
Consulte também
Funções de gerenciamento de memória