Regla IrqlExAllocatePool (wdm)

La regla IrqlExAllocatePool especifica que el controlador llama a ExAllocatePoolWithTag y ExAllocatePoolWithTagPriority solo cuando se ejecuta en IRQL<=DISPATCH_LEVEL.

Un llamador que se ejecuta en DISPATCH_LEVEL debe especificar un valorNonPaged Xxx para PoolType. Un llamador que se ejecuta en IRQL <= APC_LEVEL puede especificar cualquier valor de POOL_TYPE .

Modelo de controlador: WDM

Comprobaciones de errores encontradas con esta regla: Comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x00020004 ), Comprobación de errores 0xA: IRQL_NOT_LESS_OR_EQUAL

Ejemplo

En el ejemplo siguiente, se llama a la rutina ExAllocatePoolWithTag después de la rutina KeAcquireSpinLock , que establece IRQL en DISPATCH_LEVEL. Se llama a la rutina ExAllocatePoolWithTag con PagedPool, que infringe la regla.

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;
}

Cómo probar

En tiempo de compilación

Ejecute el Comprobador de controladores estáticos y especifique la regla IrqlExAllocatePool .

Usa los pasos siguientes para ejecutar un análisis de tu código:
  1. Prepara el código (usa declaraciones de tipos de rol).
  2. Ejecuta el comprobador de controlador estático.
  3. Consulta y analiza los resultados.

Para obtener más información, vea Usar comprobador de controladores estáticos para buscar defectos en controladores.

En tiempo de ejecución

Ejecute Comprobador de controladores y seleccione la opción comprobación de cumplimiento de DDI .

Se aplica a

ExAllocatePoolWithTagExAllocatePoolWithTagPriority

Consulte también

Administración de prioridades de hardwareque impiden errores y interbloqueos al usar bloqueos de número