IRQL-Regelsatz (WDM)
Verwenden Sie diese Regeln, um zu überprüfen, ob Ihr Treiber DDI-Aufrufe am erforderlichen IRQL durchführt.
Ein Treiber, der die IRQL-Regeln nicht befolgt, kann während des Betriebs zu schwerwiegenden Problemen führen, die zu Deadlockbedingungen oder Computerabstürzen führen können.
In diesem Abschnitt
Thema | BESCHREIBUNG |
---|---|
Die ForwardedAtBadIrql-Regel gibt an, dass der Treiber IoCallDriver und PoCallDriver bei IRQL<DISPATCH_LEVEL aufrufen soll, es sei denn, der IRP-Hauptfunktionscode, der weitergeleitet wird, ist einer der folgenden: |
|
Die ForwardedAtBadIrqlAllocate-Regel gibt an, dass der Treiber IoCallDriver und PoCallDriver bei IRQL<DISPATCH_LEVEL aufrufen soll, es sei denn, der IRP-Hauptfunktionscode, der weitergeleitet wird, ist einer der folgenden: |
|
Die ForwardedAtBadIrqlFsdAsync-Regel gibt an, dass der Treiber IoCallDriver und PoCallDriver am IRQL<DISPATCH_LEVEL aufruft, es sei denn, der IRP-Hauptfunktionscode, der weitergeleitet wird, ist einer der folgenden: |
|
Die ForwardedAtBadIrqlFsdSync-Regel gibt an, dass der Treiber IoCallDriver und PoCallDriver bei IRQL<DISPATCH_LEVEL aufruft, es sei denn, der IRP-Hauptfunktionscode, der weitergeleitet wird, ist einer der folgenden: |
|
Die IrqlApcLte-Regel gibt an, dass der Treiber ObGetObjectSecurity und ObReleaseObjectSecurity nur aufruft, wenn er unter IRQL <= APC_LEVEL ausgeführt wird. |
|
Die IrqlDispatch-Regel gibt an, dass der Treiber die folgenden DDIs nur aufruft, wenn er mit IRQL = DISPATCH_LEVEL ausgeführt wird. |
|
Die IrqlExAllocatePool-Regel gibt an, dass der Treiber ExAllocatePoolWithTag und ExAllocatePoolWithTagPriority nur aufruft, wenn er unter IRQL<=DISPATCH_LEVEL ausgeführt wird. |
|
Die IrqlExApcLte1-Regel gibt an, dass der Treiber ExAcquireFastMutex und ExTryToAcquireFastMutex nur bei IRQL <= APC_LEVEL aufruft. |
|
Die IrqlExApcLte2-Regel gibt an, dass der Treiber die folgenden Routinen nur bei IRQL <= APC_LEVEL aufruft. |
|
Die IrqlExApcLte3-Regel gibt an, dass der Treiber die folgenden Supportroutinen für Führungskräfte nur unter IRQL <= APC_LEVEL aufruft. |
|
Die IrqlExApcLteInline-Regel gibt an, dass DDIs nur auf den richtigen IRQL-Ebenen aufgerufen werden. |
|
Die IrqlExFree1-Regel gibt an, dass ExFreePool und ExFreePoolWithTag am richtigen IRQL aufgerufen werden. |
|
Die IrqlExFree2-Regel gibt an, dass ExFreePool und ExFreePoolWithTag zum richtigen IRQL aufgerufen werden. |
|
Die IrqlExFree3-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei der richtigen IRQL aufgerufen werden. |
|
Die IrqlExPassive-Regel gibt an, dass der Treiber die folgenden Executive Support-Routinen nur bei IRQL = PASSIVE_LEVEL aufruft: Die IrqlExPassive-Regel gibt auch an, dass der Treiber ExRaiseStatus unter IRQL <= APC_LEVEL |
|
Die IrqlIoApcLte-Regel gibt an, dass der Treiber die folgenden E/A-Managerroutinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlIoDispatch-Regel gibt an, dass der Treiber die folgenden E/A-Manager-Routinen nur aufruft, wenn er unter IRQL <= DISPATCH_LEVEL ausgeführt wird: IoGetDeviceToVerify, IoSetDeviceToVerify. |
|
Die IrqlIoPassive1-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlIoPassive2-Regel gibt an, dass der Treiber die folgenden E/A-Manager-Routinen nur bei IRQL = PASSIVE_LEVEL aufruft: |
|
Die IrqlIoPassive3-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlIoPassive4-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlIoPassive5-Regel gibt an, dass der Treiber bestimmte E/A-Manager-Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlIoRtlZwPassive-Regel gibt an, dass der Treiber bestimmte E/A-Manager-Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlKeApcLte1-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlKeApcLte2-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlKeDispatchLte-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er mit IRQL <= DISPATCH_LEVEL ausgeführt wird: |
|
Die IrqlKeRaiseLower-Regel gibt an, dass der Treiber beim Heben und Senken des IRQL folgendes ausführt: Wenn der Treiber KeRaiseIrql aufruft, wird er an einem IRQL ausgeführt, der niedriger oder gleich dem Wert des NewIrql-Parameters ist.Der Treiber ruft KeLowerIrql nur nach dem Aufruf von KeRaiseIrql oder KeRaiseIrqlToDpcLevel auf. |
|
Die IrqlKeRaiseLower2-Regel gibt an, dass Treiber KeLowerIrql verwenden, um die ursprüngliche IRQL wiederherzustellen, die durch einen vorherigen Aufruf von KeRaiseIrql oder KeRaiseIrqlToDpcLevel ausgelöst wurde. |
|
Die IrqlKeReleaseSpinLock-Regel gibt an, dass der Treiber KeReleaseSpinLock nur aufruft, wenn er mit IRQL = DISPATCH_LEVEL ausgeführt wird. |
|
Die IrqlKeSetEvent-Regel gibt an, dass die KeSetEvent-Routine nur bei IRQL <= DISPATCH_LEVEL aufgerufen wird, wenn Wait auf FALSE festgelegt ist, und bei IRQL <= APC_LEVEL, wenn Wait auf TRUE festgelegt ist. |
|
Die IrqlKeWaitForMutexObject-Regel gibt den Treiber an, der die KeWaitForMutexObject-Routine beim richtigen IRQL basierend auf dem Wert des Timeoutparameters aufrufen soll: |
|
Die IrqlKeWaitForMultipleObjects-Regel gibt an, dass Aufrufer der KeWaitForMultipleObjects-Routine basierend auf dem Timeoutparameter mit dem richtigen IRQL ausgeführt werden müssen. |
|
Die IrqlMmApcLte-Regel gibt an, dass der Treiber die folgenden Speicher-Manager-Routinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlMmDispatch-Regel gibt an, dass der Treiber MmFreeContiguousMemory nur aufruft, wenn er mit IRQL <= DISPATCH_LEVEL ausgeführt wird. |
|
Die IIrqlNtifsApcPassive-Regel gibt an, dass der Treiber die in der Regel aufgeführten DDIs nur aufruft, wenn er entweder bei IRQL = PASSIVE_LEVEL oder bei IRQL <= APC_LEVEL ausgeführt wird. |
|
Die IrqlObPassive-Regel gibt an, dass der Treiber ObReferenceObjectByHandle nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlPsPassive-Regel gibt an, dass der Treiber die folgenden Prozessstrukturroutinen nur aufruft , wenn er unter IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlReturn-Regel gibt an, dass die Dispatchroutinen des Treibers mit derselben IRQL zurückgegeben werden, bei der sie aufgerufen wurden. |
|
Die IrqlRtlPassive-Regel gibt an, dass der Treiber RtlDeleteRegistryValue nur aufruft , wenn er unter IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlZwPassive-Regel gibt an, dass der Treiber ZwClose nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird. |
So wählen Sie den Irql-Regelsatz aus
Wählen Sie Ihr Treiberprojekt (.vcxProj) in Microsoft Visual Studio aus. Klicken Sie im Menü Treiber auf Statische Treiberüberprüfung starten....
Klicken Sie auf die Registerkarte Regeln . Wählen Sie unter Regelsätzedie Option Irql aus.
Um den Standardregelsatz in einem Visual Studio-Eingabeaufforderungsfenster für Entwickler auszuwählen, geben Sie Irql.sdv mit der Option /check an . Beispiel:
msbuild /t:sdv /p:Inputs="/check:Irql.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
Weitere Informationen finden Sie unter Using Static Driver Verifier to Find Defects in Drivers and Static Driver Verifier commands (MSBuild).