Die Tiefen von Windows I/O (Teil 6, Finale) ── Filtertreiber und Minifilter: Warum Procmon und Virenscanner sich in die I/O einklinken können
· Go Komura · 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
flowchart TB
subgraph OLD["Legacy-Ansatz"]
L1["Legacy-Filter A"]
L2["Legacy-Filter B"]
LFS1["Dateisystem"]
L1 --> L2
L2 --> LFS1
NOTE1["Reihenfolge der Ladereihenfolge überlassen<br/>kein sicheres Entladen möglich"]
end
subgraph NEW["Minifilter-Ansatz (heutiger Standard)"]
FM["Filter-Manager (FltMgr)<br/>vom Betriebssystem mitgeliefert. Einziges, was auf dem Stapel sitzt"]
M1["Minifilter A (hohe Altitude)"]
M2["Minifilter B (niedrige Altitude)"]
LFS2["Dateisystem"]
FM -. "Callback registrieren" .- M1
FM -. "Callback registrieren" .- M2
FM --> LFS2
NOTE2["Reihenfolge deterministisch über Altitude<br/>Laden zu jedem Zeitpunkt möglich<br/>(unterstützende Filter auch entladbar)"]
end
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.
sequenceDiagram
participant IOM as I/O-Manager
participant FM as FltMgr
participant A as Minifilter A<br/>(hohe Altitude)
participant B as Minifilter B<br/>(niedrige Altitude)
participant FS as NTFS
IOM->>FM: Anforderung (z. B. IRP_MJ_CREATE, die Welt aus Teil 1)
FM->>A: Pre-Callback
FM->>B: Pre-Callback
FM->>FS: Weiter zum Dateisystem
FS-->>FM: Ergebnis
FM-->>B: Post-Callback
FM-->>A: Post-Callback
FM-->>IOM: Abschluss (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.
flowchart TB
PRE["Der Pre-Callback wird aufgerufen"]
Q{"Was mit dieser Operation geschehen soll"}
PASS["Durchlassen<br/>(bei Bedarf auch erklären, dass kein Post-Callback nötig ist)"]
DENY["Ablehnen<br/>sofort Zugriff verweigert o. Ä. zurückgeben<br/>Beispiel: Virus erkannt, Schreiben blockiert"]
DONE["Selbst abschließen<br/>Beispiel: Ein Cloud-Filter holt<br/>den echten Inhalt und liefert ihn"]
MOD["Parameter oder Inhalt ändern und weiterleiten<br/>Beispiel: ein Verschlüsselungsfilter"]
PRE --> Q
Q --> PASS
Q --> DENY
Q --> DONE
Q --> MOD
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.
flowchart TB
APP["Näher an der Anwendung (größere Zahlen)"]
G1["FSFilter Activity Monitor: 360000–389999<br/>Beobachtung und Aufzeichnung von I/O (hier lebt Procmon)"]
G2["FSFilter Undelete: 340000–349999<br/>Wiederherstellung gelöschter Dateien"]
G3["FSFilter Anti-Virus: 320000–329999<br/>Erkennung und Entfernung von Viren"]
G4["FSFilter Replication: 300000–309999<br/>Replikation an einen entfernten Ort"]
G5["FSFilter Continuous Backup: 280000–289999<br/>fortlaufende Sicherung"]
G6["Weiter unten: Content Screener /<br/>Quota Management / System Recovery /<br/>Bänder für Verschlüsselung, Komprimierung usw."]
FS["Näher am Dateisystem (kleinere Zahlen)"]
APP --> G1 --> G2 --> G3 --> G4 --> G5 --> G6 --> FS
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.10PROCMON24(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 Siefltmcvor 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).
sequenceDiagram
participant App as Anwendung
participant AV as AV-Minifilter
participant FS as NTFS
App->>AV: Datei öffnen
Note over AV: pre-create: vorherige Beurteilung von Pfad und Richtlinie
AV->>FS: Durchlassen (Öffnen wird ausgeführt)
FS-->>AV: Öffnen erfolgreich (post-create)
Note over AV: Bei einer noch nicht gescannten Datei<br/>wird hier der Inhalt gescannt<br/>und bei einem Problem das Öffnen rückgängig gemacht<br/>── die Hauptursache für langsames Öffnen
AV-->>App: Ohne Problem wird das Handle zurückgegeben
App->>AV: Schreiben und Schließen
Note over AV: Eine geänderte Datei wird<br/>z. B. beim Schließen erneut zum Scanziel
Note over App,FS: Bei sehr vielen kleinen Dateien (z. B. Zwischenprodukten eines Builds)<br/>summiert sich dieser Hin- und Rückweg pro Datei
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.
flowchart TB
S["Symptom: dieselbe Anwendung, aber nur<br/>in einer bestimmten Umgebung ist der Dateizugriff langsam"]
P1["In Procmon die Spalte Duration betrachten<br/>bei welcher Operation (IRP_MJ_CREATE? WRITE?)<br/>die Zeit verloren geht"]
Q1{"Ist eine bestimmte Operation gleichmäßig langsam?"}
F1["fltmc instances mit einer schnellen Umgebung vergleichen<br/>Unterschied in der Filterkonfiguration betrachten"]
Q2{"Ist ein Filter aus der Differenz die Ursache?"}
A1["Ausschlusseinstellung (mit Risikobewertung) oder<br/>Prüfung von Dev Drive / Rücksprache mit dem Hersteller"]
A2["Etwas anderes als einen Filter vermuten:<br/>Cache (Teil 4), Fragmentierung oder MFT (Teil 5),<br/>Netzwerkziel (UNC), das Gerät selbst"]
S --> P1 --> Q1
Q1 -->|"Ja"| F1 --> Q2
Q2 -->|"Ja"| A1
Q2 -->|"Nein"| A2
Q1 -->|"Nein (unregelmäßig)"| A2
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.
Procmon.exeals Administrator starten.- Menü Options > Select Columns… öffnen und in der Spaltenliste Duration ankreuzen.
- Über Menü Filter > Filter… (Strg+L)
Process Name/is/ den Namen der Ziel-exe /Includeeingeben, 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.
flowchart TB
APP["Anwendung<br/>ReadFile / WriteFile / async-await"]
API["Teil 2: Synchrone/asynchrone I/O<br/>Handle-Modi und OVERLAPPED"]
IOCP["Teil 3: IOCP und der .NET-Thread-Pool<br/>Entgegennahme von Abschlüssen und Ausführung von Fortsetzungen"]
IOM["Teil 1: I/O-Manager und IRP<br/>Namensauflösung, drei Objekte, Gerätestapel"]
FLT["Teil 6: Filter und Minifilter<br/>FltMgr, Altitude, Pre/Post"]
CACHE["Teil 4: Cache-Manager<br/>256-KB-Views, Lazy Writer, Fast I/O<br/>(arbeitet mit NTFS zusammen)"]
NTFS["Teil 5: NTFS<br/>MFT, Streams, Links, zwei Journale"]
HW["Speicherstapel und Gerät"]
APP --> API
API --> IOM
IOCP -. "Abschluss kehrt hierhin zurück" .-> APP
IOM --> FLT
FLT --> NTFS
NTFS -. "Cache-fähige I/O arbeitet zusammen<br/>(das Dateisystem ruft die Cache-Funktion auf)" .- CACHE
NTFS --> HW
HW -. "Interrupt zu Abschluss (Teil 1)" .-> IOCP
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
fltmcgemeldeten 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
- Die Tiefen von Windows I/O (Teil 1) ── Jedes Lesen und Schreiben wird zu einem IRP: Das Gesamtbild des I/O-Systems
- Die Tiefen von Windows-I/O (Teil 4) ── Cache-Manager: Wann erreicht Ihr WriteFile tatsächlich die Festplatte?
- Die Tiefen von Windows I/O (Teil 5) ── NTFS-Interna: Das Dateisystem anhand des MFT verstehen
- Process Monitor (ProcMon) Praxisleitfaden ── „Konfiguration wird nicht gelesen“ und ACCESS DENIED in 10 Minuten identifizieren
- Wenn die eigene Windows-App als Virus gemeldet wird ── Umgang mit Fehlalarmen von Microsoft Defender und den Auswirkungen auf die Leistung
- Process Explorer / Handle / VMMap in der Praxis ── Hängern, Lecks und „Datei wird verwendet“ vom aktuellen Zustand aus nachjagen
- Eine Mindest-Sicherheitscheckliste für die Windows-Anwendungsentwicklung
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“.
Referenzlinks
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
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
-
Microsoft Learn, Blocking legacy file system filter drivers. Dazu, dass das Ausführen von
fltmc filtersin 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 -
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
-
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
Verwandte Artikel
Aktuelle Artikel mit denselben Schlagwörtern führen zu verwandten Themen weiter.
Die Tiefen von Windows I/O (Teil 1) — Jedes Lesen und Schreiben wird zu einem IRP: Das Gesamtbild des I/O-Systems
Teil 1 einer Serie, die das Windows-I/O-System von Grund auf erklärt. Wir stellen den Namensraum des Object Managers, die drei Objektarte...
Die Tiefen von Windows-I/O (Teil 4) — Cache-Manager: Wann erreicht Ihr WriteFile tatsächlich die Festplatte?
Teil 4 einer bebilderten Reihe über den Windows-Cache-Manager. Behandelt den als Dateizuordnung implementierten Cache, Read-Ahead und ver...
Die Tiefen von Windows I/O (Teil 2) — Synchrones und asynchrones I/O: Was OVERLAPPED wirklich bedeutet
Teil 2 einer Serie, die Windows' synchrones und asynchrones I/O (Overlapped I/O) anhand von Diagrammen erklärt. Wir stellen die Bedeutung...
Die Tiefen von Windows I/O (Teil 5) — NTFS-Interna: Das Dateisystem anhand des MFT verstehen
Teil 5 einer Serie, die die NTFS-Interna anhand von Diagrammen erklärt. Behandelt werden der MFT und Dateidatensätze, mehrere Datenströme...
Die Tiefen von Windows-I/O (Teil 3) — I/O-Completion-Ports (IOCP) und der .NET-Thread-Pool: Der Keller unter async/await
Teil 3 einer Reihe, die I/O-Completion-Ports (IOCP) anhand von Diagrammen erklärt. Behandelt das Design, das Completion-Queue und Thread-...
Verwandte Themen
Diese Seiten ordnen den Artikel in einen größeren Leistungs- und Entscheidungskontext ein.
Technische Windows-Themen
Portal zu Windows-Entwicklung, Fehleranalyse und der Nutzung bestehender Assets.
Leistungen zu diesem Thema
Dieser Artikel ist direkt mit den folgenden Leistungen verbunden.
Windows-App-Entwicklung
Geschäftsanwendungen, Geräteintegration und Kommunikationstools von den Anforderungen bis zur Umsetzung.
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.