Função ExAllocatePool (wdm.h)
Aviso
ExAllocatePool está obsoleta e foi preterida no Windows 10, versão 2004. Ele foi substituído por ExAllocatePool2 . Para obter mais informações, consulte Atualizando chamadas preteridas do ExAllocatePool para ExAllocatePool2 e ExAllocatePool3.
Ao desenvolver drivers para a versão do Windows antes do Windows 10, versão 2004, use ExAllocatePoolZero.
ExAllocatePool aloca a memória do pool do tipo especificado e retorna um ponteiro para o bloco alocado.
Sintaxe
PVOID ExAllocatePool(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes
);
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 poolType usando um OR 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 consultivo e está disponível para o Windows XP e versões posteriores do sistema operacional Windows.
[in] NumberOfBytes
Especifica o número de bytes a serem alocados.
Valor de retorno
ExAllocatePool retornará NULL se não houver memória suficiente no pool gratuito para atender à solicitação. Caso contrário, a rotina retornará um ponteiro para a memória alocada.
Observações
Essa rotina é usada para a alocação geral de memória do pool.
Se NumberOfBytes for PAGE_SIZE ou maior, um buffer alinhado à página será alocado. Alocações de memória de PAGE_SIZE ou menos 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.
Uma alocação bem-sucedida solicitando NumberOfBytes< PAGE_SIZE de pool nãopagado fornece ao chamador exatamente o número de bytes solicitados de memória. Se uma solicitação de alocação para NumberOfBytes> PAGE_SIZE for bem-sucedida e NumberOfBytes não for um múltiplo exato de PAGE_SIZE, a última página na alocação conterá bytes que não fazem parte da alocação do chamador. Se possível, o alocador de pool usa esses bytes. Para evitar corromper dados que pertencem a outros componentes do modo kernel, os drivers devem acessar apenas os endereços de armazenamento que eles alocaram explicitamente.
Se ExAllocatePool retornar NULL, o chamador deverá retornar o valor NTSTATUS STATUS_INSUFFICIENT_RESOURCES ou deve atrasar o processamento para outro ponto no tempo.
Os chamadores de ExAllocatePool devem estar em execução no 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 página.
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.
A memória que aloca ExAllocatePool 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).
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Obsoleto. Essa rotina é exportada apenas para binários existentes. Em vez disso, use ExAllocatePoolWithTag. |
da Plataforma de Destino | Universal |
cabeçalho | wdm.h (incluem Wdm.h, Ntddk.h, Ntifs.h, Classpnp.h, Smcnt.h) |
biblioteca | NtosKrnl.lib |
de DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL (consulte a seção Comentários) |
regras de conformidade de DDI | CheckDeviceObjectFlags(wdm), HwStorPortProhibitedDIs(storport), IrqlExAllocatePool(wdm), PowerDownAllocate(wdm), PowerUpFail(wdm), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm) |