Freigeben über


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

ForwardedAtBadIrql

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:

ForwardedAtBadIrqlAllocate

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:

ForwardedAtBadIrqlFsdAsync

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:

ForwardedAtBadIrqlFsdSync

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:

IrqlApcLte

Die IrqlApcLte-Regel gibt an, dass der Treiber ObGetObjectSecurity und ObReleaseObjectSecurity nur aufruft, wenn er unter IRQL <= APC_LEVEL ausgeführt wird.

IrqlDispatch

Die IrqlDispatch-Regel gibt an, dass der Treiber die folgenden DDIs nur aufruft, wenn er mit IRQL = DISPATCH_LEVEL ausgeführt wird.

IrqlExAllocatePool

Die IrqlExAllocatePool-Regel gibt an, dass der Treiber ExAllocatePoolWithTag und ExAllocatePoolWithTagPriority nur aufruft, wenn er unter IRQL<=DISPATCH_LEVEL ausgeführt wird.

IrqlExApcLte1

Die IrqlExApcLte1-Regel gibt an, dass der Treiber ExAcquireFastMutex und ExTryToAcquireFastMutex nur bei IRQL <= APC_LEVEL aufruft.

IrqlExApcLte2

Die IrqlExApcLte2-Regel gibt an, dass der Treiber die folgenden Routinen nur bei IRQL <= APC_LEVEL aufruft.

IrqlExApcLte3

Die IrqlExApcLte3-Regel gibt an, dass der Treiber die folgenden Supportroutinen für Führungskräfte nur unter IRQL <= APC_LEVEL aufruft.

IrqlExApcLteInline

Die IrqlExApcLteInline-Regel gibt an, dass DDIs nur auf den richtigen IRQL-Ebenen aufgerufen werden.

IrqlExFree1

Die IrqlExFree1-Regel gibt an, dass ExFreePool und ExFreePoolWithTag am richtigen IRQL aufgerufen werden.

IrqlExFree2

Die IrqlExFree2-Regel gibt an, dass ExFreePool und ExFreePoolWithTag zum richtigen IRQL aufgerufen werden.

IrqlExFree3

Die IrqlExFree3-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei der richtigen IRQL aufgerufen werden.

IrqlExPassive

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

IrqlIoApcLte

Die IrqlIoApcLte-Regel gibt an, dass der Treiber die folgenden E/A-Managerroutinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird:

IrqlIoDispatch

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.

IrqlIoPassive1

Die IrqlIoPassive1-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird:

IrqlIoPassive2

Die IrqlIoPassive2-Regel gibt an, dass der Treiber die folgenden E/A-Manager-Routinen nur bei IRQL = PASSIVE_LEVEL aufruft:

IrqlIoPassive3

Die IrqlIoPassive3-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird:

IrqlIoPassive4

Die IrqlIoPassive4-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird:

IrqlIoPassive5

Die IrqlIoPassive5-Regel gibt an, dass der Treiber bestimmte E/A-Manager-Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird.

IrqlIoRtlZwPassive

Die IrqlIoRtlZwPassive-Regel gibt an, dass der Treiber bestimmte E/A-Manager-Routinen nur aufruft, wenn er mit IRQL = PASSIVE_LEVEL ausgeführt wird.

IrqlKeApcLte1

Die IrqlKeApcLte1-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird:

IrqlKeApcLte2

Die IrqlKeApcLte2-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird:

IrqlKeDispatchLte

Die IrqlKeDispatchLte-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er mit IRQL <= DISPATCH_LEVEL ausgeführt wird:

IrqlKeRaiseLower

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.

IrqlKeRaiseLower2

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.

IrqlKeReleaseSpinLock

Die IrqlKeReleaseSpinLock-Regel gibt an, dass der Treiber KeReleaseSpinLock nur aufruft, wenn er mit IRQL = DISPATCH_LEVEL ausgeführt wird.

IrqlKeSetEvent

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.

IrqlKeWaitForMutexObject

Die IrqlKeWaitForMutexObject-Regel gibt den Treiber an, der die KeWaitForMutexObject-Routine beim richtigen IRQL basierend auf dem Wert des Timeoutparameters aufrufen soll:

IrqlKeWaitForMultipleObjects

Die IrqlKeWaitForMultipleObjects-Regel gibt an, dass Aufrufer der KeWaitForMultipleObjects-Routine basierend auf dem Timeoutparameter mit dem richtigen IRQL ausgeführt werden müssen.

IrqlMmApcLte

Die IrqlMmApcLte-Regel gibt an, dass der Treiber die folgenden Speicher-Manager-Routinen nur aufruft, wenn er mit IRQL <= APC_LEVEL ausgeführt wird:

IrqlMmDispatch

Die IrqlMmDispatch-Regel gibt an, dass der Treiber MmFreeContiguousMemory nur aufruft, wenn er mit IRQL <= DISPATCH_LEVEL ausgeführt wird.

IrqlNtifsApcPassive

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.

IrqlObPassive

Die IrqlObPassive-Regel gibt an, dass der Treiber ObReferenceObjectByHandle nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird.

IrqlPsPassive

Die IrqlPsPassive-Regel gibt an, dass der Treiber die folgenden Prozessstrukturroutinen nur aufruft , wenn er unter IRQL = PASSIVE_LEVEL ausgeführt wird:

IrqlReturn

Die IrqlReturn-Regel gibt an, dass die Dispatchroutinen des Treibers mit derselben IRQL zurückgegeben werden, bei der sie aufgerufen wurden.

IrqlRtlPassive

Die IrqlRtlPassive-Regel gibt an, dass der Treiber RtlDeleteRegistryValue nur aufruft , wenn er unter IRQL = PASSIVE_LEVEL ausgeführt wird.

IrqlZwPassive

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

  1. Wählen Sie Ihr Treiberprojekt (.vcxProj) in Microsoft Visual Studio aus. Klicken Sie im Menü Treiber auf Statische Treiberüberprüfung starten....

  2. 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).