Die Tiefen von Windows I/O (Teil 6, Finale) ── Filtertreiber und Minifilter: Warum Procmon und Virenscanner sich in die I/O einklinken können

· · Windows, Win32, I/O, Minifilter, Kernel, Gerätetreiber, Sicherheit, Fehlersuche

Dies ist der Abschluss der Serie „Die Tiefen von Windows I/O“.

Seit in Teil 1 im Diagramm des Gerätestapels ein Kästchen mit der Aufschrift „Dateisystemfilter (Virenschutz, Verschlüsselung, Procmon usw.)“ auftauchte, sind in dieser Serie immer wieder die dazwischenliegenden Akteure in Erscheinung getreten: warum Procmon jede I/O-Operation aufzeichnen kann (Teil 1); „nur in dieser einen Umgebung ist der Dateizugriff langsam“ (Teil 2); der Reparse-Point, der OneDrive in dem Moment, in dem eine Datei geöffnet wird, mit dem Herunterladen beginnen lässt (Teil 5). Diese Folge nimmt sich nun endlich diesen Mechanismus des Dazwischenliegens selbst vor – Dateisystem-Filtertreiber und Minifilter – und löst damit alle offenen Fäden der Serie auf.

1. Das Wichtigste zuerst

  • „Sich in die I/O einzuklinken“ ist ein vom Betriebssystem offiziell sanktionierter Erweiterungspunkt. Ein Dateisystemfilter kann eine Anforderung an das Dateisystem sehen, umschreiben, ablehnen oder an ihrer Stelle selbst bearbeiten (Kapitel 2).1
  • Der heutige Standard ist der Minifilter. Um die Probleme des Legacy-Ansatzes zu lösen, der direkt in den Gerätestapel eingriff (unklare Reihenfolge, keine Möglichkeit zum Entladen), fand ein Generationswechsel hin zu einem Modell statt, das Callbacks beim mit Windows ausgelieferten Filter-Manager (FltMgr) registriert (Kapitel 2).23
  • Die Mechanik sind Pre-/Post-Callbacks. Vor und nach jeder Operation werden die Filter in Registrierungsreihenfolge aufgerufen – das heißt in Altitude-Reihenfolge. Durchlassen, abschließen, ablehnen, umschreiben – die „Optionen eines Treibers“ aus Teil 1 lassen sich unverändert anwenden (Kapitel 3).2
  • Die Altitude („Höhenlage“) bestimmt die Reihenfolge. Jeder zweckspezifischen Gruppe ist ein Zahlenband zugewiesen (Activity Monitor 360000–389999, Anti-Virus 320000–329999 usw.), und jede an ein Volume angehängte Instanz erhält darin eine eindeutige Nummer (Kapitel 4).45
  • Die Bewohner Ihres PCs sehen Sie mit fltmc. Procmon (nur während es läuft), Virenschutz, OneDrives Cloud-Filter – sie alle stehen hier aufgereiht (Kapitel 5).
  • Eine Antivirus-Ausschlusseinstellung bedeutet „das Scannen des jeweils eigenen Produkts überspringen“ und hat keine Auswirkung auf andere Minifilter. Ein Ausschluss ist ein Kompromiss, der Schutz abgibt; für Entwicklungsvolumes gibt es mit Dev Drive (asynchrones Scannen) eine sicherere Option (Kapitel 6).67
  • Die Untersuchung von „nur in dieser einen Umgebung ist es langsam“ beginnt mit Procmons Duration-Spalte und dem Vergleich der fltmc-Konfiguration (Kapitel 7).

2. Die Geschichte der Dazwischenliegenden ── Von Legacy-Filtern zu FltMgr

Ein Dateisystem-Filtertreiber ist ein Treiber, der Anforderungen an das Dateisystem (oder das darunterliegende Volume) abfangen kann. Er kann eine Anforderung protokollieren, überwachen, ihren Inhalt ändern und sie sogar ablehnen oder an ihrer Stelle selbst bearbeiten – er ist das Fundament, auf dem Virenschutz, Verschlüsselung, Backup- und Hierarchical-Storage-Software aufbauen.1

Der alte Implementierungsansatz (der Legacy-Filter) stapelte sein eigenes Geräteobjekt direkt auf den Gerätestapel, den wir aus Teil 1 kennen. Als Mechanismus ist das unkompliziert, aber in der Praxis war es voller Probleme: Die Reihenfolge, in der sich die Filter stapelten, hing von der Ladereihenfolge ab und war schwer zu garantieren; war ein Filter erst einmal gestapelt, kam er nicht mehr sicher heraus (er ließ sich nicht entladen); und es wurde zum Nährboden für Kompatibilitätsprobleme zwischen Filtern.

Deshalb führte Windows den Filter-Manager (FltMgr) ein. FltMgr selbst sitzt als vom Betriebssystem mitgeliefertem Filter auf dem Stapel, und die einzelne Filterfunktionalität registriert als Minifilter Callbacks bei FltMgr.2

Minifilter-Ansatz (heutiger Standard)Callback registrierenCallback registrierenFilter-Manager (FltMgr)vom Betriebssystem mitgeliefert. Einziges, was auf dem Stapel sitztMinifilter A (hohe Altitude)Minifilter B (niedrige Altitude)DateisystemReihenfolge deterministisch über AltitudeLaden zu jedem Zeitpunkt möglich(unterstützende Filter auch entladbar)Legacy-AnsatzLegacy-Filter ALegacy-Filter BDateisystemReihenfolge der Ladereihenfolge überlassenkein sicheres Entladen möglich

Abbildung 1: Der Generationswechsel. Nicht mehr „auf den Stapel häufen“, sondern „bei FltMgr registrieren“

Die Vorteile des Minifilter-Modells werden offiziell aufgezählt – es kann jederzeit geladen werden, die Reihenfolge lässt sich kontrollieren, und ein Filter, der einen Entlade-Callback implementiert, kann sogar im laufenden Betrieb entladen werden (ein Filter, der das nicht implementiert oder es verweigert, lässt sich nicht entfernen).3 Um mit Legacy-Filtern koexistieren zu können, kann FltMgr als mehrere „Frames“ an mehreren Stellen des Stapels sitzen, und ein Minifilter kehrt garantiert nach dem Entladen und erneuten Laden an dieselbe Position (dieselbe Altitude) zurück.2 Praktisch die gesamte moderne Virenschutz-, Überwachungs- und Synchronisierungssoftware ist als dieser Minifiltertyp gebaut.

3. Wie ein Minifilter arbeitet ── Pre-/Post-Callbacks

Ein Minifilter erklärt FltMgr, „an welchen Operationen er interessiert ist“. Zum Beispiel könnte er nur an IRP_MJ_CREATE (Öffnen) und IRP_MJ_WRITE (Schreiben) interessiert sein. Immer wenn eine solche Operation dann vorbeifließt, werden sein Pre-Callback (vor der Operation) und sein Post-Callback (nach der Operation) aufgerufen.

NTFSMinifilter B(niedrige Altitude)Minifilter A(hohe Altitude)FltMgrI/O-ManagerNTFSMinifilter B(niedrige Altitude)Minifilter A(hohe Altitude)FltMgrI/O-ManagerAnforderung (z. B. IRP_MJ_CREATE, die Welt aus Teil 1)Pre-CallbackPre-CallbackWeiter zum DateisystemErgebnisPost-CallbackPost-CallbackAbschluss (zurück in den Abschlussablauf aus Teil 1)

Abbildung 2: Pre-/Post-Callbacks. Auf dem Hinweg wird in Reihenfolge fallender Altitude aufgerufen, auf dem Rückweg in umgekehrter Reihenfolge

Was kann jeder Callback tun? Dieselbe Struktur wie die „drei Optionen eines Treibers“ aus Teil 1, Abschnitt 4.3, wird hier über eine sicherere API angeboten.

Der Pre-Callback wird aufgerufenWas mit dieser Operation geschehen sollDurchlassen(bei Bedarf auch erklären, dass kein Post-Callback nötig ist)Ablehnensofort Zugriff verweigert o. Ä. zurückgebenBeispiel: Virus erkannt, Schreiben blockiertSelbst abschließenBeispiel: Ein Cloud-Filter holtden echten Inhalt und liefert ihnParameter oder Inhalt ändern und weiterleitenBeispiel: ein Verschlüsselungsfilter

Abbildung 3: Die Optionen eines Pre-Callbacks. „Beobachten, stoppen, übernehmen oder umschreiben“ sind alle offiziell möglich

Und hier wird die Hausaufgabe aus Teil 4 eingesammelt: Minifilter können auch bei Fast I/O zugegen sein (der Abkürzung, die ohne Erzeugen eines IRP auskommt). Das liegt daran, dass FltMgr seinen Callback-Mechanismus auch durch den Fast-I/O-Pfad führt, sodass es das Legacy-Problem „unsichtbar, wenn die Abkürzung genommen wird“ hier nicht gibt. Dass in Procmons Protokoll sogar FASTIO_-Zeilen auftauchen, verdankt sich genau diesem Beobachtungspunkt.

4. Altitude ── „Höhenlage“ bestimmt die Reihenfolge

Sind mehrere Filter an derselben Operation interessiert, ist wer sie zuerst sieht eine ernste Frage. Sieht der Virenschutz eine Operation nicht vor der Verschlüsselung, scannt er am Ende Chiffretext; steht ein Überwachungswerkzeug nicht über allen anderen, kann es das Gesamtbild nicht beobachten.

Diese Reihenfolge legt die Altitude (Höhenlage) fest. Für jeden Filtertyp sind eine Ladereihenfolgegruppe und ein Zahlenband definiert. Genau genommen trägt nicht der Treiber als Ganzes eine Altitude, sondern die an ein Volume angehängte „Instanz“ eines Minifilters. Die Nummern sind eindeutig, und je größer die Zahl, desto weiter oben auf dem Stapel (näher an der Anwendung) sitzt sie.4 Ein einzelner Treiber kann mehrere Instanzdefinitionen besitzen und in unterschiedlichen Höhenlagen auftreten – deshalb ist die Liste von fltmc instances pro Instanz aufgeschlüsselt.

Näher an der Anwendung (größere Zahlen)FSFilter Activity Monitor: 360000–389999Beobachtung und Aufzeichnung von I/O (hier lebt Procmon)FSFilter Undelete: 340000–349999Wiederherstellung gelöschter DateienFSFilter Anti-Virus: 320000–329999Erkennung und Entfernung von VirenFSFilter Replication: 300000–309999Replikation an einen entfernten OrtFSFilter Continuous Backup: 280000–289999fortlaufende SicherungWeiter unten: Content Screener /Quota Management / System Recovery /Bänder für Verschlüsselung, Komprimierung usw.Näher am Dateisystem (kleinere Zahlen)

Abbildung 4: Altitude-Bänder (Auszug). Für jeden Zweck ist festgelegt, „welche Höhenlage er einnehmen soll“

Wichtig ist, dass diese Nummer von Microsoft vergeben und verwaltet wird.5 Ein Anbieter nimmt sie sich nicht einfach, sondern beantragt sie und erhält sie zugeteilt – deshalb bleibt auf jedem PC die Ordnung „Überwachung steht über Virenschutz, Virenschutz steht über Verschlüsselung“ erhalten. Das war die Antwort auf das „Ladereihenfolge-Lotteriespiel“ der Legacy-Ära.

Wo Sie einen Antrag stellen, wenn Sie selbst einen Minifilter bauen. Für Entwickler notieren wir hier nur den nächsten Schritt. Eine Altitude beantragen Sie nach dem Verfahren unter Request a Filter Altitude Identifier: Senden Sie eine englischsprachige E-Mail mit dem Betreff „Filter altitude request“ an fsfcomm@microsoft.com. Anzugeben sind Firmenname, Kontaktadresse (kein persönliches Postfach, sondern ein langfristig nutzbarer Firmen-Alias), Produktname, Produkt-URL, eine Beschreibung des Filters, der Dateiname des Treibers, der Filtertyp, der Starttyp sowie die gewünschte Ladereihenfolgegruppe und die gewünschte Altitude – alles muss ausgefüllt werden. Ausdrücklich vermerkt ist auch, dass mit 30 Werktagen Bearbeitungszeit zu rechnen ist, dass es keine Möglichkeit einer beschleunigten Bearbeitung gibt und dass die zugeteilte Nummer von der gewünschten abweichen kann.8 Eine Firma, die in derselben Ladereihenfolgegruppe bereits eine ganzzahlige Altitude besitzt, darf im Übrigen selbst einen Wert mit angehängter Dezimalstelle festlegen (z. B. 325000,3) und muss dies dann lediglich im Nachhinein per E-Mail mitteilen.8

5. Die Bewohner vorgestellt ── Ihr PC, betrachtet mit fltmc

Genug der Theorie, schauen wir uns das Ganze konkret an. In einer administrativen Eingabeaufforderung:

:: Liste der registrierten Minifilter (mit Altitude)
fltmc

:: Welcher Filter an welchem Volume hängt
fltmc instances

:: Betrachtung von der Volume-Seite aus
fltmc volumes

fltmc ohne Argumente liefert dieselbe Liste wie fltmc filters. Die Ausgabe hat vier Spalten, und Microsofts Dokumentation zeigt ein Beispiel im selben Format.9

C:\Windows\system32>fltmc

Filter Name                     Num Instances    Altitude    Frame
------------------------------  -------------  ------------  -----
bindflt                                 1        409800         0
cldflt                                  1        409500         0
WdFilter                                4        328010         0
luafv                                   1        135000         0
FileInfo                                4         45000         0

Das oben Gezeigte ist ein Auszug zu Anschauungszwecken. Die Besetzung und die Anzahl der Instanzen unterscheiden sich je nach Umgebung, aber weil die Altitude-Werte von Microsoft vergebene feste Zahlen sind, lassen sie sich mit der in Kapitel 4 erwähnten öffentlichen Liste abgleichen.

Die Spalten bedeuten Folgendes.

Spalte Bedeutung
Filter Name Der Name des Filters (Treibers)
Num Instances An wie vielen Volumes er hängt (die Instanzanzahl aus Kapitel 4)
Altitude Die Altitude. Je größer die Zahl, desto näher an der Anwendung
Frame Die Frame-Nummer von FltMgr. Steht hier <Legacy>, ist das ein Zeichen dafür, dass ein Legacy-Filter ohne FltMgr noch aktiv ist.9

Schon aus diesen fünf Zeilen lässt sich ablesen, dass bindflt und cldflt im obersten FSFilter-Top-Band (400000–409999) liegen, WdFilter im Anti-Virus-Band (320000–329999) und FileInfo im untersten FSFilter-Bottom-Band (40000–49999). Das Bild aus Kapitel 4 – „für jeden Zweck ist festgelegt, welche Höhenlage er einnehmen soll“ – bestätigt sich hier unmittelbar in Zahlen. Und starten Sie Procmon und führen Sie fltmc erneut aus, erscheint im Activity-Monitor-Band (360000–389999) eine zusätzliche Zeile, die mit PROCMON beginnt.

Die Besetzung unterscheidet sich je nach Umgebung, aber die typischen Bewohner sind lauter bekannte Gesichter aus dieser Serie.

  • WdFilter ── der Minifilter von Microsoft Defender. Er liegt im Anti-Virus-Band. Auf vielen PCs ist er eine Kontrollstelle, die jede einzelne Datei-I/O passieren muss.
  • cldflt ── der Cloud-Dateien-Filter. Er ist der Motor hinter OneDrives Files-on-Demand und stellt den echten Inhalt bereit, wenn der in Teil 5 gesehene Reparse-Point (Platzhalter) geöffnet wird.10
  • PROCMON24 (o. Ä.) ── ein temporärer Minifilter im Activity-Monitor-Band, der nur erscheint, während Process Monitor läuft. Das ist der Trick dahinter, dass Procmon jede I/O sehen kann.11 Führen Sie fltmc vor und nach dem Start aus und vergleichen Sie.
  • Daneben gibt es Backup-Software, Verschlüsselungsprodukte (Datenverlust-Schutz), EDR, virtualisierten Speicher und mehr – je geschäftlicher der PC, desto mehr Bewohner sammeln sich an.

Betrachtet man in dieser letzten Folge das Werkzeug Procmon, das wir seit Teil 1 benutzt haben, einmal von außerhalb des Werkzeugkastens, ergibt sich ein hübscher geschlossener Kreis: Der Beobachter erweist sich selbst als Bewohner genau des Mechanismus, den er beobachtet.

6. Wo verbringt der Virenschutz seine Zeit?

Die praktisch größte Auswirkung von Filtern sind die Kosten des Virenscans. Stellen wir grafisch dar, wo die Zeit tatsächlich anfällt (Details unterscheiden sich je nach Produkt; das Folgende ist eine typische Form).

NTFSAV-MinifilterAnwendungNTFSAV-MinifilterAnwendungpre-create: vorherige Beurteilung von Pfad und RichtlinieBei einer noch nicht gescannten Dateiwird hier der Inhalt gescanntund bei einem Problem das Öffnen rückgängig gemacht── die Hauptursache für langsames ÖffnenEine geänderte Datei wirdz. B. beim Schließen erneut zum ScanzielBei sehr vielen kleinen Dateien (z. B. Zwischenprodukten eines Builds)summiert sich dieser Hin- und Rückweg pro DateiDatei öffnenDurchlassen (Öffnen wird ausgeführt)Öffnen erfolgreich (post-create)Ohne Problem wird das Handle zurückgegebenSchreiben und Schließen

Abbildung 5: Wo die Scankosten entstehen. Pro Datei geringfügig, wird es bei mehreren Zehntausend Dateien dominant

Vor diesem Hintergrund lassen sich zwei praktische Themen präzise verstehen.

Die technische Bedeutung einer Ausschlusseinstellung. Bei I/O auf einen Pfad, der auf die Ausschlussliste passt, wird die Scan-Verarbeitung des Filters übersprungen. Der Filter verschwindet dabei nicht vom Stapel; treffender ist, dass die Entscheidung „nicht prüfen“ früher getroffen wird. Und es gibt noch eine wichtige Einschränkung: Ein Ausschluss wirkt nur beim Filter des Produkts, das diese Einstellung besitzt. Die Ausschlusseinstellung von Microsoft Defender ändert nur das Scanverhalten von WdFilter und hat keinerlei Einfluss auf andere, gleichzeitig laufende Minifilter (fremder Virenschutz, EDR, Backup, Verschlüsselung usw.). Bleibt es „trotz Ausschluss weiterhin langsam“, sollten Sie vermuten, dass ein anderer Bewohner die Zeit beansprucht (Vergleich mit fltmc in Kapitel 7). Die Wirkung ist zwar groß, aber ein Ausschluss schwächt den Schutz an dieser Stelle zuverlässig. Auch Microsofts eigene Dokumentation warnt wiederholt, dass Ausschlüsse die Verteidigung verringern und deshalb nach einer Risikobewertung auf ein Minimum beschränkt werden sollten.6 Der praktische Umgang mit Fehlalarmen und deren Leistungseinfluss wird in „Wenn die eigene Windows-App als Virus gemeldet wird“ behandelt.

Dev Drive, eine neue Antwort. Das ist ein eigens für Entwicklungsarbeitslasten (viele kleine Dateien) konzipiertes Volume, auf dem Microsoft Defender im Performance-Modus (asynchrones Scannen) läuft. Es wird als sicherere Alternative zu Ordnerausschlüssen positioniert: Standardmäßig wird kein zusätzlicher Filter angehängt, gleichzeitig wird aber ausdrücklich eindringlich davor gewarnt, ganz ohne Filter zu arbeiten.7 Es ist Microsofts aktuelle empfohlene Antwort auf „Ich will schnellere Builds, aber Ausschlüsse machen mir Sorgen“.

7. Das Vorgehen bei der Untersuchung von „nur in dieser einen Umgebung ist es langsam“

Fassen wir zum Schluss die in der Serie zusammengetragenen Werkzeuge in einem einzigen Ablauf zusammen.

JaJaNeinNein (unregelmäßig)Symptom: dieselbe Anwendung, aber nurin einer bestimmten Umgebung ist der Dateizugriff langsamIn Procmon die Spalte Duration betrachtenbei welcher Operation (IRP_MJ_CREATE? WRITE?)die Zeit verloren gehtIst eine bestimmte Operation gleichmäßig langsam?fltmc instances mit einer schnellen Umgebung vergleichenUnterschied in der Filterkonfiguration betrachtenIst ein Filter aus der Differenz die Ursache?Ausschlusseinstellung (mit Risikobewertung) oderPrüfung von Dev Drive / Rücksprache mit dem HerstellerEtwas anderes als einen Filter vermuten:Cache (Teil 4), Fragmentierung oder MFT (Teil 5),Netzwerkziel (UNC), das Gerät selbst

Abbildung 6: Eingrenzung filterbedingter Langsamkeit. Der Schlüssel ist die „Dauer je Operation“ und der „Unterschied in der Filterkonfiguration zwischen Umgebungen“

Zwei Punkte sind entscheidend. Erstens: Procmon führt für jede Operation eine Dauer (Duration). Lässt sich „langsam“ in „welche Operation ist langsam“ zerlegen, ist die Tätersuche halb erledigt. Zweitens: Unterschiede zwischen Umgebungen sind oft Unterschiede in der Filterkonfiguration. Entwicklungsrechner gegen Produktivrechner, eigener PC gegen Kunden-PC – schon das Nebeneinanderstellen der fltmc-Ausgaben zeigt, welche Kandidaten verdächtig sind.

Die ersten drei Schritte, wenn Sie Procmon noch nie benutzt haben. Die Spalte Duration wird standardmäßig nicht angezeigt; damit Sie hier nicht hängen bleiben, hier nur die nötigen Handgriffe.

  1. Procmon.exe als Administrator starten.
  2. Menü Options > Select Columns… öffnen und in der Spaltenliste Duration ankreuzen.
  3. Über Menü Filter > Filter… (Strg+L) Process Name / is / den Namen der Ziel-exe / Include eingeben, erst auf Add klicken und dann auf OK (ohne Klick auf Add wird die Bedingung nicht übernommen).

Klicken Sie anschließend auf die Spalte Duration, um zu sortieren: Die zeitfressenden Operationen sammeln sich oben. Für eine Auswertung pro Prozess oder pro Datei eignet sich auch Menü Tools > File Summary. Der allgemeine Umgang mit Procmon ist in „Process Monitor (ProcMon) Praxisleitfaden“ zusammengefasst.

8. Der Abschluss der Serie ── Die Landkarte von sechs Folgen

Damit sind alle Kästchen der Landkarte geöffnet, die wir in Teil 1 gezeichnet haben. Bringen wir das Ganze auf ein Bild.

Abschluss kehrt hierhin zurückCache-fähige I/O arbeitet zusammen(das Dateisystem ruft die Cache-Funktion auf)Interrupt zu Abschluss (Teil 1)AnwendungReadFile / WriteFile / async-awaitTeil 2: Synchrone/asynchrone I/OHandle-Modi und OVERLAPPEDTeil 3: IOCP und der .NET-Thread-PoolEntgegennahme von Abschlüssen und Ausführung von FortsetzungenTeil 1: I/O-Manager und IRPNamensauflösung, drei Objekte, GerätestapelTeil 6: Filter und MinifilterFltMgr, Altitude, Pre/PostTeil 4: Cache-Manager256-KB-Views, Lazy Writer, Fast I/O(arbeitet mit NTFS zusammen)Teil 5: NTFSMFT, Streams, Links, zwei JournaleSpeicherstapel und Gerät

Abbildung 7: Die Landkarte der gesamten Serie. Der Cache-Manager ist keine „durchlaufene Schicht“, sondern ein Partner, der mit dem Dateisystem zusammenarbeitet; bei einem Cache-Miss geht die Anforderung von NTFS an den Speicher hinaus

  • Teil 1: Das Gesamtbild ── jedes Lesen und Schreiben wird zu einem IRP
  • Teil 2: Synchron/asynchron ── was OVERLAPPED wirklich bedeutet
  • Teil 3: IOCP ── der Keller unter async/await
  • Teil 4: Cache ── wann erreicht Ihr WriteFile tatsächlich die Festplatte
  • Teil 5: NTFS ── das Dateisystem anhand des MFT verstehen
  • Teil 6: Filter und Minifilter (dieser Artikel) ── warum Procmon und Virenscanner sich in die I/O einklinken können

9. Zusammenfassung ── Zum Abschluss der Serie

Hier die Zusammenfassung dieser letzten Folge.

  • Das Einklinken in I/O ist ein vom Betriebssystem offiziell sanktionierter Erweiterungspunkt, und der heutige Standard ist die Registrierung von Callbacks bei FltMgr, also der Minifilter. Die Reihenfolge wird deterministisch durch die Altitude festgelegt, und Microsoft vergibt und verwaltet die Nummern.245
  • Die Mechanik sind Pre-/Post-Callbacks. Man kann durchlassen, ablehnen, übernehmen oder umschreiben, und man kann auch bei Fast I/O zugegen sein. Procmon, Defender und OneDrive sind alle Bewohner desselben Mechanismus.11110
  • Eine Ausschlusseinstellung bedeutet das Überspringen des Scans und ist ein Kompromiss zulasten des Schutzes. Für Entwicklungsvolumes gibt es mit Dev Drive (asynchrones Scannen) eine sicherere Option.67
  • „Nur in dieser einen Umgebung ist es langsam“ lässt sich anhand von Procmons Duration und dem von fltmc gemeldeten Konfigurationsunterschied eingrenzen – die Werkzeuge der Serie werden unverändert zum Untersuchungsverfahren selbst.

Und wenn man die ganze Serie in einem einzigen Satz zusammenfassen muss, dann diesen: Windows-I/O ist ein in sich stimmiger Entwurf, bei dem das Ziel in einem Namensraum bestimmt, die Anforderung in ein Paket – das IRP – verpackt und zwischen den Schichten weitergereicht wird, wobei jede Schicht so gebaut ist, dass sie wählen kann, ob sie zusieht, es entgegennimmt oder die Aufgabe übernimmt. Unter einer einzigen Zeile File.ReadAllText läuft jedes Mal diese sechsteilige Struktur ab. Statt sich das Verhalten einer API einzuprägen, aus dieser Landkarte ableiten zu können, „so muss es funktionieren“ – das ist die Fähigkeit, die diese Serie Ihnen mitgeben wollte. Vielen Dank, dass Sie uns auf dieser langen Reise begleitet haben.

Verwandte Artikel

Verwandte Beratungsleistungen

Die KomuraSoft LLC übernimmt die Untersuchung von Leistungsproblemen und Fehlern bei Windows-Fachanwendungen, bei denen Filtertreiber eine Rolle spielen – etwa „nur in einer bestimmten Umgebung ist es langsam“ oder „die Sicherheitssoftware stört mit der eigenen Anwendung“.

  1. Microsoft Learn, About file system filter drivers. Dazu, dass Dateisystem-Filtertreiber optionale Treiber sind, die Anforderungen an das Dateisystem oder an andere Filtertreiber abfangen können; dazu, dass das Abfangen einer Anforderung es erlaubt, Funktionalität zu erweitern oder zu ersetzen, bevor sie ihr ursprüngliches Ziel erreicht, und Anforderungen zu protokollieren, zu überwachen, Daten zu ändern und Operationen zu verhindern; sowie dazu, dass Antiviren-Dienstprogramme, Verschlüsselungsprogramme und hierarchische Speicherverwaltungssysteme Beispiele für Filtertreiber sind.  2 3

  2. Microsoft Learn, Filter Manager Concepts. Dazu, dass der Filter-Manager (FltMgr) ein mit Windows ausgelieferter Kernelmodus-Treiber ist, der Funktionalität bereitstellt, die die Entwicklung von Minifiltertreibern vereinfacht; dazu, dass Minifilter Verarbeitung vor und nach I/O-Operationen registrieren können (Pre-/Post-Callbacks); dazu, dass FltMgr sich zur Koexistenz mit Legacy-Filtern als Frames an mehreren Stellen des I/O-Stapels anhängen kann; sowie dazu, dass ein Minifilter auch nach dem Entladen und erneuten Laden zum selben Frame und zur selben Altitude zurückkehrt.  2 3 4 5

  3. Microsoft Learn, Advantages of the Filter Manager Model. Zu den Vorteilen, die das Minifilter-Modell gegenüber dem Legacy-Filter-Modell bietet, darunter eine bessere Kontrolle über die Ladereihenfolge der Filter; dazu, dass Minifilter im Gegensatz zu Legacy-Filtern zu jedem Zeitpunkt geladen werden können; zur Möglichkeit des Entladens; sowie zu Punkten wie der Anbindung an DAX-Volumes.  2

  4. Microsoft Learn, Load order groups and altitudes for minifilter drivers. Dazu, dass für Dateisystemfilter zweckspezifische Ladereihenfolgegruppen definiert sind, wobei jeder Gruppe ein Altitude-Bereich zugewiesen ist; dazu, dass jeder Filtertreiber eine eindeutige Altitude-Kennung besitzt, die seine relative Position gegenüber anderen Filtern im I/O-Stapel bestimmt; sowie zu Beispielen für Gruppen wie FSFilter Activity Monitor (360000–389999, Beobachtung und Meldung von I/O), FSFilter Undelete (340000–349999), FSFilter Anti-Virus (320000–329999, Erkennung und Entfernung von Viren während Datei-I/O), FSFilter Replication (300000–309999) und FSFilter Continuous Backup (280000–289999).  2 3

  5. Microsoft Learn, Allocated altitudes. Dazu, dass Minifilter-Altitudes von Microsoft vergeben und verwaltet werden, mit einer gepflegten, veröffentlichten Liste vergebener Altitudes; sowie dazu, dass diese Liste WdFilter.sys mit 328010 in der Gruppe FSFilter Anti-Virus und cldflt.sys mit 409500 in der Gruppe FSFilter Top aufführt.  2 3

  6. Microsoft Learn, Configure and validate exclusions for Microsoft Defender Antivirus. Dazu, dass die Ausschlusseinstellungen von Microsoft Defender passende Dateien, Ordner und Prozesse vom Scannen ausnehmen; sowie zur wiederholten Warnung, dass Ausschlüsse das Schutzniveau senken und daher nach Prüfung der Notwendigkeit sorgfältig festgelegt werden sollten.  2 3

  7. Microsoft Learn, Set up a Dev Drive on Windows 11. Dazu, dass Dev Drive ein für Entwicklungsarbeitslasten konzipiertes Volume ist, auf dem Microsoft Defender im Performance-Modus (asynchrones Scannen) läuft; dazu, dass dies mit Blick auf Geschwindigkeit und Leistung als sichere Alternative zu Ordnerausschlüssen positioniert wird; dazu, dass standardmäßig keine zusätzlichen Filter an ein Dev Drive angehängt werden; sowie zur Warnung, dass der Betrieb ohne Virenschutzfilter ein erhebliches Sicherheitsrisiko darstellt.  2 3

  8. Microsoft Learn, Request a Filter Altitude Identifier. Dazu, dass die Beantragung einer neuen Filter-Altitude durch Senden einer ASCII-Text-E-Mail mit dem Betreff „Filter altitude request“ an fsfcomm@microsoft.com erfolgt; dazu, dass alle Angaben ausgefüllt werden müssen – Firmenname, Kontakt-E-Mail (ein langfristig nutzbarer Firmen-Alias, kein persönliches Postfach), Produktname, Produkt-URL, eine Beschreibung des Filters, der Dateiname des Filters, der Filtertyp, der Starttyp sowie die gewünschte Ladereihenfolgegruppe und die gewünschte Altitude; dazu, dass mit 30 Werktagen Bearbeitungszeit zu rechnen ist und es außer diesem Verfahren keinen Antragsweg gibt; dazu, dass Microsoft gelegentlich eine andere als die gewünschte Altitude zuteilt; sowie dazu, dass Firmen, die bereits eine ganzzahlige Altitude besitzen, innerhalb derselben Ladereihenfolgegruppe eine eigene Altitude mit angehängter Dezimalstelle erstellen können, wobei in diesem Fall eine nachträgliche Mitteilung genügt.  2

  9. Microsoft Learn, Blocking legacy file system filter drivers. Dazu, dass das Ausführen von fltmc filters in einer administrativen Eingabeaufforderung Filter in vier Spalten auflistet – Filter Name, Num Instances, Altitude und Frame; sowie dazu, dass ein Frame-Wert von <Legacy> einen Legacy-Dateisystem-Filtertreiber anzeigt, der FltMgr umgeht, während ein Minifilter in der Frame-Spalte einen Zahlenwert (z. B. 0) zeigt.  2

  10. Microsoft Learn, Cloud Files API. Dazu, dass die Cloud Files API (Cloud-Filter) das Fundament für Synchronisierungs-Engines wie OneDrives Files-on-Demand ist, die Cloud-Dateien lokal als Platzhalter darstellen und den echten Inhalt bei Zugriff abrufen.  2

  11. Microsoft Learn, Process Monitor - Sysinternals. Dazu, dass Process Monitor ein fortgeschrittenes Überwachungswerkzeug ist, das Dateisystem-, Registrierungs- und Prozess-/Thread-Aktivität in Echtzeit anzeigt (wie im Haupttext vermerkt, lässt sich beobachten, dass es während des Betriebs als Minifilter in der fltmc-Liste erscheint).  2

Aktuelle Artikel mit denselben Schlagwörtern führen zu verwandten Themen weiter.

Diese Seiten ordnen den Artikel in einen größeren Leistungs- und Entscheidungskontext ein.

Dieser Artikel ist direkt mit den folgenden Leistungen verbunden.

Häufige Fragen

Fragen, die in Beratungen zu diesem Artikelthema häufig gestellt werden.

Was ist der Unterschied zwischen einem Dateisystem-Filtertreiber und einem Minifilter?
Beide sind „Treiber, die sich in I/O-Anforderungen an das Dateisystem einklinken“, unterscheiden sich aber in der Generation der Einklinkmethode. Der ältere Legacy-Filter stapelte sein eigenes Geräteobjekt direkt auf den Gerätestapel des Dateisystems; die Position wurde dadurch von der Ladereihenfolge bestimmt und war schwer zu garantieren, und es gab Probleme wie die Unmöglichkeit, ihn nach dem Laden sicher wieder zu entladen. Der heutige Standard, der Minifilter, registriert beim mit Windows ausgelieferten Filter-Manager (FltMgr) Callbacks nach dem Motto „ruf mich bitte vor und nach dieser Operation“. Die Position wird deterministisch durch eine Zahl namens Altitude festgelegt, er kann jederzeit geladen werden, und ein Filter, der einen Entlade-Callback implementiert, kann sogar während des laufenden Betriebs entfernt werden. Nahezu alle modernen Filter – Virenschutz, Verschlüsselung, Überwachungswerkzeuge, Cloud-Synchronisierung – sind als Minifilter implementiert.
Warum kann Antivirensoftware jeden Dateizugriff prüfen?
Weil das Betriebssystem dafür offiziell einen Erweiterungspunkt bereitstellt. Ein Minifilter kann beim Filter-Manager Code registrieren, der vor (Pre-Callback) und nach (Post-Callback) Operationen wie dem Öffnen, Lesen oder Schreiben einer Datei aufgerufen wird. Ein Antiviren-Filter liegt im für Antivirus reservierten Altitude-Band (320000–329999) und kann beispielsweise unmittelbar nach einem erfolgreichen Öffnen (post-create) den Inhalt scannen und, falls ein Problem vorliegt, dieses Öffnen rückgängig machen, sodass der Zugriff fehlschlägt. Wie wir in Teil 1 dieser Serie gesehen haben, durchläuft jede Datei-I/O den Gerätestapel – die Logik ist also, dass man an einer festen Position auf diesem Weg jeden Zugriff prüfen kann. Das ist kein Trick, sondern ein Mechanismus, der fest in den Entwurf des Betriebssystems eingebaut ist.
Was macht eine Antivirus-Ausschlusseinstellung (Ordnerausschluss) technisch gesehen?
Bei I/O auf einen Pfad, der auf die Ausschlussliste passt, lässt sie den Filter des jeweiligen Produkts den Scanvorgang überspringen, den er sonst durchführen würde. Der Filter selbst verschwindet dabei nicht vom Stapel; treffender ist die Vorstellung, dass die Entscheidung „diesen Pfad nicht prüfen“ früher getroffen wird. Eine wichtige Einschränkung ist, dass ein Ausschluss nur für das Produkt wirkt, das diese Einstellung besitzt. Ein Ausschluss in Microsoft Defender ändert beispielsweise nur das Scanverhalten von Defenders Filter (WdFilter) und hat keinen Einfluss auf andere, gleichzeitig laufende Minifilter wie eine fremde Antivirensoftware, EDR oder Backup-Software. Jedes Produkt braucht seine eigene Ausschlusseinstellung, und wenn es „trotz Ausschluss weiterhin langsam“ bleibt, kann ein anderer Filter die Ursache sein. Und wie Microsofts Dokumentation wiederholt warnt, schwächt ein Ausschluss den Schutz an dieser Stelle, weshalb er zusammen mit einer Risikobewertung auf ein Minimum beschränkt werden sollte. Für Entwicklungszwecke lohnt sich auch ein Blick auf Dev Drive (Performance-Modus = asynchrones Scannen), das als sichere Alternative zu Ordnerausschlüssen konzipiert wurde.
Wie zeichnet Process Monitor jede einzelne I/O-Operation auf?
Weil sich Procmon beim Start selbst beim Filter-Manager als Minifilter im Altitude-Band für Activity Monitor registriert. Führen Sie bei laufendem Procmon aus einer administrativen Eingabeaufforderung fltmc aus, sehen Sie in der Liste einen Filter, dessen Name mit PROCMON beginnt. Da Procmon als Minifilter bei den Pre- und Post-Phasen der I/O-Operationen auf allen Volumes zugegen ist, kann es lückenlos aufzeichnen, welcher Prozess welche Operation auf welcher Datei ausgeführt hat. Dass die IRP- und Fast-I/O-Begriffe, die wir in dieser Serie verfolgt haben, direkt in Procmons Anzeige auftauchen, liegt genau daran, dass es genau an der Stelle beobachtet, an der die I/O selbst vorbeikommt.
Sollte man bei langsamen Builds auf einem Entwicklungsrechner Filtertreiber verdächtigen?
Der Verdacht lohnt sich sehr. Ein Build ist eine Masse aus dem Erstellen, Lesen, Schreiben und Löschen unzähliger kleiner Dateien, und jede einzelne davon wird zum Prüfziel der Filter (insbesondere des Virenscans) – das macht es zur Arbeitslast, bei der sich die Kosten der Filter am ehesten bemerkbar machen. Das grundlegende Vorgehen bei der Untersuchung ist, in Procmon die Spalte Duration zu betrachten, um zu sehen, in welche Operation die Zeit fließt, und mit fltmc instances die Unterschiede in der Filterkonfiguration zwischen den Umgebungen zu vergleichen. Als Gegenmaßnahmen kommen neben einer nach Risikobewertung eingeführten Ausschlusseinstellung auch die Nutzung von Dev Drive infrage, das eigens für Entwicklungsvolumes konzipiert ist. Auf einem Dev Drive läuft der Virenschutz im Performance-Modus (asynchrones Scannen), und Microsoft positioniert das als sicherere Alternative zu einer Ausschlusseinstellung.

Autorenprofil

Profilseite des Artikelautors.

Go Komura

Geschäftsführer von KomuraSoft LLC

Spezialisiert auf Windows-Softwareentwicklung, technische Beratung und Fehleranalyse, insbesondere bei bestehenden Systemen und schwer reproduzierbaren Störungen.

Zurück zum Blog