Condividi tramite


Regola irqlZwPassive (wdm)

La regola IrqlZwPassive specifica che il driver chiama ZwClose solo quando viene eseguito in IRQL = PASSIVE_LEVEL.

Modello di driver: WDM

Verifica bug trovata con questa regola: Verifica bug 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x2001F )

Esempio

Il codice seguente viola questa regola:

NTSTATUS 
DriverCloseResources (
    _In_ PDRIVER_CONTEXT Context
    )
{
    …

    NT_ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

    //
    // ExAcquireFastMutex sets the IRQL to APC_LEVEL, and the caller continues 
    // to run at APC_LEVEL after ExAcquireFastMutex returns.
    //
  
    ExAcquireFastMutex(&Context->FastMutex);
    
    ....
    
    if (NULL != Context->Handle) {

            //
            // RULE VIOLATION! - ZwClose can be called only at PASSIVE_LEVEL 
            //
            
            ZwClose(Context->Handle);      
            Context->Handle = NULL;
    }
    
    ....

    //
    // N.B. ExReleaseFastMutex restores the original IRQL.
    //
     
    ExReleaseFastMutex(&Context->FastMutex);
    
    ....
}

Come eseguire il test

In fase di compilazione

Eseguire il verifica driver statico e specificare la regola IrqlZwPassive .

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

ZwCloseZwCreateKeyZwDeleteKeyZwEnumerateKeyZwEnumerateValueKeyZwFlushKeyZwOpenKeyZwQueryKey ZwQueryValueKeyZwQueryValueKeyKey