Função ZwAllocateVirtualMemory (ntifs.h)
O ZwAllocateVirtualMemory reservas de rotina, confirmações ou ambas, uma região de páginas dentro do espaço de endereço virtual no modo de usuário de um processo especificado.
Sintaxe
NTSYSAPI NTSTATUS ZwAllocateVirtualMemory(
[in] HANDLE ProcessHandle,
[in, out] PVOID *BaseAddress,
[in] ULONG_PTR ZeroBits,
[in, out] PSIZE_T RegionSize,
[in] ULONG AllocationType,
[in] ULONG Protect
);
Parâmetros
[in] ProcessHandle
Um identificador para o processo para o qual o mapeamento deve ser feito. Use a macro NtCurrentProcess, definida em Ntddk.h, para especificar o processo atual.
[in, out] BaseAddress
Um ponteiro para uma variável que receberá o endereço base da região alocada de páginas. Se o valor inicial desse parâmetro não forNULL, a região será alocada a partir do endereço virtual especificado arredondado para o próximo limite de endereço de tamanho de página do host. Se o valor inicial desse parâmetro for NULL, o sistema operacional determinará onde alocar a região.
[in] ZeroBits
O número de bits de endereço de ordem alta que devem ser zero no endereço base do modo de exibição de seção. Esse valor deve ser menor que 21 e é usado somente quando o sistema operacional determina onde alocar a região, como quando BaseAddress é NULL.
[in, out] RegionSize
Um ponteiro para uma variável que receberá o tamanho real, em bytes, da região alocada de páginas. O valor inicial desse parâmetro especifica o tamanho, em bytes, da região e é arredondado para o próximo limite de tamanho da página do host. * RegionSize não pode ser zero na entrada.
[in] AllocationType
Uma máscara de bits que contém sinalizadores que especificam o tipo de alocação a ser executada. A tabela a seguir descreve esses sinalizadores.
Bandeira | Significado |
---|---|
MEM_COMMIT | A região de páginas especificada deve ser confirmada. Um dos MEM_COMMIT, MEM_RESET ou MEM_RESERVE deve ser definido. |
MEM_PHYSICAL | Alocar memória física. Esse sinalizador é usado exclusivamente com memória AWE (Extensões de Janela de Endereço). Se MEM_PHYSICAL estiver definido, MEM_RESERVE também deverá ser definido, nenhum outro sinalizador poderá ser definido e Proteger deverá ser definido como PAGE_READWRITE. |
MEM_RESERVE | A região de páginas especificada deve ser reservada. Um dos MEM_COMMIT, MEM_RESET ou MEM_RESERVE deve ser definido. |
MEM_RESET | Redefina o estado da região especificada para que, se as páginas estiverem no arquivo de paginação, elas sejam descartadas e páginas de zeros sejam trazidas. Se as páginas estiverem na memória e modificadas, elas serão marcadas como não modificadas para que não sejam gravadas no arquivo de paginação. O conteúdo não zero. O parâmetro Protect não é usado, mas deve ser definido como um valor válido. Um dos MEM_COMMIT, MEM_RESET ou MEM_RESERVE deve ser definido; se MEM_RESET estiver definido, nenhum outro sinalizador poderá ser definido. |
MEM_TOP_DOWN | A região especificada deve ser criada no endereço virtual mais alto possível com base em zerobits. |
[in] Protect
Uma máscara de bits que contém sinalizadores de proteção de página que especificam a proteção desejada para a região confirmada das páginas. A tabela a seguir descreve esses sinalizadores.
Bandeira | Significado |
---|---|
PAGE_NOACCESS | Nenhum acesso à região confirmada de páginas é permitido. Uma tentativa de ler, gravar ou executar a região confirmada resulta em uma exceção de violação de acesso, chamada de falha de GP (proteção geral). |
PAGE_READONLY | O acesso somente leitura e execução à região confirmada de páginas é permitido. Uma tentativa de gravar a região confirmada resulta em uma violação de acesso. |
PAGE_READWRITE | O acesso de leitura, gravação e execução à região confirmada de páginas é permitido. Se o acesso de gravação à seção subjacente for permitido, uma única cópia das páginas será compartilhada. Caso contrário, as páginas são compartilhadas somente leitura/cópia na gravação. |
PAGE_EXECUTE | É permitido executar o acesso à região confirmada das páginas. Uma tentativa de ler ou gravar na região confirmada resulta em uma violação de acesso. |
PAGE_EXECUTE_READ | É permitido executar e ler o acesso à região confirmada das páginas. Uma tentativa de gravar na região confirmada resulta em uma violação de acesso. |
PAGE_EXECUTE_READWRITE | O acesso de execução, leitura e gravação à região confirmada das páginas é permitido. |
PAGE_GUARD | As páginas na região se tornam páginas de proteção. Qualquer tentativa de ler ou gravar em uma página de proteção faz com que o sistema gere uma exceção STATUS_GUARD_PAGE. As páginas de proteção, portanto, atuam como um alarme de acesso de um tiro. Esse sinalizador é um modificador de proteção de página, válido somente quando usado com um dos sinalizadores de proteção de página diferente de PAGE_NOACCESS. Quando uma tentativa de acesso leva o sistema a desativar o status da página de proteção, a proteção de página subjacente assume o controle. Se ocorrer uma exceção de página de proteção durante um serviço do sistema, o serviço normalmente retornará um indicador de status de falha. |
PAGE_NOCACHE | A região das páginas deve ser alocada como inconsequente. PAGE_NOCACHE não é permitido para seções. |
PAGE_WRITECOMBINE | Permite a combinação de gravação, ou seja, a coalescing de gravações do cache para a memória principal, em que o hardware dá suporte a ela. Esse sinalizador é usado principalmente para memória de buffer de quadro para que as gravações na mesma linha de cache sejam combinadas sempre que possível antes de serem gravadas no dispositivo. Isso pode reduzir consideravelmente as gravações no barramento para (por exemplo) memória de vídeo. Se o hardware não der suporte à combinação de gravação, o sinalizador será ignorado. Esse sinalizador é um modificador de proteção de página, válido somente quando usado com um dos sinalizadores de proteção de página diferente de PAGE_NOACCESS. |
Valor de retorno
ZwAllocateVirtualMemory retorna STATUS_SUCCESS ou um código de status de erro. Os códigos de status de erro possíveis incluem o seguinte:
Observações
ZwAllocateVirtualMemory pode executar as seguintes operações:
Confirme uma região de páginas reservada por uma chamada anterior para ZwAllocateVirtualMemory.
Reserve uma região de páginas gratuitas.
Reserve e confirme uma região de páginas gratuitas.
Os drivers de modo kernel podem usar ZwAllocateVirtualMemory para reservar um intervalo de endereços virtuais acessíveis ao aplicativo no processo especificado e, em seguida, fazer chamadas adicionais para ZwAllocateVirtualMemory para confirmar páginas individuais do intervalo 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.
Cada página no espaço de endereço virtual do processo está em um dos três estados descritos na tabela a seguir.
Estado | Significado |
---|---|
LIVRE | A página não está confirmada ou reservada e não está acessível ao processo. ZwAllocateVirtualMemory pode reservar ou, simultaneamente, reservar e confirmar uma página gratuita. |
RESERVADO | O intervalo de endereços não pode ser usado por outras funções de alocação, mas a página não está acessível ao processo e não tem nenhum armazenamento físico associado a ele. ZwAllocateVirtualMemory pode confirmar uma página reservada, mas não pode reservar uma segunda vez. ZwFreeVirtualMemory pode lançar uma página reservada, tornando-a uma página gratuita. |
EMPENHADO | O armazenamento físico é alocado para a página e o acesso é controlado por um código de proteção. O sistema inicializa e carrega cada página confirmada na memória física apenas na primeira tentativa de ler ou gravar nessa página. Quando o processo é encerrado, o sistema libera o armazenamento de páginas confirmadas. ZwAllocateVirtualMemory pode confirmar uma página já confirmada. Isso significa que você pode confirmar um intervalo de páginas, independentemente de elas já terem sido confirmadas e a função não falhará. ZwFreeVirtualMemory pode descompromissar uma página confirmada, liberar o armazenamento da página ou descompromissar e liberar simultaneamente uma página confirmada. |
A memória alocada chamando ZwAllocateVirtualMemory deve ser liberada chamando ZwFreeVirtualMemory.
Para obter mais informações sobre o gerenciamento de memória, consulte Gerenciamento de Memória para Drivers do Windows.
Nota
Se a chamada para a função ZwAllocateVirtualMemory ocorrer no modo de usuário, você deverá usar o nome "NtAllocateVirtualMemory" em vez de "ZwAllocateVirtualMemory".
Para chamadas de drivers no modo kernel, as versões NtXxx e Zwxxx versões de uma rotina dos Serviços de Sistema Nativo do Windows podem se comportar de forma diferente na maneira como lidam e interpretam parâmetros de entrada. Para obter mais informações sobre a relação entre as versões NtXxx e ZwXxx de uma rotina, consulte Usando versões Nt e Zw das rotinas de serviços do sistema nativo.
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 2000 |
da Plataforma de Destino |
Universal |
cabeçalho | ntifs.h (inclua Ntifs.h) |
biblioteca | NtosKrnl.lib |
de DLL |
NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
regras de conformidade de DDI | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport) |
Consulte também
usando versões Nt e Zw das rotinas de serviços do sistema nativo