E/A-Überprüfung
Die Treiberüberprüfung verfügt über zwei Ebenen der E/A-Überprüfung:
Die E/A-Überprüfung der Ebene 1 ist immer aktiv, wenn die E/A-Überprüfung 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.
Überprüfung der Stufe 1
Wenn die Überprüfung der Ebene 1 aktiviert ist, werden alle irPs, die über IoAllocateIrp abgerufen wurden, von einem speziellen Pool zugewiesen und deren Verwendung wird nachverfolgt.
Darüber hinaus überprüft die Treiberüberprüfung auf ungültige E/A-Aufrufe, einschließlich:
Versucht, ein IRP freizugeben, dessen Typ nicht IO_TYPE_IRP
Übergeben ungültiger Geräteobjekte an IoCallDriver
Übergeben eines IRP an IoCompleteRequest , das den ungültigen Status enthält oder weiterhin einen Abbruchroutinesatz aufweist
Ä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 "Bug Check 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION)".
Überprüfung der Ebene 2
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 festgestellt. In diesem Fall wird der E/A-Fehlercode als erster Parameter der Fehlerüberprüfung 0xC9 angezeigt. Der Rest wird durch die Meldung Fehlerüberprüfung 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION) zusammen mit einem Treiberüberprüfungsfehlercode 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:
Es dauert zu lange, bis IRPs abgeschlossen und abgebrochen werden, die von Anwendungen im Benutzermodus stammen.
Freigeben einer entfernten Sperre, die noch nicht erworben wurde.
Aufrufen von IoReleaseRemoveLock oder IoReleaseRemoveLockAndWait mit einem Tagparameter, der sich von dem tagparameter unterscheidet, der im entsprechenden IoAcquireRemoveLock-Aufruf verwendet wird.
Aufrufen von IoCallDriver mit deaktivierten Unterbrechungen.
Aufrufen von IoCallDriver bei IRQL größer als DISPATCH_LEVEL.
Zurückgeben von einer Fahrerversandroutine mit deaktivierten Unterbrechungen.
Zurückgeben von einer Treiberverteilerroutine mit einem geänderten IRQL.
Zurückgeben von einer Treiberversandroutine mit deaktivierten APCs. In diesem Fall hat der Treiber "KeEnterCriticalRegion" möglicherweise mehrmals als KeLeaveCriticalRegion bezeichnet, was die Hauptursache für die Fehlerprüfung 0x20 (KERNEL_APC_PENDING_DURING_EXIT) und die Fehlerprüfung 0x1 (APC_INDEX_MISMATCH) ist.
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 anderen häufig auftretenden Treiberfehler zu erkennen– entfernen Sie sperrungen erneut. 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:
- Weist die IO_REMOVE_LOCK Struktur zu, die Device1 entspricht, aber die Zuordnung außerhalb der Erweiterung von Device1 erfolgt.
- 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. Zum 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. Zum 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 veränderliche Einstellungen.
Das E/A-Überprüfungsfeature ist auch in den Standardeinstellungen enthalten. Zum Beispiel:
verifier /standard /driver MyDriver.sys
Verwenden des Treiberüberprüfungs-Managers
- Wählen Sie "Benutzerdefinierte Einstellungen erstellen" (für Codeentwickler) aus, und klicken Sie dann auf "Weiter".
- Wählen Sie "Einzelne Einstellungen auswählen" aus einer vollständigen Liste aus.
- 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".