Freigeben über


E/A-Überprüfung

Die Treiberüberprüfung verfügt über zwei Ebenen der E/A-Überprüfung:

  • E/A-Verifizierung der Stufe 1 ist immer aktiv, wenn die E/A-Verifizierung ausgewählt ist.

  • Die E/A-Überprüfung der Stufe 2 ist immer aktiv, wenn die E/A-Überprüfung in Windows XP und höher ausgewählt ist.

Siehe auch:Erweiterte E/A-Überprüfung in Windows 7 und höheren Versionen des Windows-Betriebssystems wird die erweiterte E/A-Überprüfung automatisch aktiviert, wenn Sie die E/A-Überprüfung auswählen. Sie ist nicht verfügbar oder muss als separate Option ausgewählt werden.

Stufe 1 I/O-Überprüfung

Wenn die I/O-Überprüfung der Ebene 1 aktiviert ist, werden alle IRPs, die über IoAllocateIrp abgerufen wurden, von einem speziellen Pool zugewiesen, und ihre Verwendung wird nachverfolgt.

Darüber hinaus überprüft das Treiberüberwachungsprogramm ungültige E/A-Aufrufe, einschließlich:

  • Versucht, ein IRP freizugeben, dessen Typ nicht IO_TYPE_IRP ist.

  • Das Übergeben von ungültigen Geräteobjekten an IoCallDriver

  • Übergebene IRPs an IoCompleteRequest, die einen ungültigen Status enthalten oder weiterhin eine Abbruchroutine gesetzt haben

  • Änderungen am IRQL über einen Aufruf der Treiberweiterleitungsroutine

  • Versuche, ein IRP frei zu geben, das einem Thread zugeordnet bleibt

  • Übergeben eines Geräteobjekts an IoInitializeTimer , das bereits einen initialisierten Timer enthält

  • Übergeben eines ungültigen Puffers an IoBuildAsynchronousFsdRequest oder IoBuildDeviceIoControlRequest

  • Übergibt einen E/A-Statusblock an einen IRP, wenn dieser E/A-Statusblock auf einem Stapel zugewiesen wird, der zu weit aufgewobt ist

  • Übergibt ein Ereignisobjekt an ein IRP, wenn dieses Ereignisobjekt auf einem Stapel zugeordnet ist, der zu weit gewobt ist

Da der spezielle IRP-Pool eine begrenzte Größe hat, ist die E/A-Überprüfung am effektivsten, wenn er nur auf einem Treiber gleichzeitig verwendet wird.

Fehler der E/A-Überprüfungsstufe 1 führen dazu, dass Fehlerüberprüfungen 0xC9 ausgestellt werden. Der erste Parameter dieser Fehlerüberprüfung gibt an, welche Verletzung aufgetreten ist. Eine vollständige Parameterauflistung finden Sie unter "Bugcheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION)".

Stufe 2 Ein-/Ausgabe-Überprüfung

Fehler der E/A-Überprüfungsebene 2 werden auf unterschiedliche Weise angezeigt: auf dem blauen Bildschirm, in einer Absturzabbilddatei und in einem Kerneldebugger.

Auf dem blauen Bildschirm werden diese Fehler durch die Meldung IO SYSTEM VERIFICATION ERROR und die Zeichenfolge WDM DRIVER ERRORXXX angegeben, wobei XXX ein E/A-Fehlercode ist.

In einer Absturzabbilddatei werden die meisten dieser Fehler durch die Meldung BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) zusammen mit dem E/A-Fehlercode angezeigt. In diesem Fall wird der E/A-Fehlercode als erster Parameter der Fehlerüberprüfung 0xC9 angezeigt. Der Rest wird durch die Meldung Bug-Check 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) zusammen mit einem Driver Verifier-Fehlercode angegeben. In diesem Fall wird der Fehlercode "Driver Verifier" als erster Parameter der Fehlerüberprüfung 0xC4 angezeigt.

In einem Kerneldebugger (KD oder WinDbg) werden diese Fehler durch die Meldung WDM DRIVER ERROR und eine beschreibende Textzeichenfolge angegeben. Wenn der Kerneldebugger aktiv ist, ist es möglich, die Fehler der Ebene 2 zu ignorieren und den Systemvorgang fortzusetzen. (Dies ist bei anderen Fehlerüberprüfungen nicht möglich.)

Der Blaue Bildschirm, die Absturzabbilddatei und der Kerneldebugger zeigen ebenfalls zusätzliche Informationen an. Eine vollständige Beschreibung der meisten E/A-Überprüfungsstufe 2-Fehlermeldungen finden Sie unter Fehlerüberprüfung 0xC9. Weitere Informationen finden Sie unter "Fehlerüberprüfung 0xC4".

Ab Windows Vista sucht die E/A-Überprüfungsoption nach den folgenden Treiberfehlern:

Ab Windows 7 sucht die E/A-Überprüfungsoption nach den folgenden Treiberfehlern:

  • Versucht, IRPs durch Aufrufen von ExFreePool freizurufen. IRPs müssen mit IoFreeIrp freigegeben werden.

Darüber hinaus können Sie diese Option verwenden, um einen weiteren häufigen Treiberfehler zu erkennen—die Reinitialisierung von Entfernungssperren. Entfernen Von Sperren sollten Datenstrukturen innerhalb von Geräteerweiterungen zugewiesen werden. Dadurch wird sichergestellt, dass der E/A-Manager den Speicher freigibt, der die IO_REMOVE_LOCK Struktur nur enthält, wenn das Geräteobjekt gelöscht wird. Wenn der Treiber die folgenden drei Schritte ausführt, ist es möglich, dass nach Schritt 2 eine Anwendung oder ein Treiber weiterhin einen Verweis auf Device1 enthält:

  • Ordnet die "IO_REMOVE_LOCK"-Struktur zu, die zu Device1 gehört, aber die Zuordnung erfolgt außerhalb des Erweiterungsbereichs von Device1.
  • Ruft IoReleaseRemoveLockAndWait auf, wenn Device1 entfernt wird.
  • Ruft IoInitializeRemoveLock für dieselbe Sperre auf, um sie als Entfernungssperre für Device2 wiederzuverwenden.

Es ist möglich, dass nach Schritt 2 eine Anwendung oder ein Treiber weiterhin einen Verweis auf Device1 enthält. Die Anwendung oder der Treiber kann weiterhin Anforderungen an Device1 senden, obwohl dieses Gerät entfernt wurde. Daher ist es nicht sicher, denselben Speicher wie eine neue Entfernungssperre wiederzuverwenden, bis der E/A-Manager Device1 löscht. Erneutes Initialisieren der gleichen Sperre, während ein anderer Thread versucht, es zu erwerben, kann zu einer Beschädigung der Sperre führen, mit unvorhersehbaren Ergebnissen für den Treiber und das gesamte System.

In Windows 7 und höheren Versionen des Windows-Betriebssystems wird die erweiterte E/A-Überprüfung automatisch aktiviert, wenn Sie die E/A-Überprüfung auswählen.

Aktivieren dieser Option

Sie können das E/A-Überprüfungsfeature für einen oder mehrere Treiber aktivieren, indem Sie den Treiberüberprüfungs-Manager oder die Verifier.exe Befehlszeile verwenden. Ausführliche Informationen finden Sie unter Auswählen von Treiberüberprüfungsoptionen.

  • An der Befehlszeile.

    In der Befehlszeile wird die E/A-Überprüfungsoption durch Bit 4 (0x10) dargestellt. Um die E/A-Überprüfung zu aktivieren, verwenden Sie einen Flagwert von 0x10 oder fügen Sie 0x10 zum Flagwert hinzu. Beispiel:

    verifier /flags 0x10 /driver MyDriver.sys
    

    Das Feature wird nach dem nächsten Start aktiv.

    Sie können die E/A-Überprüfung auch aktivieren und deaktivieren, ohne den Computer neu zu starten, indem Sie dem Befehl den Parameter "/volatile " hinzufügen. Beispiel:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    Diese Einstellung ist sofort wirksam, geht aber verloren, wenn Sie den Computer herunterfahren oder neu starten. Ausführliche Informationen finden Sie unter Verwenden von flüchtigen Einstellungen.

    Das E/A-Überprüfungsfeature ist auch in den Standardeinstellungen enthalten. Beispiel:

    verifier /standard /driver MyDriver.sys
    
  • Verwenden des Treiberüberprüfungs-Managers

    1. Wählen Sie "Benutzerdefinierte Einstellungen erstellen" (für Codeentwickler) aus, und klicken Sie dann auf "Weiter".
    2. Wählen Sie aus einer vollständigen Liste "Einzelne Einstellungen" aus.
    3. Aktivieren (überprüfen) Sie die E/A-Überprüfung.

    Das E/A-Überprüfungsfeature ist auch in den Standardeinstellungen enthalten. Um dieses Feature zu verwenden, klicken Sie im Treiberüberprüfungs-Manager auf "Standardeinstellungen erstellen".