Freigeben über


IRQL-Regelsatz (WDM)

Verwenden Sie diese Regeln, um zu überprüfen, ob Ihr Treiber DDI-Anrufe mit dem erforderlichen IRQL tätigt.

Ein Treiber, der nicht den IRQL-Regeln folgt, kann während des Vorgangs 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 Regel ForwardedAtBadIrqlAllocate legt fest, dass der Treiber IoCallDriver und PoCallDriver bei IRQL<DISPATCH_LEVEL aufrufen sollte, es sei denn, der IRP-Hauptfunktionscode, der weitergeleitet wird, ist einer der folgenden:

ForwardedAtBadIrqlFsdAsync

Die Regel ForwardedAtBadIrqlFsdAsync legt fest, dass der Treiber IoCallDriver und PoCallDriver auf IRQL<DISPATCH_LEVEL aufrufen muss, es sei denn, der IRP-Hauptfunktionscode, der weitergeleitet wird, ist einer der folgenden:

ForwardedAtBadIrqlFsdSync

Die Regel ForwardedAtBadIrqlFsdSync legt fest, dass der Treiber IoCallDriver und PoCallDriver bei IRQL<DISPATCH_LEVEL aufrufen, 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 dann aufruft, wenn er bei IRQL <= APC_LEVEL ausgeführt wird.

IrqlDispatch

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

IrqlExAllocatePool

Die IrqlExAllocatePool-Regel gibt an, dass der Treiber ExAllocatePoolWithTag und ExAllocatePoolWithTagPriority nur aufruft, wenn er bei 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 der Geschäftsleitung nur bei IRQL <= APC_LEVEL aufruft.

IrqlExApcLteInline

Die IrqlExApcLteInline-Regel gibt an, dass DDIs nur auf ordnungsgemäßen IRQL-Ebenen aufgerufen werden.

IrqlExFree1

Die IrqlExFree1-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei ordnungsgemäßen IRQL aufgerufen werden.

IrqlExFree2

Die IrqlExFree2-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei ordnungsgemäßen IRQL aufgerufen werden.

IrqlExFree3

Die IrqlExFree3-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei ordnungsgemäßen IRQL aufgerufen werden.

IrqlExPassive

Die Regel IrqlExPassive legt fest, dass der Treiber die folgenden Routinen zur Unterstützung der Exekutive nur bei IRQL = PASSIVE_LEVEL aufruft:

Die IrqlExPassive-Regel gibt auch an, dass der Treiber ExRaiseStatus bei IRQL <= APC_LEVEL aufruft.

IrqlIoApcLte

Die IrqlIoApcLte-Regel gibt an, dass der Treiber die folgenden I/O-Manager-Routinen nur aufruft, wenn er bei IRQL <= APC_LEVEL ausgeführt wird:

IrqlIoDispatch

Die IrqlIoDispatch-Regel gibt an, dass der Treiber die folgenden I/O-Manager-Routinen nur aufruft, wenn er bei IRQL <= DISPATCH_LEVEL ausgeführt wird: IoGetDeviceToVerify, IoSetDeviceToVerify.

IrqlIoPassive1

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

IrqlIoPassive2

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

IrqlIoPassive3

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

IrqlIoPassive4

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

IrqlIoPassive5

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

IrqlIoRtlZwPassive

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

IrqlKeApcLte1

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

IrqlKeApcLte2

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

IrqlKeDispatchLte

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

IrqlKeRaiseLower

Die IrqlKeRaiseLower-Regel gibt an, dass der Treiber beim Auslösen und Verringern des IRQL Folgendes ausführt:

Wenn der Treiber KeRaiseIrql aufruft, wird er an einer IRQL ausgeführt, die niedriger als oder gleich dem Wert des NewIrql-Parameters ist.
Der Treiber ruft KeLowerIrql erst nach dem Aufruf von KeRaiseIrql oder KeRaiseIrqlToDpcLevelauf.

IrqlKeRaiseLower2

Die IrqlKeRaiseLower2-Regel gibt an, dass Treiber KeLowerIrql zum Wiederherstellen des ursprünglichen IRQL verwenden, das 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 bei 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 legt für den Treiber fest, die KeWaitForMutexObject-Routine basierend auf dem Wert des Timeout-Parameters beim richtigen IRQL aufzurufen.

IrqlKeWaitForMultipleObjects

Die IrqlKeWaitForMultipleObjects-Regel gibt an, dass Aufrufer der KeWaitForMultipleObjects-Routine bei ordnungsgemäßem IRQL basierend auf dem Parameter Timeout laufen müssen.

IrqlMmApcLte

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

IrqlMmDispatch

Die IrqlMmDispatch-Regel gibt an, dass der Treiber MmFreeContiguousMemory nur aufruft, wenn er bei 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 spezifischen Prozessstrukturroutinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird.

IrqlReturn

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

IrqlRtlPassive

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

IrqlZwPassive

Die IrqlZwPassive-Regel gibt an, dass der Treiber ZwClose nur aufruft, wenn er bei 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ätze" "Irql" aus.

    Um den Standardregelsatz aus einem Visual Studio-Entwickler-Eingabeaufforderungsfenster 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 Verwendung von Static Driver Verifier zur Fehlererkennung in Treibern und Befehle für Static Driver Verifier (MSBuild).