Função VirtualAllocFromApp (memoryapi.h)
Reserva, confirma ou altera o estado de uma região de páginas no espaço de endereço virtual do processo de chamada. A memória alocada por essa função é inicializada automaticamente como zero.
Sintaxe
PVOID VirtualAllocFromApp(
[in, optional] PVOID BaseAddress,
[in] SIZE_T Size,
[in] ULONG AllocationType,
[in] ULONG Protection
);
Parâmetros
[in, optional] BaseAddress
O endereço inicial da região a ser alocada. Se a memória estiver sendo reservada, o endereço especificado será arredondado para baixo até o múltiplo mais próximo da granularidade de alocação. Se a memória já estiver reservada e estiver sendo confirmada, o endereço será arredondado para baixo até o limite da próxima página. Para determinar o tamanho de uma página e a granularidade de alocação no computador host, use a função GetSystemInfo . Se esse parâmetro for NULL, o sistema determinará onde alocar a região.
[in] Size
O tamanho da região, em bytes. Se o parâmetro BaseAddress for NULL, esse valor será arredondado para cima até o limite da próxima página. Caso contrário, as páginas alocadas incluem todas as páginas que contêm um ou mais bytes no intervalo de BaseAddress a BaseAddress+Size. Isso significa que um intervalo de 2 bytes que atravessa um limite de página faz com que ambas as páginas sejam incluídas na região alocada.
[in] AllocationType
O tipo de alocação de memória. Esse parâmetro deve conter um dos valores a seguir.
Valor | Significado |
---|---|
|
Aloca encargos de memória (do tamanho geral da memória e dos arquivos de paginação no disco) para as páginas de memória reservada especificadas. A função também garante que, quando o chamador acessar inicialmente a memória, o conteúdo será zero. As páginas físicas reais não são alocadas, a menos que/até que os endereços virtuais sejam realmente acessados.
Para reservar e confirmar páginas em uma etapa, chame VirtualAllocFromApp com A tentativa de confirmar um intervalo de endereços específico especificando MEM_COMMIT sem MEM_RESERVE e um BaseAddress não NULL falhará, a menos que todo o intervalo já tenha sido reservado. O código de erro resultante é ERROR_INVALID_ADDRESS. Uma tentativa de confirmar uma página que já está confirmada não faz com que a função falhe. Isso significa que você pode confirmar páginas sem primeiro determinar o estado de compromisso atual de cada página. |
|
Reserva um intervalo do espaço de endereço virtual do processo sem alocar nenhum armazenamento físico real na memória ou no arquivo de paginação no disco.
Você pode confirmar páginas reservadas em chamadas subsequentes para a função VirtualAllocFromApp . Para reservar e confirmar páginas em uma etapa, chame VirtualAllocFromApp com MEM_COMMIT | MEM_RESERVE. Outras funções de alocação de memória, como malloc e LocalAlloc, não podem usar um intervalo reservado de memória até que ela seja liberada. |
|
Indica que os dados no intervalo de memória especificado por BaseAddress e Size não são mais de interesse. As páginas não devem ser lidas ou gravadas no arquivo de paginação. No entanto, o bloco de memória será usado novamente mais tarde, portanto, ele não deve ser descompactado. Esse valor não pode ser usado com nenhum outro valor.
O uso desse valor não garante que o intervalo operado com MEM_RESET conterá zeros. Se você quiser que o intervalo contenha zeros, descomita a memória e, em seguida, recompacione-a. Quando você especifica MEM_RESET, a função VirtualAllocFromApp ignora o valor de Protection. No entanto, você ainda deve definir Proteção como um valor de proteção válido, como PAGE_NOACCESS. VirtualAllocFromApp retornará um erro se você usar MEM_RESET e o intervalo de memória for mapeado para um arquivo. Uma exibição compartilhada só será aceitável se ela for mapeada para um arquivo de paginação. |
|
MEM_RESET_UNDO só deve ser chamado em um intervalo de endereços ao qual MEM_RESET foi aplicado com êxito anteriormente. Indica que os dados no intervalo de memória especificado por BaseAddress e Size são de interesse do chamador e tenta reverter os efeitos de MEM_RESET. Se a função for bem-sucedida, isso significa que todos os dados no intervalo de endereços especificado estão intactos. Se a função falhar, pelo menos alguns dos dados no intervalo de endereços serão substituídos por zeros.
Esse valor não pode ser usado com nenhum outro valor. Se MEM_RESET_UNDO for chamado em um intervalo de endereços que não foi MEM_RESET anteriormente, o comportamento será indefinido. Quando você especifica MEM_RESET, a função VirtualAllocFromApp ignora o valor de Protection. No entanto, você ainda deve definir Proteção como um valor de proteção válido, como PAGE_NOACCESS. |
Esse parâmetro também pode especificar os valores a seguir, conforme indicado.
Valor | Significado |
---|---|
|
Aloca memória usando suporte de página grande.
O tamanho e o alinhamento devem ser um múltiplo 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 ( Address Windowing Extensions ).
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. |
|
Faz com que o sistema acompanhe as páginas gravadas na região alocada. Se você especificar esse valor, também deverá especificar MEM_RESERVE.
Para recuperar os endereços das páginas que foram gravadas desde que a região foi alocada ou o estado de acompanhamento de gravação foi redefinido, chame a função GetWriteWatch . Para redefinir o estado de rastreamento de gravação, chame GetWriteWatch ou ResetWriteWatch. O recurso de acompanhamento de gravação permanece habilitado para a região de memória até que a região seja liberada. |
[in] Protection
A proteção de memória para a região das páginas a serem alocadas. Se as páginas estiverem sendo confirmadas, você poderá especificar uma das constantes de proteção de memória. As seguintes constantes geram um erro:
- PAGE_EXECUTE
- PAGE_EXECUTE_READ
- PAGE_EXECUTE_READWRITE
- PAGE_EXECUTE_WRITECOPY
Valor retornado
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.
Comentários
Você pode chamar VirtualAllocFromApp de aplicativos da Windows Store com recursos JIT (Just-In-Time) para usar a funcionalidade JIT. O aplicativo deve incluir a funcionalidade codeGeneration no arquivo de manifesto do aplicativo para usar recursos JIT.
Cada página tem um estado de página associado. A função VirtualAllocFromApp 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 VirtualAllocFromApp para reservar um bloco de páginas e, em seguida, fazer chamadas adicionais para VirtualAllocFromApp 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 BaseAddress não for NULL, a função usará os parâmetros BaseAddress e Size 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 AllocationType . Caso contrário, a função falhará e nenhuma das páginas será alocada. Esse requisito de compatibilidade não impede a confirmação de uma página já confirmada, conforme mencionado anteriormente.
VirtualAllocFromApp não permite a criação de páginas executáveis.
A função VirtualAllocFromApp pode ser usada para reservar uma região de memória do AWE ( Extensões de Janela de Endereço ) dentro do espaço de endereço virtual de um processo especificado. Essa região de memória pode ser usada para mapear páginas físicas para dentro e para fora da memória virtual, conforme exigido pelo aplicativo. Os valores MEM_PHYSICAL e MEM_RESERVE devem ser definidos no parâmetro AllocationType . O valor MEM_COMMIT não deve ser definido. A proteção de página deve ser definida como PAGE_READWRITE.
A função VirtualFree pode descompromissar uma página confirmada, liberar o armazenamento da página ou descompromissar simultaneamente e liberar 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 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 10 [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2016 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | memoryapi.h (inclua Windows.h) |
Biblioteca | WindowsApp.lib |
DLL | Kernel32.dll |
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de