BypassIO für Filtertreiber
Informationen zu BypassIO
Die Funktion BypassIO bietet einen optimierten E/A-Pfad zum Lesen aus Dateien. Ziel dieses Pfads ist es, den CPU-Aufwand der Lesevorgänge zu reduzieren, was dazu beiträgt, die Anforderungen des Ladens und Ausführens von Spielen der nächsten Generation unter Windows zu erfüllen. BypassIO ist Teil der Infrastruktur zur Unterstützung von DirectStorage unter Windows. Die Funktion ist ab Windows 11 verfügbar.
Es ist wichtig, dass Minifilter Unterstützung für BypassIO implementieren und dass BypassIO so weit wie möglich aktiviert bleibt. Ohne Filterunterstützung wird die Spielleistung beeinträchtigt, was zu einem schlechten Spielerlebnis für Endbenutzer führt.
In zukünftigen Windows-Versionen wird eine breitere Anwendung verwendet, die über das Spielen hinausgeht.
BypassIO ist ein Pro-Handle-Konzept. Wenn BypassIO angefordert wird, ist es für ein explizites Dateihandle vorgesehen. BypassIO hat keine Auswirkungen auf andere Handles für diese Datei.
FSCTL_MANAGE_BYPASS_IO und ein entsprechendes IOCTL_STORAGE_MANAGE_BYPASS_IO wurden als Teil dieser Infrastruktur hinzugefügt. Minifilter verarbeiten FSCTL_MANAGE_BYPASS_IO, während IOCTL_STORAGE_MANAGE_BYPASS_IO von Dateisystemen an die Volume-/Speicherstacks gesendet wird. Diese Steuercodes sind so konzipiert, dass sie diagnosefähig sind: Beide geben die Identität des Treibers zurück, für den die BypassIO-Anforderung fehlgeschlagen ist, sowie den Grund für das Vetoing.
Diese Seite enthält Architekturdetails zu den Dateisystemfiltern und Speicherstacks sowie Informationen zur Implementierung von BypassIO in einem Minifilter-Treiber. Für Speichertreiber spezifische BypassIO-Informationen finden Sie unter BypassIO für Speichertreiber.
Umfang der BypassIO-Unterstützung
Ab Windows 11 wird BypassIO wie folgt unterstützt:
Nur auf Windows-Clientsystemen. Serversystem-Unterstützung wird in einer zukünftigen Version hinzugefügt.
Nur auf NVMe-Speichergeräten. Unterstützung für andere Speichertechnologien wird in einer zukünftigen Version hinzugefügt.
Nur auf dem NTFS-Dateisystem. Unterstützung für andere Dateisysteme wird in einer zukünftigen Version hinzugefügt.
Nur nicht zwischengespeicherte Lesevorgänge werden unterstützt. Unterstützung für nicht zwischengespeicherte Schreibvorgänge wird in einer zukünftigen Version hinzugefügt.
Wird nur für Dateien unterstützt (keine Unterstützung für Verzeichnis- oder Volumehandles).
Funktionsweise von BypassIO
Wenn NtReadFile für ein BypassIO-fähiges FileHandle aufgerufen wird, läuft der Vorgang in der Regel nicht durch den herkömmlichen E/A-Stack, der den gesamten Dateisystemstack, Volumestack und Speicherstack durchläuft. Stattdessen läuft der Vorgang direkt vom E/A-Manager zum (NTFS)-Dateisystem, dann zum Datenträgertreiber (Classpnp) und dann zum StorNVMe-Treiber. Bei einem vollständig BypassIO-fähigen FileHandle gilt:
- Alle Dateisystemfilter werden übersprungen.
- Alle Volumestackfilter werden übersprungen.
- Alle Speicherstackfilter und -treiber über dem Datenträgertreiber und zwischen dem Datenträger- und StorNVMe-Treibern werden übersprungen.
In Szenarien, in denen der Dateisystemfilter-Stack BypassIO unterstützt, nicht aber den Volume- und/oder der Speicherstack, gilt:
- Lese-E/As umgehen den Filterstack.
- Lese-E/As werden weiterhin über den Volume- und/oder den Speicherstack gesendet.
Diese Unterstützungsebene wird als Teil-BypassIO bezeichnet.
DDI-Änderungen und Ergänzungen für BypassIO
Die folgenden DDIs, die für Filtertreiber relevant sind, wurden hinzugefügt, um BypassIO-Unterstützung bereitzustellen:
- FltVetoBypassIo-Funktion
- FS_BPIO_INFLAGS-Enumerator
- FS_BPIO_INFO-Struktur
- FS_BPIO_INPUT-Struktur
- FS_BPIO_OPERATIONS-Enumerator
- FS_BPIO_OUTFLAGS-Enumerator
- FS_BPIO_OUTPUT-Struktur
- FS_BPIO_RESULTS-Struktur
- FSCTL_MANAGE_BYPASS_IO-Steuercode
- FsRtlGetBypassIoOpenCount-Funktion
Darüber hinaus wurden die folgenden DDIs geändert, um BypassIO zu unterstützen:
- Ein Feld BypassIoOpenCount wurde der FSRTL_ADVANCED_FCB_HEADER-Struktur hinzugefügt. Das Dateisystem verwendet dieses Feld, um die Anzahl eindeutiger FileObjects für einen Datenstrom zu verwalten, für den derzeit BypassIO aktiviert ist. Das Hinzufügen dieses Felds erhöht die Strukturgröße. Die Strukturversion, die ab Windows 11 verwendet werden soll, ist FSRTL_FCB_HEADER_V4.
Auswirkungen anderer Vorgänge auf BypassIO-fähige Handles
Das Aktivieren von BypassIO für ein Handle wirkt sich nicht auf andere Handles aus. Andere Vorgänge auf einem BypassIO-fähigen Handle wirken sich jedoch auf die Verwendung von BypassIO aus, z. B. in den folgenden Szenarien:
Wenn Sie Handle A für eine Datei geöffnet haben, für die BypassIO aktiviert ist und funktioniert, und jemand (z. B. ein anderer Thread oder Prozess) Handle B öffnet, um zwischengespeicherte oder speicherzugeordnete E/As auszuführen, wird BypassIO auf Handle A vorübergehend angehalten, bis Handle B geschlossen wird. Das System verwendet stattdessen den herkömmlichen E/A-Pfad, um sicherzustellen, dass keine veralteten Daten auftreten. Das System verwendet weiterhin den herkömmlichen E/A-Pfad für dieses Handle, bis alle Datenabschnitte und Cachezuordnungen beseitigt sind. Daher müssen Filter die Datei des Handles schließen, bevor BypassIO fortgesetzt werden kann.
Wenn eine BypassIO-fähige Datei als „sparse“ gekennzeichnet ist, beginnen alle BypassIO-Vorgänge mit der Verwendung des herkömmlichen E/A-Pfads.
Durch Defragmentieren einer BypassIO-fähigen Datei werden alle BypassIO-Vorgänge mit dem herkömmlichen E/A-Pfad verwendet. Nach Abschluss der Defragmentierung wechselt das System wieder zum BypassIO-Pfad auf diesem Handle.
Implementieren der BypassIO-Unterstützung in Minifiltern
Aktualisieren Ihrer INF- oder MANIFEST-Dateien
Ab Windows 11 sollten Filterentwickler SUPPORTED_FS_FEATURES_BYPASS_IO zu SupportedFeatures in den INF- oder MANIFEST-Dateien des Treibers hinzufügen. (Sie können in einer Eingabeaufforderung mit erhöhten Rechten fltmc instances
eingeben, um „SprtFtrs“-Werte für alle aktiven Filter anzuzeigen.)
Hinweis
Ein Filter, der BypassIO niemals unterstützen kann, sollte dennoch SUPPORTED_FS_FEATURES_BYPASS_IO zu seinem SupportedFeatures-Status hinzufügen und dann innerhalb des Filters entsprechend widersprechen, unter Angabe des Grunds.
Minifilter werden empfohlen, um das Vetoing von BypassIO so weit wie möglich zu minimieren.
Wenn ein Minifilter an ein Volume angefügt wird, auf dem BypassIO aktiviert ist, aber dieser Minifilter seine SupportedFeatures-Einstellung nicht so aktualisiert hat, dass SUPPORTED_FS_FEATURES_BYPASS_IO eingeschlossen ist, werden alle BypassIO-Vorgänge auf diesem Volume sofort blockiert, und es wird auf den herkömmlichen E/A-Pfad zurückgegriffen, was zu einer beeinträchtigten Spielleistung führt.
Minifilter, die IRP_MJ_READ oder IRP_MJ_WRITE nicht filtern, werden automatisch für die BypassIO-Unterstützung aktiviert, als ob sie SUPPORTED_FS_FEATURES_BYPASS_IO in SupportedFeatures hinzugefügt hätten.
Die Vorgänge FS_BPIO_OP_ENABLE und FS_BPIO_OP_QUERY schlagen bei einem Stack fehl, wenn ein angefügter Minifilter vorhanden ist, der sich nicht anmeldet.
Implementieren der Unterstützung für BypassIO-Anforderungen
Minifilter sollten Unterstützung für BypassIO-Anforderungen hinzufügen, die über den FSCTL_MANAGE_BYPASS_IO-Steuercode gesendet werden. Ausführliche Informationen finden Sie unter Unterstützen von BypassIO-Vorgängen.
Feststellen, ob BypassIO funktioniert
Ein hinzugefügter fsutil-Befehl gibt eine FSCTL_MANAGE_BYPASS_IO aus, die den FS_BPIO_OP_QUERY-Vorgang angibt. Die angezeigten Ergebnisse identifizieren den ersten Treiber, der BypassIO verhindert, sowie den Grund dafür.
> fsutil bypassIo state /v <path>
Dabei kann der <Pfad> ein Volume, ein Verzeichnis oder ein bestimmter Dateiname und /v ein optionales ausführliches Flag sein.
Nehmen wir in diesem ersten Beispiel an, dass sich der WOF-Minifilter nicht für BypassIO angemeldet hat. Das Ausführen des Befehls fsutil bypassIo state c:\
führt zu folgender Ausgabe:
BypassIo on "c:\" is not currently supported.
Status: 506 (At least one minifilter does not support bypass IO)
Driver: wof.sys
Reason: The specified minifilter does not support bypass IO.
In diesem zweiten Beispiel löst die Ausführung von fsutil bypassIO state /v c:\
auf einem System, bei dem BitLocker aktiviert ist, die folgende Ausgabe aus:
BypassIo on "c:\" is partially supported
Volume stack bypass is disabled (fvevol.sys)
Status: 495 (The specified operation is not supported while encryption is enabled on the target object)
Reason: BitLocker Drive Encryption is enabled.
Storage Type: NVMe
Storage Driver: BypassIo compatible
Driver Name: stornvme.sys
NTFS-spezifisches Verhalten
BypassIO kann auf einer NTFS-residenten Datei aktiviert werden. Die Datei verwendet jedoch den herkömmlichen E/A-Pfad, solange sie sich dort befindet. Wenn ein Schreibvorgang zu der Datei auftritt, sodass sie nicht mehr resident ist, wechselt das System zur Verwendung des BypassIO-Pfads.
Die NTFS-Komprimierung kann auf einer für BypassIO aktivierten Datei nicht aktiviert werden.
Die NTFS-Verschlüsselung kann auf einer für BypassIO aktivierten Datei aktiviert werden. BypassIO wird angehalten.
BypassIO wirkt sich nicht auf Lese-/Schreibvorgänge aus.