Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 |
|---|---|
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 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: |
|
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: |
|
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: |
|
Die IrqlApcLte-Regel gibt an, dass der Treiber ObGetObjectSecurity und ObReleaseObjectSecurity nur dann aufruft, wenn er bei IRQL <= APC_LEVEL ausgeführt wird. |
|
Die IrqlDispatch-Regel gibt an, dass der Treiber die folgenden DDIs nur aufruft, wenn er bei IRQL = DISPATCH_LEVEL ausgeführt wird. |
|
Die IrqlExAllocatePool-Regel gibt an, dass der Treiber ExAllocatePoolWithTag und ExAllocatePoolWithTagPriority nur aufruft, wenn er bei 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 der Geschäftsleitung nur bei IRQL <= APC_LEVEL aufruft. |
|
Die IrqlExApcLteInline-Regel gibt an, dass DDIs nur auf ordnungsgemäßen IRQL-Ebenen aufgerufen werden. |
|
Die IrqlExFree1-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei ordnungsgemäßen IRQL aufgerufen werden. |
|
Die IrqlExFree2-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei ordnungsgemäßen IRQL aufgerufen werden. |
|
Die IrqlExFree3-Regel gibt an, dass ExFreePool und ExFreePoolWithTag bei ordnungsgemäßen IRQL aufgerufen werden. |
|
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. |
|
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: |
|
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. |
|
Die IrqlIoPassive1-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlIoPassive2-Regel gibt an, dass der Treiber die folgenden I/O-Manager-Routinen nur bei IRQL = PASSIVE_LEVEL aufruft: |
|
Die IrqlIoPassive3-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlIoPassive4-Regel gibt an, dass der Treiber die folgenden Routinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird: |
|
Die IrqlIoPassive5-Regel gibt an, dass der Treiber bestimmte I/O-Manager-Routinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlIoRtlZwPassive-Regel gibt an, dass der Treiber bestimmte I/O-Manager-Routinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlKeApcLte1-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er bei IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlKeApcLte2-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er bei IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlKeDispatchLte-Regel gibt an, dass der Treiber die folgenden Kernelroutinen nur aufruft, wenn er bei IRQL <= DISPATCH_LEVEL ausgeführt wird: |
|
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. |
|
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. |
|
Die IrqlKeReleaseSpinLock-Regel gibt an, dass der Treiber KeReleaseSpinLock nur aufruft, wenn er bei 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 legt für den Treiber fest, die KeWaitForMutexObject-Routine basierend auf dem Wert des Timeout-Parameters beim richtigen IRQL aufzurufen. |
|
Die IrqlKeWaitForMultipleObjects-Regel gibt an, dass Aufrufer der KeWaitForMultipleObjects-Routine bei ordnungsgemäßem IRQL basierend auf dem Parameter Timeout laufen müssen. |
|
Die IrqlMmApcLte-Regel gibt an, dass der Treiber die folgenden Speicher-Manager-Routinen nur aufruft, wenn er bei IRQL <= APC_LEVEL ausgeführt wird: |
|
Die IrqlMmDispatch-Regel gibt an, dass der Treiber MmFreeContiguousMemory nur aufruft, wenn er bei 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 spezifischen Prozessstrukturroutinen nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
Die IrqlReturn-Regel gibt an, dass die Verteilerroutinen des Treibers an derselben IRQL zurückgegeben werden, an der sie aufgerufen wurden. |
|
Die IrqlRtlPassive-Regel gibt an, dass der Treiber RtlDeleteRegistryValue nur aufruft, wenn er bei IRQL = PASSIVE_LEVEL ausgeführt wird. |
|
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
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ä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=Win32Weitere Informationen finden Sie unter Verwendung von Static Driver Verifier zur Fehlererkennung in Treibern und Befehle für Static Driver Verifier (MSBuild).