Compartilhar via


Função ExAllocatePool (wdm.h)

Aviso

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

Ao desenvolver drivers para a versão do Windows antes do Windows 10, versão 2004, use ExAllocatePoolZero.

ExAllocatePool aloca memória de 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 de pool disponíveis, consulte POOL_TYPE.

Você pode modificar o 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 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 aviso e está disponível para o Windows XP e versões posteriores do sistema operacional Windows.

[in] NumberOfBytes

Especifica o número de bytes para alocar.

Retornar valor

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.

Comentários

Essa rotina é usada para a alocação geral de memória do pool.

Se NumberOfBytes for PAGE_SIZE ou superior, um buffer alinhado à página será alocado. As alocações de memória de PAGE_SIZE ou menos 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.

Uma alocação bem-sucedida que solicita NumberOfBytes< PAGE_SIZE de pool nãopagado fornece ao chamador exatamente o número de bytes de memória solicitados. 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 sendo executados 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 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, 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.

A memória alocada por ExAllocatePool 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).

Requisitos

Requisito Valor
Cliente mínimo com suporte Obsoleto. Essa rotina é exportada apenas para binários existentes. Em vez disso, use ExAllocatePoolWithTag.
Plataforma de Destino Universal
Cabeçalho wdm.h (incluem Wdm.h, Ntddk.h, Ntifs.h, Classpnp.h, Smcnt.h)
Biblioteca NtosKrnl.lib
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)

Confira também

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE