Freigeben über


Überprüfung des Dateisystemfilters

Verwendungsüberprüfung

Die Filterüberprüfung überprüft die folgende Verwendung in einem Minifiltertreiber:

  • Korrekte Verwendung von Parametern und aufrufenden Kontext
  • Korrigieren von Rückgabewerten aus Preoperations- und Postoperation-Rückrufroutinen
  • Konsistente und kohärente Änderungen an Parametern in Rückrufdaten

Filter-Manager-Objektverfolgung

Filter Verifier verfolgt die folgenden Filter-Manager-Objekte nach:

  • Filterkontexte (Datenstromkontexte, Dateikontexte usw.)
  • Rückrufdatenstrukturen
  • Arbeitsaufgaben in der Warteschlange
  • NameInformation-Strukturen
  • Dateiobjekte
  • Filterobjekte
  • Instanzobjekte
  • Volumeobjekte

Bei Referenz-gezählten Strukturen, z. B. Filterkontexte und Namensinformationsstrukturen, wird die Filterüberprüfung beim Entladen des Filtertreibers in den Debugger unterteilt, wenn die Anzahl der Verweise scheinbar geleert wurde. Es wird Anweisungen dazu gedruckt, wie Sie die Erweiterung !fltkd debugger verwenden können, um die geleckten Strukturen zu finden.

Filterüberprüfungsverletzungen

Wenn die Filterüberprüfung einen Verstoß erkennt, wird eine Meldung im Debugger ausgegeben, die die Verletzung beschreibt. Bei den meisten Verstößen wird auch die Ausführung angehalten und der Benutzer aufgefordert, eine Aktion auszuführen. Zum Beispiel:

FILTER VERIFIER ERROR: A filter returned an unknown pre-operation callback status.
(Filter = FFFFAC04A21CD8A0 (MyFilter), Status = 0xbaadf00d)
Break, ignore, zap or remove ?

Geben Sie zum Fortfahren einen von vier Einbuchstabenbefehlen ein:

  • B oder b für Break: Dies bricht in den Debugger ein, in dem Sie möglicherweise weitere Untersuchungen durchführen können.
  • I oder i für "Ignorieren": Setzt die Ausführung fort. Wenn diese Verletzung erneut auftritt, druckt die Filterüberprüfung die Verletzungsmeldung an den Debugger, hält die Ausführung an und zeigt die Eingabeaufforderung an.
  • Z oder z für Zap: Setzt die Ausführung fort. Wenn diese Verletzung erneut auftritt, druckt die Filterüberprüfung die Verletzungsmeldung an den Debugger, hält jedoch nicht die Ausführung an.
  • R oder r zum Entfernen: Setzt die Ausführung fort. Wenn diese Verletzung erneut auftritt, druckt die Filterüberprüfung die Verletzungsmeldung NICHT und hält die Ausführung NICHT an.

Hinweis

Wenn Sie "Filter Verifier" auf einem Treiber verwenden, der mit aktivierten Compileroptimierungen erstellt wurde, tritt gelegentlich ein Filterüberprüfungsfehler auf, bei dem immer wieder behauptet wird, dass ihr Filter verweise auf eine oder mehrere Ressourcen wiederholt angibt, auch wenn Sie keine Ursache für einen Verlust in Ihrem Code finden können. Die Nachricht beginnt mit Dem folgenden Text:

FILTER VERIFIER ERROR: A filter (Filter = FFFFAC04A21CD8A0 (MyFilter)) leaked references to the following resources:

Möglicherweise wird auch eine Meldung angezeigt, die angibt, dass die Objektverfolgung nicht mehr synchronisiert ist, z. B.:

FILTER VERIFIER WARNING: Filter manager verifier object tracking may be out of sync for the system

Die häufigste Ursache für diese Bedingung ist, dass die Filterüberprüfung den tatsächlichen Aufrufer einer Filter-Manager-API aufgrund einer Tail-Aufrufoptimierung nicht identifizieren konnte. Dies kann auftreten, wenn eine Routine in Ihrem Treiber eine Filter-Manager-API als letzte Zeile aufruft. Zum Beispiel:

void MyWorkItemCallback(PFLT_GENERIC_WORKITEM WorkItem,
                        PVOID Filter,
                        PVOID Context)
{
   // Do some stuff
   ...
   FltFreeGenericWorkItem(WorkItem);
}

Es gibt eine Reihe von Möglichkeiten, um zu überprüfen, ob dies geschehen ist:

  1. Deaktivieren Sie die Optimierung der verdächtigen Routine, indem Sie sie in #pragma optimize("", off) ... #pragma optimize("", on)packen.
  2. Ordnen Sie Ihren Code so neu an, dass der Filter-Manager-API-Aufruf nicht das Letzte in Ihrer Routine ist.

Wenn der Fehler nach dem Versuch einer dieser Optionen nicht mehr reproduziert wird, ist dies wahrscheinlich ein falsch positives Ergebnis.

Aktivieren dieser Option

Sie können die Überprüfung des Dateisystemfilters für einen oder mehrere Treiber mithilfe der verifier.exe Befehlszeile aktivieren. Ausführliche Informationen finden Sie unter Auswählen von Treiberüberprüfungsoptionen.

Hinweis

Vor Windows Build 25126 wird es nicht unterstützt, die Überprüfung des Dateisystemfilters auf mindestens einem Minifilter zu aktivieren, während ntoskrnl zur Überprüfung ausgewählt ist. Dies kann zu fehlerhaften Verifier-Fehlern führen.

Um dieses Problem zu vermeiden, schließen Sie ntoskrnl entweder nicht in die Liste der Komponenten ein, um nach Build 25126 eine Version von Windows zu überprüfen oder auf eine Version von Windows zu aktualisieren.

Die empfohlene Methode zum Starten der Filterüberprüfung ist die Option "/standard " von verifier.exe, da sie zusätzliche nützliche Features wie spezielle Pool - und Poolverfolgung bietet:

verifier.exe /standard /driver MyFilter.sys

Die Überprüfung beginnt, wenn sich der Minifiltertreiber beim Filter-Manager registriert.

  • Aktivieren der Option "Nur Filterüberprüfung" in Windows 11 und neueren Versionen von Windows Zum Aktivieren der minimalen Gruppe von Filterüberprüfungen aktivieren Sie die Optionen "E/A-Überprüfung" und "Dateisystemfilterüberprüfung" in der Treiberüberprüfung (verifier.exe). Zum Beispiel:

    verifier.exe /ruleclasses 5 37 /driver MyFilter.sys
    
  • Aktivieren der Filterüberprüfung in Windows 10 und früheren Versionen von Windows Zum Aktivieren der minimalen Gruppe von Filterüberprüfungen geben Sie den Namen des Minifiltertreibers an, und aktivieren Sie die E/A-Überprüfungsoption in der Treiberüberprüfung (verifier.exe). Zum Beispiel:

    verifier.exe /flags 0x10 /driver MyFilter.sys