Função ExAllocatePoolWithQuotaTag (wdm.h)
A rotina ExAllocatePoolWithQuotaTag aloca memória do pool, cobrando a cota em relação ao processo atual.
Aviso
ExAllocatePoolWithQuotaTag foi preterido no Windows 10, versão 2004 e foi substituído por ExAllocatePool2. Para obter mais informações, consulte Atualizando chamadas preteridas do ExAllocatePool 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 do pool disponíveis, consulte POOL_TYPE.
Você pode modificar o valor PoolType por meio da opção bit a bit desse 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 por meio de ORing bit a bit com o sinalizador POOL_COLD_ALLOCATION como uma dica para o kernel para alocar a memória de páginas que provavelmente serão excluídas 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 um aviso e tem suporte no Windows XP e versões posteriores do sistema operacional Windows.
[in] NumberOfBytes
Especifica o número de bytes a serem alocados.
[in] Tag
Especifica a marca de pool para a memória alocada. Para obter mais informações, consulte o parâmetro Tag de ExAllocatePoolWithTag.
Valor de retorno
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.
Observações
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. Os drivers de nível inferior chamam ExAllocatePoolWithTag.
Se NumberOfBytes for PAGE_SIZE ou maior, um buffer alinhado à página será alocado. As alocações de memória de PAGE_SIZE ou menos são alocadas dentro de uma página e não ultrapassam limites de página. Alocações de memória inferiores a 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 a limites de 16 bytes em sistemas de 64 bits.
O sistema associa a marca de pool à memória alocada. Ferramentas de programação, como o WinDbg, podem exibir a marca de pool associada a cada buffer alocado. O valor de de Marca normalmente é exibido em ordem invertida. Por exemplo, se um chamador passar 'Fred' como um Marca, ele aparecerá como 'derF' se o pool for despejado ou ao acompanhar 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, Verificador de Driver sinalizadores como alocações possíveis.
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 de objetos de evento padrão.
Em uma arquitetura de 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 que aloca ExAllocatePoolWithQuotaTag não está inicializada. Um driver de modo kernel deve primeiro zero essa memória se ele for torná-la visível para o software no modo de usuário (para evitar o vazamento de conteúdo potencialmente privilegiado).
Os chamadores de ExAllocatePoolWithQuotaTag devem estar em execução no <DO IRQL = DISPATCH_LEVEL. Um chamador em execução em DISPATCH_LEVEL deve especificar um valor Xxx nãopagado para poolType. Um chamador em execução no 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 |
---|---|
da Plataforma de Destino | Universal |
cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
biblioteca | NtosKrnl.lib |
de 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) |