Regra IrqlExApcLte3 (wdm)

A regra IrqlExApcLte3 especifica que o driver chama as seguintes rotinas de suporte executivo somente em IRQL <= APC_LEVEL.

Os drivers que têm erros relacionados ao IRQL podem causar sérios problemas e podem causar uma falha no computador.

Modelo de driver: WDM

Marcar de bug encontrado com esta regra: 0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION (0x20007), 0xA de Verificação de Bugs: IRQL_NOT_LESS_OR_EQUAL

Exemplo

O código a seguir viola essa 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
    )
{
    ERESOURCE Resource;
    NTSTATUS Status;
    ...

    Resource = DeviceRequest->GetTableLock();

    //
    // RULE VIOLATION! - ExAcquireSharedStarveExclusive can be called only at 
    //                   IRQL <= APC_LEVEL. 
    //

    if(!ExAcquireSharedStarveExclusive(&Resource, FALSE)) {
        return STATUS_UNSUCCESSFUL;
    }

    ...

    ExReleaseResourceLite(&Resource);
    ...
    return Status;
}

Como testar

Em tempo de compilação

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

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

ExAcquireResourceExclusiveLiteExAcquireResourceSharedLiteExAcquireSharedStarveExclusiveExAcquireSharedWaitForExclusiveExConvertExclusiveToSharedLiteExDeleteResourceLite

Confira também

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