Ensemble de règles IRQL (WDM)
Utilisez ces règles pour vérifier que votre pilote effectue des appels DDI à l’IRQL requis.
Un pilote qui ne suit pas les règles IRQL peut causer de graves problèmes pendant le fonctionnement, ce qui peut entraîner des conditions d’interblocage ou des plantages d’ordinateur.
Contenu de cette section
Rubrique | Description |
---|---|
La règle ForwardedAtBadIrql spécifie que le pilote doit appeler IoCallDriver et PoCallDriver au DISPATCH_LEVEL IRQL<, sauf si le code de fonction principale IRP transféré est l’un des éléments suivants : |
|
La règle ForwardedAtBadIrqlAllocate spécifie que le pilote doit appeler IoCallDriver et PoCallDriver au DISPATCH_LEVEL IRQL<, sauf si le code de la fonction principale IRP transféré est l’un des éléments suivants : |
|
La règle ForwardedAtBadIrqlFsdAsync spécifie que le pilote appelle IoCallDriver et PoCallDriver au DISPATCH_LEVEL IRQL<, sauf si le code de fonction principale IRP transféré est l’un des éléments suivants : |
|
La règle ForwardedAtBadIrqlFsdSync spécifie que le pilote appelle IoCallDriver et PoCallDriver au DISPATCH_LEVEL IRQL<, sauf si le code de la fonction principale IRP transféré est l’un des éléments suivants : |
|
La règle IrqlApcLte spécifie que le pilote appelle ObGetObjectSecurity et ObReleaseObjectSecurity uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL. |
|
La règle IrqlDispatch spécifie que le pilote appelle les DDIs suivants uniquement lorsqu’il s’exécute à IRQL = DISPATCH_LEVEL. |
|
La règle IrqlExAllocatePool spécifie que le pilote appelle ExAllocatePoolWithTag et ExAllocatePoolWithTagPriority uniquement lorsqu’il s’exécute à IRQL<=DISPATCH_LEVEL. |
|
La règle IrqlExApcLte1 spécifie que le pilote appelle ExAcquireFastMutex et ExTryToAcquireFastMutex uniquement à IRQL <= APC_LEVEL. |
|
La règle IrqlExApcLte2 spécifie que le pilote appelle les routines suivantes uniquement à IRQL <= APC_LEVEL. |
|
La règle IrqlExApcLte3 spécifie que le pilote appelle les routines de support exécutif suivantes uniquement à IRQL <= APC_LEVEL. |
|
La règle IrqlExApcLteInline spécifie que les DDIs ne sont appelés qu’aux niveaux IRQL appropriés |
|
La règle IrqlExFree1 spécifie qu’ExFreePool et ExFreePoolWithTag sont appelés au niveau de l’IRQL approprié. |
|
La règle IrqlExFree2 spécifie qu’ExFreePool et ExFreePoolWithTag sont appelés au niveau de l’IRQL approprié. |
|
La règle IrqlExFree3 spécifie qu’ExFreePool et ExFreePoolWithTag sont appelés au niveau de l’IRQL approprié. |
|
La règle IrqlExPassive spécifie que le pilote appelle les routines de support de l’exécutif suivantes uniquement à IRQL = PASSIVE_LEVEL : La règle IrqlExPassive spécifie également que le pilote appelle ExRaiseStatus à IRQL <= APC_LEVEL |
|
La règle IrqlIoApcLte spécifie que le pilote appelle les routines de gestionnaire d’E/S suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL : |
|
La règle IrqlIoDispatch spécifie que le pilote appelle les routines suivantes du Gestionnaire d’E/S uniquement lorsqu’il s’exécute à IRQL <= DISPATCH_LEVEL : IoGetDeviceToVerify, IoSetDeviceToVerify. |
|
La règle IrqlIoPassive1 spécifie que le pilote appelle les routines suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL : |
|
La règle IrqlIoPassive2 spécifie que le pilote appelle les routines suivantes du Gestionnaire d’E/S uniquement dans IRQL = PASSIVE_LEVEL : |
|
La règle IrqlIoPassive3 spécifie que le pilote appelle les routines suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL : |
|
La règle IrqlIoPassive4 spécifie que le pilote appelle les routines suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL : |
|
La règle IrqlIoPassive5 spécifie que le pilote appelle des routines spécifiques du Gestionnaire d’E/S uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL. |
|
La règle IrqlIoRtlZwPassive spécifie que le pilote appelle des routines spécifiques du Gestionnaire d’E/S uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL. |
|
La règle IrqlKeApcLte1 spécifie que le pilote appelle les routines de noyau suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL : |
|
La règle IrqlKeApcLte2 spécifie que le pilote appelle les routines de noyau suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL : |
|
La règle IrqlKeDispatchLte spécifie que le pilote appelle les routines de noyau suivantes uniquement lorsqu’il s’exécute à IRQL <= DISPATCH_LEVEL : |
|
La règle IrqlKeRaiseLower spécifie que le pilote effectue les opérations suivantes lors de la levée et de la baisse de l’IRQL : Lorsque le pilote appelle KeRaiseIrql, il s’exécute sur un IRQL inférieur ou égal à la valeur du paramètre NewIrql .Le pilote appelle KeLowerIrql uniquement après avoir appelé KeRaiseIrql ou KeRaiseIrqlToDpcLevel. |
|
La règle IrqlKeRaiseLower2 spécifie que les pilotes utilisent KeLowerIrql pour restaurer l’IRQL d’origine déclenché par un appel précédent à KeRaiseIrql ou KeRaiseIrqlToDpcLevel. |
|
La règle IrqlKeReleaseSpinLock spécifie que le pilote appelle KeReleaseSpinLock uniquement lorsqu’il s’exécute à IRQL = DISPATCH_LEVEL. |
|
La règle IrqlKeSetEvent spécifie que la routine KeSetEvent est appelée uniquement à IRQL <= DISPATCH_LEVEL lorsque Wait a la valeur FALSE et à IRQL <= APC_LEVEL lorsque Wait a la valeur TRUE. |
|
La règle IrqlKeWaitForMutexObject spécifie le pilote pour appeler la routine KeWaitForMutexObject à l’IRQL approprié en fonction de la valeur du paramètre Timeout : |
|
La règle IrqlKeWaitForMultipleObjects spécifie que les appelants de la routine KeWaitForMultipleObjects doivent s’exécuter à l’IRQL approprié en fonction du paramètre Timeout . |
|
La règle IrqlMmApcLte spécifie que le pilote appelle les routines de gestionnaire de mémoire suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL : |
|
La règle IrqlMmDispatch spécifie que le pilote appelle MmFreeContiguousMemory uniquement lorsqu’il s’exécute à l’adresse IRQL <= DISPATCH_LEVEL. |
|
La règle IIrqlNtifsApcPassive spécifie que le pilote appelle les DDIs répertoriés dans la règle uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL ou à IRQL <= APC_LEVEL. |
|
La règle IrqlObPassive spécifie que le pilote appelle ObReferenceObjectByHandle uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL. |
|
La règle IrqlPsPassive spécifie que le pilote appelle les routines de structure de processus suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL : |
|
La règle IrqlReturn spécifie que les routines de dispatch du pilote retournent au même IRQL que celui auquel elles ont été appelées. |
|
La règle IrqlRtlPassive spécifie que le pilote appelle RtlDeleteRegistryValue uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL. |
|
La règle IrqlZwPassive spécifie que le pilote appelle ZwClose uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL. |
Pour sélectionner l’ensemble de règles Irql
Sélectionnez votre projet de pilote (.vcxProj) dans Microsoft Visual Studio. Dans le menu Pilote , cliquez sur Lancer le vérificateur de pilote statique....
Cliquez sur l’onglet Règles . Sous Ensembles de règles, sélectionnez Irql.
Pour sélectionner l’ensemble de règles par défaut à partir d’une fenêtre d’invite de commandes développeur Visual Studio, spécifiez Irql.sdv avec l’option /case activée. Par exemple :
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Pour plus d’informations, consultez Utilisation du vérificateur de pilote statique pour rechercher des défauts dans les pilotes et commandes MSBuild (Static Driver Verifier).