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:
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