Règle IrqlZwPassive (wdm)
La règle IrqlZwPassive spécifie que le pilote appelle ZwClose uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL.
Modèle de pilote : WDM
Bogues case activée trouvés avec cette règle : 0xC4 de vérification des bogues : DRIVER_VERIFIER_DETECTED_VIOLATION (0x2001F)
Exemple
Le code suivant enfreint cette règle :
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);
....
}
Comment tester
Au moment de la compilation |
---|
Exécutez Static Driver Verifier et spécifiez la règle IrqlZwPassive . Utilisez les étapes suivantes pour exécuter l’analyse de votre code :
Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes. |
Au moment de l'exécution |
---|
Exécutez Driver Verifier et sélectionnez l’option de vérification de conformité DDI . |
S’applique à
ZwCloseZwCreateKeyZwDeleteKeyZwEnumerateKey ZwEnumerateValueKeyZwFlushKeyZwOpenKeyZwQueryKeyZwQueryValueKey ZwQueryValueKeyZwSetValueKey