Condividi tramite


Regola irqlExApcLte3 (wdm)

La regola IrqlExApcLte3 specifica che il driver chiama le routine di supporto esecutivo seguenti solo in IRQL <= APC_LEVEL.

I driver che hanno errori correlati a IRQL possono causare gravi problemi e potrebbe causare un arresto anomalo di un computer.

Modello di driver: WDM

Controllo bug trovato con questa regola: Controllo bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x20007 ), Verifica bug 0xA: IRQL_NOT_LESS_OR_EQUAL

Esempio

Il codice seguente viola questa regola:

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

Come eseguire il test

In fase di compilazione

Eseguire il verifica driver statico e specificare la regola IrqlExApcLte3 .

Usa i passaggi descritti di seguito per eseguire un'analisi del codice:
  1. Prepara il codice (usa dichiarazioni di tipo ruolo).
  2. Esegui Driver Verifier statico.
  3. Visualizza e analizza i risultati.

Per altre informazioni, vedere Uso del verificatore driver statico per trovare i difetti nei driver.

In fase di esecuzione

Eseguire il verifica driver e selezionare l'opzione di controllo della conformità DDI .

Si applica a

ExAcquireResourceExclusiveLiteExAcquireResourceSharedLite ExAcquireSharedStarveExclusive ExAcquireSharedWaitForExclusive ExConvertExclusiveToSharedLiteExDeleteResourceLite

Vedi anche

Gestione delle priorità hardwareche impediscono errori e deadlock durante l'uso di blocchi spin