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) |