Partager via


Ensemble de règles IRQL (WDM)

Utilisez ces règles pour vérifier que votre pilote effectue des appels DDI au niveau de l’IRQL requis.

Un pilote qui ne suit pas les règles IRQL peut provoquer de graves problèmes pendant l’opération qui peuvent entraîner des blocages ou des blocages d’ordinateur.

Contenu de cette section

Sujet Description

ForwardedAtBadIrql

La règle ForwardedAtBadIrql spécifie que le pilote doit appeler IoCallDriver et PoCallDriver au DISPATCH_LEVEL IRQL<, sauf si le code de fonction principal IRP transféré est l’un des éléments suivants :

ForwardedAtBadIrqlAllocate

La règle ForwardedAtBadIrqlAllocate spécifie que le pilote doit appeler IoCallDriver et PoCallDriver à <IRQLDISPATCH_LEVEL, sauf si le code de fonction majeur IRP transféré est l'un des suivants :

Transféré à BadIrqlFsdAsync

La règle ForwardedAtBadIrqlFsdAsync spécifie que le pilote appelle IoCallDriver et PoCallDriver à IRQL<DISPATCH_LEVEL, sauf si le code de la fonction principale IRP transféré est l’un des éléments suivants :

ForwardedAtBadIrqlFsdSync

La règle ForwardedAtBadIrqlFsdSync spécifie que le pilote doit appeler IoCallDriver et PoCallDriver à IRQL<DISPATCH_LEVEL, sauf si le code de fonction majeur IRP transféré est l'un des suivants :

IrqlApcLte

La règle IrqlApcLte spécifie que le pilote appelle ObGetObjectSecurity et ObReleaseObjectSecurity uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL.

IrqlDispatch

La règle IrqlDispatch spécifie que le pilote appelle les DDI suivants uniquement lorsqu'il s'exécute à IRQL = DISPATCH_LEVEL.

IrqlExAllocatePool

La règle IrqlExAllocatePool spécifie que le pilote appelle ExAllocatePoolWithTag et ExAllocatePoolWithTagPriority uniquement lorsqu’il s’exécute à IRQL<=DISPATCH_LEVEL.

IrqlExApcLte1

La règle IrqlExApcLte1 spécifie que le pilote appelle ExAcquireFastMutex et ExTryToAcquireFastMutex uniquement à IRQL <= APC_LEVEL.

IrqlExApcLte2

La règle IrqlExApcLte2 spécifie que le pilote appelle les routines suivantes uniquement à IRQL <= APC_LEVEL.

IrqlExApcLte3

La règle IrqlExApcLte3 spécifie que le pilote appelle les routines de support exécutif suivantes uniquement à IRQL <= APC_LEVEL.

IrqlExApcLteInline

La règle IrqlExApcLteInline spécifie que les DDIs sont uniquement appelées à des niveaux IRQL appropriés

IrqlExFree1

La règle IrqlExFree1 spécifie que ExFreePool et ExFreePoolWithTag sont appelés à l’irQL approprié.

IrqlExFree2

La règle IrqlExFree2 spécifie que ExFreePool et ExFreePoolWithTag sont appelés à l’irQL approprié.

IrqlExFree3

La règle IrqlExFree3 spécifie que ExFreePool et ExFreePoolWithTag sont appelés à l’irQL approprié.

IrqlExPassive

La règle IrqlExPassive spécifie que le pilote appelle les routines de support exécutif suivantes uniquement à IRQL = PASSIVE_LEVEL :

La règle IrqlExPassive spécifie également que le pilote appelle ExRaiseStatus à IRQL <= APC_LEVEL

IrqlIoApcLte

La règle IrqlIoApcLte spécifie que le pilote appelle les routines du gestionnaire d’E/S suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL :

IrqlIoDispatch

La règle IrqlIoDispatch spécifie que le pilote appelle les routines d’E/S suivantes uniquement lorsqu’il s’exécute à IRQL <= DISPATCH_LEVEL : IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

La règle IrqlIoPassive1 spécifie que le pilote appelle les routines suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL :

IrqlIoPassive2

La règle IrqlIoPassive2 spécifie que le pilote appelle les routines du Gestionnaire d’E/S suivantes uniquement à IRQL = PASSIVE_LEVEL :

IrqlIoPassive3

La règle IrqlIoPassive3 spécifie que le pilote appelle les routines suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL :

IrqlIoPassive4

La règle IrqlIoPassive4 spécifie que le pilote appelle les routines suivantes uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL :

IrqlIoPassive5

La règle IrqlIoPassive5 spécifie que le pilote appelle des routines du Gestionnaire d'E/S spécifiques uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL.

IrqlIoRtlZwPassive

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.

IrqlKeApcLte1

La règle IrqlKeApcLte1 spécifie que le pilote appelle les routines de noyau suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL :

IrqlKeApcLte2

La règle IrqlKeApcLte2 spécifie que le pilote appelle les routines de noyau suivantes uniquement lorsqu’il s’exécute à IRQL <= APC_LEVEL :

IrqlKeDispatchLte

La règle IrqlKeDispatchLte spécifie que le pilote appelle les routines de noyau suivantes uniquement lorsqu’il s’exécute à IRQL <= DISPATCH_LEVEL :

IrqlKeRaiseLower

La règle IrqlKeRaiseLower spécifie que le pilote effectue les opérations suivantes lors de l'élévation et de l'abaissement de l’IRQL :

Lorsque le pilote appelle KeRaiseIrql, il s’exécute à un irQL inférieur ou égal à la valeur du paramètre NewIrql .
Le pilote appelle KeLowerIrql uniquement après avoir appelé KeRaiseIrql ou KeRaiseIrqlToDpcLevel.

IrqlKeRaiseLower2

La règle IrqlKeRaiseLower2 spécifie que les pilotes utilisent KeLowerIrql pour restaurer l'IRQL d'origine levé par un appel précédent à KeRaiseIrql ou KeRaiseIrqlToDpcLevel.

IrqlKeReleaseSpinLock

La règle IrqlKeReleaseSpinLock spécifie que le pilote appelle KeReleaseSpinLock uniquement lorsqu’il s’exécute à IRQL = DISPATCH_LEVEL.

IrqlKeSetEvent

La règle IrqlKeSetEvent spécifie que la routine KeSetEvent est appelée uniquement à IRQL <= DISPATCH_LEVEL lorsque Wait est défini sur FALSE, et à IRQL <= APC_LEVEL lorsque Wait est défini sur TRUE.

IrqlKeWaitForMutexObject

La règle IrqlKeWaitForMutexObject spécifie le pilote pour appeler la routine KeWaitForMutexObject à l’irQL appropriée en fonction de la valeur du paramètre Timeout :

IrqlKeWaitForMultipleObjects

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 .

IrqlMmApcLte

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 :

IrqlMmDispatch

La règle IrqlMmDispatch spécifie que le pilote appelle MmFreeContiguousMemory uniquement lorsqu’il s’exécute à IRQL <= DISPATCH_LEVEL.

IrqlNtifsApcPassive

La règle IIrqlNtifsApcPassive spécifie que le pilote appelle les DDI répertoriés dans la règle uniquement lorsqu'il s'exécute à IRQL = PASSIVE_LEVEL ou à IRQL = APC_LEVEL.

IrqlObPassive

La règle IrqlObPassive spécifie que le pilote appelle ObReferenceObjectByHandle uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL.

IrqlPsPassive

La règle IrqlPsPassive spécifie que le pilote appelle les routines de structure de processus spécifiques uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL.

IrqlReturn

La règle IrqlReturn spécifie que les routines de répartition du pilote retournent au même IRQL auquel elles ont été appelées.

IrqlRtlPassive

La règle IrqlRtlPassive spécifie que le pilote appelle RtlDeleteRegistryValue uniquement lorsqu’il s’exécute à IRQL = PASSIVE_LEVEL.

IrqlZwPassive

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

  1. Sélectionnez votre projet de pilote (.vcxProj) dans Microsoft Visual Studio. Dans le menu Pilote , cliquez sur Lancer le vérificateur de pilote statique....

  2. 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 du développeur Visual Studio, spécifiez Irql.sdv avec l’option /check . Par exemple:

    msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Pour plus d’informations, veuillez consulter la section Utilisation de Static Driver Verifier pour rechercher des défauts dans les pilotes et les commandes MSBuild (Static Driver Verifier).