Share via


Fehlerüberprüfung 0xD1: DRIVER_IRQL_NOT_LESS_OR_EQUAL

Die DRIVER_IRQL_NOT_LESS_OR_EQUAL Fehlerüberprüfung hat den Wert 0x000000D1. Dies gibt an, dass ein Kernelmodustreiber versucht hat, auf auslagerungsfähigen Arbeitsspeicher zuzugreifen, während der Prozess-IRQL zu hoch war.

Wichtig

Dieser Artikel richtet sich an Programmierer. Wenn Sie ein Kunde sind, der während der Verwendung Ihres Computers einen Bluescreen-Fehlercode erhalten hat, finden Sie weitere Informationen unter Behandeln von Bluescreenfehlern.

DRIVER_IRQL_NOT_LESS_OR_EQUAL Parameter

Parameter BESCHREIBUNG

1

Speicherreferenziert.

2

IRQL zum Zeitpunkt der Referenz.

3

  • 0 – Lesen
  • 1 – Schreiben
  • 2 : Ausführen
  • 8 – Ausführen

4

Adresse, die auf den Arbeitsspeicher verweist. Verwenden Sie ln (nächste 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 in der Regel versucht, auf eine Adresse zuzugreifen, die auslagerungsfähig ist (oder die vollständig ungültig ist), während die Interruptanforderungsstufe (Interrupt Request Level, 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 identifiziert werden kann, der für den Fehler verantwortlich ist, wird sein Name auf dem blauen Bildschirm gedruckt und im Speicher am Speicherort (PUNICODE_STRING) KiBugCheckDriver gespeichert. Sie können dx (Debuggerobjektmodellausdruck anzeigen) verwenden, einen Debuggerbefehl, um folgendes anzuzeigen: dx KiBugCheckDriver.

Diese Fehlerüberprüfung wird in der Regel durch Treiber verursacht, die falsche Speicheradressen verwendet haben.

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

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

  • Der Funktionsaufruf wurde für eine Funktion in einem anderen Treiber ausgeführt, und dieser Treiber wurde entladen.

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

Weitere Informationen zu Windows IRQLs finden Sie unter Windows Internals 7. 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, lautet:

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

Die Debuggererweiterung !analyze zeigt Informationen zur Fehlerüberprüfung an und kann bei der Ermittlung der Grundursache hilfreich sein. Das folgende Beispiel wird von !analyze ausgegeben.

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 identifiziert werden kann, der für den Fehler verantwortlich ist, wird sein Name auf dem blauen Bildschirm gedruckt und im Speicher am Speicherort (PUNICODE_STRING) KiBugCheckDriver gespeichert. Sie können dx (Debuggerobjektmodellausdruck anzeigen) verwenden, einen Debuggerbefehl, 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 Ihren 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 (Stapelrückverfolgung anzeigen).

Führen Sie im Debugger den Befehl !irql aus, um Informationen zum IRQL eines Prozessors auf dem Zielcomputer anzuzeigen, bevor der Debugger unterbrochen wird. 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 falsche Speicheradressen verwendet haben, verwenden Sie die Parameter 1, 3 und 4, um weitere Untersuchungen zu erhalten.

Verwenden Sie ln (nächste Symbole auflisten) mit Parameter 4, um den Namen der aufgerufenen Funktion anzuzeigen. Überprüfen Sie auch die !analyze-Ausgabe , um festzustellen, ob fehlerbehafteter Code identifiziert wird.

Verwenden Sie !pool für die Adresse des Parameters 1, um zu ermitteln, 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 Arbeitsspeicher zu untersuchen, auf den im Befehl in Parameter 1 verwiesen wird.

Verwenden Sie die Befehle u, ub, uu (unassemble), um den Code in der Adresse anzuzeigen, der in Parameter 4 auf den Arbeitsspeicher verweist.

Verwenden Sie den Befehl lm t n , um Module aufzulisten, die in den Arbeitsspeicher geladen werden. Verwenden Sie !memusage , um den allgemeinen Zustand des Systemspeichers zu untersuchen.

Treiberüberprüfung

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

Um den Treiberüberprüfungs-Manager zu starten, geben Sie verifier an einer Eingabeaufforderung ein. Sie können konfigurieren, welche Treiber überprüft werden sollen. Der Code, der Die Treiber überprüft, verursacht bei der Ausführung zusätzlichen Mehraufwand. Versuchen Sie daher, die möglichst geringe Anzahl von Treibern zu überprüfen. Weitere Informationen finden Sie unter Treiberüberprüfung.

Hinweise

Wenn Sie nicht in der Lage sind, den Windows-Debugger zu verwenden, um dieses Problem zu beheben, können Sie einige grundlegende Problembehandlungstechniken verwenden.

  • Überprüfen Sie das Systemprotokoll in Ereignisanzeige auf zusätzliche Fehlermeldungen, die dazu beitragen können, das Gerät oder den Treiber zu identifizieren, das diese Fehlerüberprüfung verursacht.

  • Wenn in der Fehlerprüfungsmeldung ein Treiber angegeben ist, deaktivieren Sie ihn, oder wenden Sie sich an den Hersteller, um Treiberupdates anzufordern.

  • Vergewissern Sie sich, dass alle installierten neuen Hardwareversionen mit der installierten Version von Windows kompatibel sind. Sie können beispielsweise Informationen über die erforderliche Hardware unter Windows 10 Spezifikationen abrufen.

Weitere allgemeine Informationen zur Problembehandlung finden Sie unter Bluescreen-Daten.