Partilhar via


Regra IrqlZwPassive (wdm)

A regra IrqlZwPassive especifica que o driver chama ZwClose somente quando está sendo executado em IRQL = PASSIVE_LEVEL.

Modelo de driver: WDM

Marcar de bug encontrado com esta regra: 0xC4 de Verificação de Bugs: DRIVER_VERIFIER_DETECTED_VIOLATION (0x2001F)

Exemplo

O código a seguir viola essa regra:

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

Como testar

Em tempo de compilação

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

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

ZwCloseZwCreateKeyZwDeleteKeyZwEnumerateKeyZwEnumerateValueKeyZwFlushKeyZwOpenKeyZwQueryKeyZwQueryValueKeyZwSetValueKey