Fehlerüberprüfung 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL

FDie DRIVER_IRQL_NOT_LESS_OR_EQUAL Fehlerüberprüfung hat einen Wert von 0x000000D1. Dies weist darauf hin, dass ein Kernelmodustreiber versucht hat, auf auslagerbaren Speicher zuzugreifen, während der Prozess-IRQL zu hoch war.

Wichtig

Dieser Artikel richtet sich an Programmierer*innen. Wenn Sie ein/eine Kund*in sind, der/die einen Bluescreen-Fehlercode bei der Benutzung eines Computers erhalten hat, lesen Sie bitte Fehlerbehebung bei Bluescreen-Fehlern.

DRIVER_IRQL_NOT_LESS_OR_EQUAL Parameter

Parameter Beschreibung

1

Arbeitsspeicher verwiesen.

2

IRQL zum Zeitpunkt des Verweises.

3

  • 0 - Lesen
  • 1 - Schreiben
  • 2 - Ausführen
  • 8 - Ausführen

4

Adresse, auf die verwiesen wird. Verwenden Sie "ln " (die nächstgelegenen Symbole auflisten) für diese Adresse, um den Namen der Funktion anzuzeigen.

Ursache

Um die Ursache zu ermitteln, sind der Windows-Debugger, Programmiererfahrung und Zugriff auf den Quellcode des fehlerhaften Moduls erforderlich.

Wenn dieser Fehler auftritt, hat ein Treiber normalerweise versucht, auf eine auslagerbare (oder völlig ungültige) Adresse zuzugreifen, während die Interrupt-Anforderungsebene (IRQL) zu hoch war. Mögliche Ursachen:

  • Dereferenzierung eines fehlerhaften Zeigers (z. B. eines NULL-Zeigers oder eines freigegebenen Zeigers) während der Ausführung auf oder über DISPATCH_LEVEL.

  • Zugriff auf auslagerbare Daten auf oder über DISPATCH_LEVEL.

  • Ausführung von auslagerbarem Code auf oder über DISPATCH_LEVEL.

Wenn ein Treiber, der für den Fehler zuständig ist, identifiziert werden kann, wird sein Name auf dem blauen Bildschirm gedruckt und am Speicherort (PUNICODE_STRING) KiBugCheckDriver im Speicher gespeichert. Sie können den Debugger-Befehl dx (display debugger object model expression) verwenden, um Folgendes anzuzeigen: dx KiBugCheckDriver.

Diese Fehlerüberprüfung wird in der Regel durch Treiber verursacht, die unsachgemäße Speicheradressen verwendet haben.

Mögliche Ursachen für den Seitenfehler sind die folgenden Ereignisse:

  • Die Funktion wurde als seitenfähig markiert und in einem IRQL mit erhöhten Rechten ausgeführt (einschließlich des Abrufens einer Sperre).

  • Der Funktionsaufruf wurde an eine Funktion in einem anderen Treiber vorgenommen, und dieser Treiber wurde entladen.

  • Die Funktion wurde mithilfe eines Funktionszeigers aufgerufen, der ein ungültiger Zeiger war.

Weitere Informationen zu Windows IRLQs erhalten Sie unter Windows Internals 7th Edition Part 1 von Pavel Yosifovich, Mark E. Russinovich, David A. Solomon und Alex Ionescu.

Lösung

Wenn das Problem durch den Treiber verursacht wird, den Sie entwickeln, stellen Sie sicher, dass die Funktion, die zum Zeitpunkt der Fehlerüberprüfung ausgeführt wurde, folgendes ist:

  • Nicht als seitenfähig markiert
  • Ruft keine anderen Inlinefunktionen auf, die ausgelagert werden können.

Die !analyze-Debugerweiterung zeigt Informationen zur Fehlerüberprüfung an und kann bei der Ermittlung der Ursache hilfreich sein. Das folgende Beispiel ist die Ausgabe von !analyze.

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

Wenn ein Treiber, der für den Fehler zuständig ist, identifiziert werden kann, wird sein Name auf dem blauen Bildschirm gedruckt und am Speicherort (PUNICODE_STRING) KiBugCheckDriver im Speicher gespeichert. Sie könnendx (display debugger object model expression), einen Debuggerbefehl, verwenden, um Folgendes anzuzeigen:dx KiBugCheckDriver.

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

Wenn ein Trapframe in der Dumpdatei verfügbar ist, verwenden Sie den Befehl.trap, um den Kontext auf die angegebene Adresse festzulegen.

Um mit dem Debuggen dieser Art von Fehlerüberprüfung zu beginnen, untersuchen Sie die Stapelablaufverfolgung mithilfe der Befehle k, kb, kc, kd, kp, kP, kv (Display Stack Backtrace).

Führen Sie im Debugger den Befehl !irql aus, um Informationen über die IRQL eines Prozessors auf dem Zielcomputer anzuzeigen, bevor der Debugger umgebrochen wird. Zum Beispiel:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

In den meisten Fällen dieser Art von Fehlerüberprüfung ist das Problem nicht die IRQL-Ebene, sondern der Arbeitsspeicher, auf den zugegriffen wird.

Da diese Fehlerüberprüfung in der Regel durch Treiber verursacht wird, die unsachgemäße Speicheradressen verwendet haben, verwenden Sie Parameter 1, 3 und 4, um weitere Untersuchungen durchzuführen.

Verwenden Sie ln (listennächste Symbole) mit Parameter 4, um den Namen der aufgerufenen Funktion anzuzeigen. Überprüfen Sie außerdem die Ausgabe !analyze, um festzustellen, ob fehlerhafter Code identifiziert wird.

Verwenden Sie !pool für die Adresse "Parameter 1", um festzustellen, ob es sich um einen ausgelagerten Pool handelt. Verwenden Sie !address und den erweiterten Befehl !pte, um mehr über diesen Speicherbereich zu erfahren.

Verwenden Sie die Anzeigespeicherbefehle , um den Speicher zu untersuchen, auf den in Befehl in Parameter 1 verwiesen wird.

Verwenden Sie die Befehle u, ub, uu (unassemble), um den Code in der Adresse anzuzeigen, auf die im Parameter 4 auf den Speicher verwiesen wurde.

Mit dem Befehl lm t n können Sie die in den Speicher geladenen Module auflisten. Verwenden Sie !memusage, um den allgemeinen Zustand des Systemspeichers zu untersuchen.

Driver Verifier

Driver Verifier ist ein Tool, das in Echtzeit ausgeführt wird, um das Verhalten von Treibern zu untersuchen. Beispielsweise überprüft die Treiberüberprüfung die Verwendung von Speicherressourcen, z. B. Speicherpools. Wenn Fehler bei der Ausführung des Treibercodes festgestellt werden, wird proaktiv eine Ausnahme erstellt, damit dieser Teil des Treibercodes genauer untersucht werden kann. Der Treiberprüfer-Manager ist in Windows integriert und ist auf allen Windows-PCs verfügbar.

Um Driver Verifier Manager zu starten, geben Sie verifier in eine Eingabeaufforderung ein. Sie können konfigurieren, welche Treiber überprüft werden sollen. Der Code, der die Treiber überprüft, erhöht den Aufwand bei der Ausführung. Versuchen Sie daher, die kleinste Anzahl möglicher Treiber zu überprüfen. Weitere Informationen finden Sie unter Treiberüberprüfung.

Hinweise

Wenn Sie nicht mit dem Windows-Debugger für die Arbeit an diesem Problem ausgestattet sind, können Sie einige grundlegende Problembehandlungstechniken verwenden.

  • Überprüfen Sie das Systemprotokoll in der Ereignisanzeige auf weitere Fehlermeldungen, die Ihnen helfen könnten, das Gerät oder den Treiber zu identifizieren, das bzw. der die Fehlerüberprüfung verursacht.

  • Wenn in der Fehlerüberprüfungsmeldung ein Treiber angegeben ist, deaktivieren Sie den Treiber oder erkundigen Sie sich beim Hersteller nach Treiberupdates.

  • Bestätigen Sie, dass die neu installierte Hardware mit der installierten Windows-Version kompatibel ist. Informationen zur benötigten Hardware finden Sie beispielsweise unter Windows 10-Spezifikationen.

Weitere allgemeine Informationen zur Fehlerbehebung finden Sie unter Analysieren von Fehlerüberprüfungs-Bluescreen-Daten.