Regra IrqlExAllocatePool (wdm)

A regra IrqlExAllocatePool especifica que o driver chama ExAllocatePoolWithTag e ExAllocatePoolWithTagPriority somente quando está sendo executado em IRQL<=DISPATCH_LEVEL.

Um chamador em execução no DISPATCH_LEVEL deve especificar um valorXxx NãoPaged para PoolType. Um chamador em execução em IRQL <= APC_LEVEL pode especificar qualquer valor de POOL_TYPE .

Modelo de driver: WDM

Marcar de bugs encontrados com esta regra: 0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004), Verificação de Bugs 0xA: IRQL_NOT_LESS_OR_EQUAL

Exemplo

No exemplo a seguir, a rotina ExAllocatePoolWithTag é chamada após a rotina KeAcquireSpinLock , que define IRQL como DISPATCH_LEVEL. A rotina ExAllocatePoolWithTag é chamada com PagedPool, o que viola a regra.

NTSTATUS
DispatchRequest (
    __in PDEVICE_REQUEST DeviceRequest
    )
{  
    KIRQL OldIrql;
    KSPIN_LOCK SpinLock;
    NTSTATUS Status;
    ...

    KeInitializeSpinLock(&SpinLock);

    //
    // KeAcquireSpinLock sets IRQL to DISPATCH_LEVEL and the previous IRQL is 
    // written to OldIrql after the lock is acquired.
    //

    KeAcquireSpinLock(&SpinLock, &OldIrql);
    ...

    Status = ProcessRequest(DeviceRequest);

    //
    // KeReleaseSpinLock sets IRQL to the OldIrql returned by KeAcquireSpinLock.
    //

    KeReleaseSpinLock(&SpinLock, &OldIrql);
    ...
}

NTSTATUS
ProcessRequest (
    __in PDEVICE_REQUEST DeviceRequest
    )
{
    NTSTATUS Status;
    ...

    //
    // RULE VIOLATION! - IrqlExAllocatePool executing at DISPATCH_LEVEL must specify 
    //                   a NonPagedXxx value for PoolType. 
    //

    DeviceRequest->Context = ExAllocatePool(PagedPool, sizeof(REQUEST_CONTEXT));
    if (DeviceRequest->Context == NULL) {
        Status = STATUS_INSUFFICIENT_RESOURCES;
    }
    ...

    return Status;
}

Como testar

Em tempo de compilação

Execute o Verificador de Driver Estático e especifique a regra IrqlExAllocatePool .

Use as seguintes etapas para executar uma análise do código:
  1. Prepare seu código (use declarações de tipo de função).
  2. Execute o Verificador de Driver Estático.
  3. Exiba e analise os resultados.

Para obter mais informações, consulte Usando o verificador de driver estático para localizar defeitos em drivers.

Em tempo de execução

Execute o Verificador de Driver e selecione a opção de verificação de conformidade da DDI .

Aplica-se a

ExAllocatePoolWithTagExAllocatePoolWithTagPriority

Confira também

Gerenciando prioridades de hardwareimpedindo erros e deadlocks ao usar bloqueios de rotação