Compartilhar via


Função ExAllocatePoolWithQuotaTag (wdm.h)

A rotina ExAllocatePoolWithQuotaTag aloca memória do pool, cobrando a cota no processo atual.

Aviso

ExAllocatePoolWithQuotaTag foi preterido em Windows 10, versão 2004 e foi substituído por ExAllocatePool2. Para obter mais informações, consulte Atualizando chamadas de ExAllocatePool preteridas para ExAllocatePool2 e ExAllocatePool3.

Sintaxe

PVOID ExAllocatePoolWithQuotaTag(
  [in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
  [in] SIZE_T                                         NumberOfBytes,
  [in] ULONG                                          Tag
);

Parâmetros

[in] PoolType

Especifica o tipo de memória do pool a ser alocada. Para obter uma descrição dos tipos de memória de pool disponíveis, consulte POOL_TYPE.

Você pode modificar o valor PoolType bit a bit- ORing esse valor com o sinalizador POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Esse sinalizador faz com que a rotina retorne um valor NULL se a solicitação não puder ser atendida.

Da mesma forma, você pode modificar o valor poolType bit a bit- ORing esse valor com o sinalizador POOL_COLD_ALLOCATION como uma dica para o kernel para alocar a memória de páginas que provavelmente serão paginada rapidamente. Para reduzir a quantidade de memória do pool de residentes o máximo possível, você não deve referenciar essas alocações com frequência. O sinalizador POOL_COLD_ALLOCATION é apenas consultivo e tem suporte no Windows XP e versões posteriores do sistema operacional Windows.

[in] NumberOfBytes

Especifica o número de bytes para alocar.

[in] Tag

Especifica a marca de pool para a memória alocada. Para obter mais informações, consulte o parâmetro Tag de ExAllocatePoolWithTag.

Retornar valor

ExAllocatePoolWithQuotaTag retorna um ponteiro para o pool alocado.

Se a solicitação não puder ser atendida, ExAllocatePoolWithQuotaTag gerará uma exceção, a menos que POOL_QUOTA_FAIL_INSTEAD_OF_RAISE seja especificado. Usar POOL_QUOTA_FAIL_INSTEAD_OF_RAISE é preferencial por motivos de desempenho.

Comentários

Essa rotina é chamada por drivers de nível mais alto que alocam memória para atender a uma solicitação no contexto do processo que originalmente fez a solicitação de E/S. Em vez disso, os drivers de nível inferior chamam ExAllocatePoolWithTag .

Se NumberOfBytes for PAGE_SIZE ou superior, um buffer alinhado à página será alocado. Alocações de memória de PAGE_SIZE ou menos são alocadas em uma página e não cruzam limites de página. As alocações de memória de menos de PAGE_SIZE não são necessariamente alinhadas à página, mas estão alinhadas aos limites de 8 bytes em sistemas de 32 bits e aos limites de 16 bytes em sistemas de 64 bits.

O sistema associa a marca de pool à memória alocada. Ferramentas de programação, como WinDbg, podem exibir a marca de pool associada a cada buffer alocado. O valor de Tag normalmente é exibido em ordem invertida. Por exemplo, se um chamador passar 'Fred' como uma Marca, ele aparecerá como 'derF' se o pool for despejado ou ao rastrear o uso do pool no depurador.

O buffer alocado pode ser liberado com ExFreePool ou ExFreePoolWithTag.

Não defina NumberOfBytes = 0. Evite alocações de comprimento zero porque elas desperdiçam espaço de cabeçalho do pool e, em muitos casos, indicam um possível problema de validação no código de chamada. Por esse motivo, o Verificador de Driver sinaliza essas alocações como possíveis erros.

O sistema define automaticamente determinados objetos de evento padrão quando a quantidade de pool (paginada ou não paga) é alta ou baixa. Os drivers podem esperar que esses eventos ajustem o uso do pool. Para obter mais informações, consulte Objetos de Evento Padrão.

Em uma arquitetura multiprocessador NUMA (acesso à memória) não uniforme, ExAllocatePoolWithQuotaTag tenta alocar memória local para o processador que está chamando ExAllocatePoolWithQuotaTag. Se nenhuma memória local estiver disponível, ExAllocatePoolWithQuotaTag alocará a memória mais próxima disponível.

A memória alocada por ExAllocatePoolWithQuotaTag não é inicializada. Um driver de modo kernel deve primeiro zerar essa memória se ela for torná-la visível para o software no modo de usuário (para evitar vazamento de conteúdo potencialmente privilegiado).

Os chamadores de ExAllocatePoolWithQuotaTag devem estar em execução em IRQL <= DISPATCH_LEVEL. Um chamador em execução em DISPATCH_LEVEL deve especificar um valor XxxNãoPaged para PoolType. Um chamador em execução em IRQL <= APC_LEVEL pode especificar qualquer valor POOL_TYPE , mas o IRQL e o ambiente também devem ser considerados para determinar o tipo de pool.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL (consulte a seção Comentários)
Regras de conformidade de DDI HwStorPortProhibitedDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf)

Confira também

ExAllocatePoolWithTag

ExFreePool

ExFreePoolWithTag

POOL_TYPE