BypassIO für Filtertreiber

Informationen zu BypassIO

Ab Windows 11 wurde BypassIO als optimierter E/A-Pfad zum Lesen aus Dateien hinzugefügt. Das Ziel dieses Pfads besteht darin, den CPU-Mehraufwand für Lesevorgänge zu reduzieren, was dazu beiträgt, die E/A-Anforderungen beim Laden und Ausführen von Spielen der nächsten Generation unter Windows zu erfüllen. BypassIO ist Teil der Infrastruktur zur Unterstützung von DirectStorage unter Windows.

Es ist wichtig, dass Minifilter unterstützung für BypassIO implementieren und BypassIO so weit wie möglich aktiviert bleiben. Ohne Filterunterstützung wird die Spielleistung beeinträchtigt, was zu einer schlechten Spielerfahrung für Endbenutzer führt.

In zukünftigen Windows-Versionen wird es eine breitere Anwendungsverwendung geben, die über das Spielen hinausgeht.

BypassIO ist ein Konzept pro Handle. Wenn BypassIO angefordert wird, ist dies für ein explizites Dateihandle. BypassIO hat keine Auswirkungen auf andere Handles für diese Datei.

FSCTL_MANAGE_BYPASS_IO und eine entsprechende 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-/Speicherstapel gesendet werden. Diese Steuercodes sind so konzipiert, dass sie diagnosierbar sind: Sie geben sowohl die Identität des Treibers zurück, bei dem die BypassIO-Anforderung fehlgeschlagen ist, als auch den Grund für ihr Veto.

Auf dieser Seite finden Sie Architekturdetails in den Dateisystemfiltern und Speicherstapeln sowie Informationen zur Implementierung von BypassIO in einem Minifiltertreiber. Informationen zu BypassIO, die speziell für Speichertreiber gelten, 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. Die Serversystemunterstü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 im 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.

  • Nur für Dateien unterstützt (in Verzeichnis- oder Volumehandles nicht unterstützt).

Funktionsweise von BypassIO

Wenn NtReadFile für ein FileHandle mit BypassIO-Unterstützung aufgerufen wird, wird der Vorgang in der Regel nicht durch den herkömmlichen E/A-Stapel durchlaufen, der den gesamten Dateisystemstapel, Volumestapel und Speicherstapel durchläuft. Stattdessen wird der Vorgang direkt vom E/A-Manager zum DATEISYSTEM (NTFS) und dann zum Datenträgertreiber (classpnp) und dann zum StorNVMe-Treiber ausgeführt. Mit einem vollständig BypassIO-fähigen FileHandle:

  • Alle Dateisystemfilter werden übersprungen.
  • Alle Volumestapelfilter werden übersprungen.
  • Alle Speicherstapelfilter und Treiber oberhalb des Datenträgertreibers sowie zwischen dem Datenträger und storNVMe-Treibern werden übersprungen.

In Szenarien, in denen der Dateisystemfilterstapel BypassIO unterstützt, aber das Volume und/oder der Speicherstapel nicht, umgehen Lese-IOs den Filterstapel, werden aber weiterhin über das Volume und/oder den Speicherstapel gesendet. Diese Unterstützungsebene wird als partielle BypassIO bezeichnet.

Abbildung, die den herkömmlichen E-A-Pfad für eine Leseanforderung zeigt.

Abbildung, die den E-A-Pfad umgehen für eine Leseanforderung zeigt.

DDIs-Änderungen und -Ergänzungen für BypassIO

Die folgenden DDIs, die für Filtertreiber relevant sind, wurden hinzugefügt, um BypassIO-Unterstützung bereitzustellen:

Darüber hinaus wurden die folgenden DDIs geändert, um BypassIO zu unterstützen:

  • Der FSRTL_ADVANCED_FCB_HEADER-Struktur wurde ein BypassIoOpenCount-Feld hinzugefügt. Das Dateisystem verwendet dieses Feld, um die Anzahl eindeutiger FileObjects in einem Stream zu verwalten, für den BypassIO derzeit aktiviert ist. Durch das Hinzufügen dieses Felds wird die Strukturgröße erhöht. 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 für ein BypassIO-fähiges Handle wirken sich jedoch auf die Verwendung von BypassIO aus, z. B. in den folgenden Szenarien:

  • Wenn Handle A für eine Datei geöffnet ist, für die BypassIO aktiviert ist und funktioniert, und jemand (z. B. ein anderer Thread oder Prozess) Handle B öffnet, um zwischengespeicherte oder im Arbeitsspeicher zugeordnete E/A auszuführen, wird BypassIO für 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 abgerissen sind. Daher müssen Filter die Datei des Handles schließen, damit 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.

  • Das Defragmentieren einer BypassIO-fähigen Datei bewirkt, dass alle BypassIO-Vorgänge den herkömmlichen E/A-Pfad verwenden. Sobald die Defragmentierung abgeschlossen ist, wechselt das System zurück zum BypassIO-Pfad für dieses Handle.

Implementieren der BypassIO-Unterstützung in Minifiltern

Aktualisieren Ihrer INF- oder MANIFEST-Dateien

Ab Windows 11 sollten Filterentwickler SUPPORTED_FS_FEATURES_BYPASS_IOzu SupportedFeatures in den INF- oder MANIFEST-Dateien Ihres Treibers hinzufügen. (Sie können eine Eingabeaufforderung mit erhöhten Rechten eingeben fltmc instances , um "SprtFtrs"-Werte für alle aktiven Filter anzuzeigen.)

Hinweis

Ein Filter, der BypassIO niemals unterstützen kann, sollte weiterhin SUPPORTED_FS_FEATURES_BYPASS_IO zu seinem SupportedFeatures-Status hinzufügen und dann innerhalb des Filters ein entsprechendes Veto einlegen, wobei der Grund angegeben wird.

Minifilter werden empfohlen, das Veto von BypassIO so weit wie möglich zu minimieren.

Wenn ein Minifilter an ein Volume angefügt wird, auf dem BypassIO aktiviert ist, dieser Minifilter seine Einstellung SupportedFeatures jedoch nicht aktualisiert hat, um SUPPORTED_FS_FEATURES_BYPASS_IO einzuschließen, werden alle BypassIO-Vorgänge auf diesem Volume sofort blockiert, sodass auf den herkömmlichen E/A-Pfad zurückgesetzt wird, was zu einer beeinträchtigten Spielleistung führt.

Minifilter, die IRP_MJ_READ oder IRP_MJ_WRITE nicht filtern, werden automatisch für bypassIO-Unterstützung aktiviert, als ob sie in SupportedFeaturesSUPPORTED_FS_FEATURES_BYPASS_IO hinzugefügt hätten.

Die FS_BPIO_OP_ENABLE - und FS_BPIO_OP_QUERY vorgänge schlagen in einem Stapel fehl, wenn ein angefügter Minifilter vorhanden ist, der sich nicht angemeldet hat.

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-Steuerelementcode gesendet werden. Weitere Informationen finden Sie unter Unterstützen von BypassIO-Vorgängen .

Bestimmen, ob BypassIO funktioniert

Ein fsutil-Befehl wurde hinzugefügt, der einen FSCTL_MANAGE_BYPASS_IO ausgibt, der den FS_BPIO_OP_QUERY-Vorgang angibt. Die angezeigten Ergebnisse identifizieren den ersten Treiber, der BypassIO verhindert, und den Grund dafür.

> fsutil bypassIo state /v <path>

Dabei <kann pfad> ein Volume, ein Verzeichnis oder ein bestimmter Dateiname sein, und /v ist ein optionales ausführliches Flag.

Angenommen, in diesem ersten Beispiel hat sich der WOF-Minifilter nicht für BypassIO angemeldet. Wenn Sie den Befehl fsutil bypassIo state c:\ ausführen, wird die folgende Ausgabe ausgegeben:

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 führt die Ausführung fsutil bypassIO state /v c:\ auf einem System, auf dem BitLocker aktiviert ist, zu der folgenden Ausgabe:

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 für eine NTFS-residente Datei aktiviert werden. Die Datei verwendet jedoch den herkömmlichen E/A-Pfad, solange sie resident ist. Wenn ein Schreibvorgang in die Datei erfolgt, sodass sie nicht mehr reagiert, wechselt das System zur Verwendung des BypassIO-Pfads.

Die NTFS-Komprimierung kann für eine aktive BypassIO-Datei nicht aktiviert werden.

Die NTFS-Verschlüsselung kann für eine aktive BypassIO-Datei aktiviert werden. BypassIO wird angehalten.

BypassIO hat keine Auswirkungen auf Lese-/Schreibvorgänge aus dem Offload.