Função ZwAllocateVirtualMemory (ntifs.h)

A rotina ZwAllocateVirtualMemory reserva, confirma 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 for NULL, a região será alocada começando no endereço virtual especificado arredondado para baixo até 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 da 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 até 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.

Sinalizador Significado
MEM_COMMIT A região especificada das páginas 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 pode ser definido e Proteger deve ser definido como PAGE_READWRITE.
MEM_RESERVE A região especificada das páginas 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 está zerado. 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.

Sinalizador 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 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 Acesso de leitura, gravação e execução à região confirmada das 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 O acesso de execução e leitura à região confirmada das páginas é permitido. 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 atuam, portanto, 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 a página de proteção status, 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á uma falha status indicador.
PAGE_NOCACHE A região das páginas deve ser alocada como inconsequente. PAGE_NOCACHE não é permitido para seções.
PAGE_WRITECOMBINE Habilita a combinação de gravação, ou seja, a união de gravações do cache para main memória, 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.

Retornar valor

ZwAllocateVirtualMemory retorna STATUS_SUCCESS ou um erro status código. Os possíveis códigos de status de erro incluem o seguinte:

Comentários

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 no 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
FREE A página não é confirmada ou reservada e não está acessível ao processo. ZwAllocateVirtualMemory pode reservar ou reservar e confirmar simultaneamente 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 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.
COMETEU 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 somente na primeira tentativa de ler ou gravar nessa página. Quando o processo é encerrado, o sistema libera o armazenamento para 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 desabilitar uma página confirmada, liberar o armazenamento da página ou desabilitar 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.

Observação

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 de modo kernel, as versões NtXxx e ZwXxx de uma rotina do Windows Native System Services 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 Using Nt and Zw Versions of the Native System Services Routines.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 2000
Plataforma de Destino Universal
Cabeçalho ntifs.h (inclua Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regras de conformidade da DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport), StorPortStartIo(storport)

Confira também

Usando versões Nt e Zw das rotinas de serviços do sistema nativo

ZwFreeVirtualMemory