Regla IrqlZwPassive (wdm)

La regla IrqlZwPassive especifica que el controlador llama a ZwClose solo cuando se ejecuta en IRQL = PASSIVE_LEVEL.

Modelo de controlador: WDM

Comprobaciones de errores encontradas con esta regla: Comprobación de errores 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION (0x2001F)

Ejemplo

El código siguiente infringe esta regla:

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

Cómo probar

En tiempo de compilación

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

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, consulte Uso del comprobador de controladores estáticos para buscar defectos en controladores.

En tiempo de ejecución

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

Se aplica a

ZwCloseZwCreateKeyZwDeleteKeyZwEnumerateKeyZwEnumerateValueKeyZwFlushKeyZwOpenKeyZwQueryKeyZwQueryKeyZwSetValueKey