Automatische Überprüfungen

Die Treiberüberprüfung führt die folgenden Überprüfungen durch, wenn ein oder mehrere Treiber überprüft werden. Sie können diese Überprüfungen nicht aktivieren oder deaktivieren. Ab der Windows 10 Version 1709 wurden diese automatischen Überprüfungen in relevante Standardflags verschoben. Daher sollte für Benutzer, die die Treiberüberprüfung mit den Standardflags aktivieren, keine Verringerung der angewendeten Überprüfungen angezeigt werden.

Überwachen von IRQL- und Arbeitsspeicherroutinen

Driver Verifier überwacht den ausgewählten Treiber auf die folgenden unzulässigen Aktionen:

  • Auslösen von IRQL durch Aufrufen von KeLowerIrql

  • Senken von IRQL durch Aufrufen von KeRaiseIrql

  • Anfordern einer Zuweisung von 0 Arbeitsspeicher (0)

  • Zuordnen oder Freigeben eines ausgelagerten Pools mit IRQL-APC_LEVEL >

  • Zuweisung oder Freigabe eines Pools ohne Auslagerung mit IRQL-DISPATCH_LEVEL >

  • Versuchen, eine Adresse freizugeben, die nicht von einer früheren Zuordnung zurückgegeben wurde

  • Versuchen, eine Adresse frei zu geben, die bereits freigegeben wurde

  • Abrufen oder Freigeben eines schnellen Mutex mit IRQL-APC_LEVEL >

  • Abrufen oder Freigeben einer Drehsperre mit IRQL nicht gleich DISPATCH_LEVEL

  • Doppeltes Freigeben einer Drehsperre.

  • Markieren einer Zuordnungsanforderung MUST_SUCCEED. Solche Anträge sind niemals zulässig.

Wenn driver verifier nicht aktiv ist, führen diese Verstöße möglicherweise nicht in allen Fällen zu einem sofortigen Systemabsturz. Driver Verifier überwacht das Verhalten des Treibers und gibt eine Fehlerüberprüfung 0xC4 aus, wenn eine dieser Verstöße auftritt. Eine Liste der Fehlerüberprüfungsparameter finden Sie unter 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).

Überwachen des Stapelwechsels

Driver Verifier überwacht die Stapelnutzung durch den zu überprüfenden Treiber. Wenn der Treiber seinen Stapel wechselt und der neue Stapel weder ein Threadstapel noch ein DPC-Stapel ist, wird eine Fehlerprüfung ausgeführt. (Dies ist eine Fehlerüberprüfung 0xC4, wobei der erste Parameter gleich 0x90 ist.) Der vom KB-Debuggerbefehl angezeigte Stapel zeigt in der Regel den Treiber an, der diesen Vorgang ausgeführt hat.

Überprüfen der Treiberentladung

Nachdem ein Treiber, der überprüft wird, entladen wurde, führt Driver Verifier mehrere Überprüfungen durch, um sicherzustellen, dass der Treiber bereinigt wurde.

Insbesondere sucht driver verifier nach:

  • Nicht elezierte Timer

  • Ausstehende Aufrufe verzögerter Prozeduren (DPCs)

  • Wiederherstellen von Lookaside-Listen

  • Wiederherstellen von Workerthreads

  • Wiederherstellen von Warteschlangen

  • Andere ähnliche Ressourcen

Probleme wie diese können möglicherweise dazu führen, dass Systemfehlerüberprüfungen eine Weile nach dem Entladen des Treibers durchgeführt werden, und die Ursache dieser Fehlerüberprüfungen kann schwer zu ermitteln sein. Wenn driver verifier aktiv ist, führen solche Verstöße dazu, dass die Fehlerüberprüfung 0xC7 sofort nach dem Entladen des Treibers durchgeführt wird. Eine Liste der Fehlerüberprüfungsparameter finden Sie unter Bug Check 0xC7 (TIMER_OR_DPC_INVALID).

Überwachen der Verwendung der Speicherdeskriptorliste (MDL)

In Windows Vista überwacht Driver Verifier auch den ausgewählten Treiber auf die folgenden verbotenen Aktionen:

  • Aufrufen von MmProbeAndLockPages oder MmProbeAndLockProcessPages für eine MDL, die nicht über die entsprechenden Flags verfügt. Beispielsweise ist es falsch, MmProbeAndLockPages für eine MDL aufzurufen, die mit MmBuildMdlForNonPagedPool erstellt wurde.

  • Aufrufen von MmMapLockedPages für eine MDL, die nicht über die entsprechenden Flags verfügt. Beispielsweise ist es falsch, MmMapLockedPages für eine MDL aufzurufen, die bereits einer Systemadresse oder und MDL zugeordnet ist, die nicht gesperrt ist.

  • Aufrufen von MmUnlockPages oder MmUnmapLockedPages für eine partielle MDL, d. h. und MDL, die mit IoBuildPartialMdl erstellt wurde.

  • Aufrufen von MmUnmapLockedPages für eine MDL, die keiner Systemadresse zugeordnet ist.

Wenn driver verifier nicht aktiv ist, führen diese Verstöße möglicherweise nicht dazu, dass das System in allen Fällen nicht sofort reagiert. Driver Verifier überwacht das Verhalten des Treibers und gibt eine Fehlerüberprüfung 0xC4 aus, wenn eine dieser Verstöße auftritt. Eine Liste der Fehlerüberprüfungsparameter finden Sie unter 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).

Zuordnung von Synchronisierungsobjekten aus nonPagedPoolSession Memory

Ab Windows 7 überprüft die Treiberüberprüfung Synchronisierungsobjekte aus dem Sitzungsspeicher.

Synchronisierungsobjekte müssen nicht auslagerbar sein. Außerdem müssen sie sich im globalen, systemweiten virtuellen Adressraum befinden.

Ein Grafiktreiber kann Sitzungsspeicher zuordnen, indem APIs wie EngAllocMem aufgerufen werden. Im Gegensatz zum globalen Adressraum wird der Sitzungsadressraum für jede Terminalserversitzung virtualisiert. Dies bedeutet, dass dieselbe virtuelle Adresse, die im Kontext von zwei verschiedenen Sitzungen verwendet wird, auf zwei verschiedene Objekte verweist. Der Windows-Kernel muss von jeder Terminalserversitzung aus auf Synchronisierungsobjekte zugreifen können. Der Versuch, auf eine Sitzungsspeicheradresse aus einer anderen Sitzung zu verweisen, hat unvorhersehbare Ergebnisse, z. B. Systemabstürze oder automatische Beschädigung der Daten einer anderen Sitzung.

Wenn ab Windows 7 ein überprüfter Treiber ein Synchronisierungsobjekt durch Aufrufen von APIs wie KeInitializeEvent oder KeInitializeMutex initialisiert, überprüft die Treiberüberprüfung, ob die Adresse des Objekts innerhalb des virtuellen Sitzungsadressraums liegt. Wenn die Driver Verifier diese Art von falscher Adresse erkennt, wird eine Fehlerüberprüfung 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION mit dem Parameter 1-Wert 0xDF.

Änderungen des Objektverweiszählers von 0 auf 1

Ab Windows 7 sucht die Treiberüberprüfung auf zusätzliche Klassen falscher Objektverweise.

Wenn der Windows-Kernelobjekt-Manager ein Objekt erstellt, z. B. ein File-Objekt oder ein Thread-Objekt, wird der Verweiszähler des neuen Objekts auf 1 festgelegt. Der Verweisindikator wird durch Aufrufe von APIs wie ObReferenceObjectByPointer oder ObReferenceObjectByHandle erhöht. Der Verweiszähler wird durch jeden ObDereferenceObject-Aufruf für dasselbe Objekt dekrementiert.

Nachdem der Verweiszähler den Wert 0 erreicht hat, kann das Objekt freigegeben werden. Der Objekt-Manager kann es sofort freigeben oder später freigeben. Der Aufruf von ObReferenceObjectByPointer oder ObDereferenceObject und das Ändern des Verweiszählers von 0 in 1 bedeutet, dass der Verweiszähler eines bereits freigegebenen Objekts erhöht wird. Dies ist immer falsch, da es dazu führen kann, dass die Speicherbelegung einer anderen Person beschädigt wird.

Blöcke oder Verzögerungen beim Herunterfahren des Systems

Ab Windows 7 gibt die Treiberüberprüfung einen Einbruch in den Kerneldebugger aus, wenn das Herunterfahren des Systems 20 Minuten nach dem Start nicht abgeschlossen wird. Driver Verifier weist den Start des Herunterfahrens des Systems als Zeitpunkt zu, zu dem der Windows-Kernel mit dem Herunterfahren seiner verschiedenen Subsysteme beginnt, z. B. die Registrierung, Plug And Play oder die E/A-Manager-Subsysteme.

Wenn kein Kerneldebugger an das System angefügt ist, gibt driver verifier eine Fehlerüberprüfung 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION mit dem Parameter 1-Wert 0x115 anstelle dieses Haltepunkts aus.

Häufig weist ein Herunterfahren des Systems, das nicht in weniger als 20 Minuten abgeschlossen werden kann, darauf hin, dass einer der Treiber, der auf diesem System ausgeführt wird, fehlerhaft ist. Wenn Sie !analyze -v über den Kerneldebugger ausführen, wird die Stapelüberwachung des Systemworkerthreads angezeigt, der für das Herunterfahren verantwortlich ist. Sie sollten diese Stapelüberwachung untersuchen und feststellen, ob der heruntergefahrene Thread von einem der getesteten Treiber blockiert wird.

Manchmal kann das System nicht heruntergefahren werden, weil es intensiven Belastungstests unterzogen wird – obwohl alle Treiber ordnungsgemäß funktionieren. Der Benutzer kann die Ausführung nach diesem Driver Verifier-Haltepunkt fortsetzen und überprüfen, ob das System schließlich heruntergefahren wird.