BypassIO pour les pilotes de filtre
À propos de BypassIO
La fonctionnalité BypassIO offre un chemin d’E/S optimisé pour la lecture à partir de fichiers. L’objectif de ce chemin est de réduire la surcharge CPU liée aux lectures, ce qui aide à répondre aux exigences d’E/S pour le chargement et l’exécution des jeux de nouvelle génération sur Windows. BypassIO fait partie de l’infrastructure permettant de prendre en charge DirectStorage sur Windows. Il est disponible à partir de Windows 11.
Il est important que les mini-filtres mettent en œuvre la prise en charge de BypassIO et que vous gardiez BypassIO activé autant que possible. Sans prise en charge des filtres, les performances des jeux sont dégradées, ce qui entraîne une mauvaise expérience de jeu pour les utilisateurs finaux.
Il y aura des utilisations plus larges que les jeux dans les futures versions de Windows.
BypassIO est un concept par handle. Lorsque BypassIO est demandé, c’est pour un handle de fichier explicite. BypassIO n’a aucun effet sur les autres handles pour ce fichier.
FSCTL_MANAGE_BYPASS_IO et un équivalent IOCTL_STORAGE_MANAGE_BYPASS_IO ont été ajoutés dans le cadre de cette infrastructure. Les mini-filtres traitent FSCTL_MANAGE_BYPASS_IO, tandis que IOCTL_STORAGE_MANAGE_BYPASS_IO est envoyé par les systèmes de fichiers aux piles volume/stockage. Ces codes de contrôle sont conçus pour être diagnostiquables : ils renvoient tous deux l’identité du pilote qui a échoué à la demande de BypassIO, ainsi que la raison de son refus.
Cette page fournit des détails architecturaux sur les filtres système de fichiers et les piles de stockage, ainsi que des informations sur la mise en œuvre de BypassIO dans un pilote de mini-filtre. Veuillez consulter la section BypassIO pour les pilotes de stockage pour obtenir des informations spécifiques à ces pilotes.
Étendue de la prise en charge de BypassIO
À partir de Windows 11, BypassIO est pris en charge comme suit :
Uniquement sur les systèmes clients Windows. Le support des systèmes serveurs sera ajouté dans une version future.
Uniquement sur les appareils de stockage NVMe. Le support pour d’autres technologies de stockage sera ajouté dans une version future.
Uniquement sur le système de fichiers NTFS. Le support pour d’autres systèmes de fichiers sera ajouté dans une version future.
Seules les lectures non mises en cache sont prises en charge. Le support pour les écritures non mises en cache sera ajouté dans une version future.
Prise en charge uniquement sur des fichiers (non pris en charge sur des handles de répertoire ou de volume).
Comment fonctionne BypassIO
Lorsque NtReadFile est appelé sur un FileHandle activé pour BypassIO, l’opération ne passe généralement pas par la pile d’E/S traditionnelle, qui traverse l’ensemble des piles système de fichiers, volume et stockage. À la place, l’opération passe directement du gestionnaire d’E/S au système de fichiers (NTFS), puis au pilote de disque (classpnp) et ensuite au pilote StorNVMe. Avec un FileHandle entièrement activé pour BypassIO :
- Tous les filtres de système de fichiers sont ignorés.
- Tous les filtres de pile de volume sont ignorés.
- Tous les filtres et pilotes de pile de stockage au-dessus du pilote de disque, et entre les pilotes de disque et StorNVMe, sont ignorés.
Dans des scénarios où la pile de filtres de système de fichiers prend en charge BypassIO mais pas la pile volume et/ou stockage :
- Les E/S de lecture contournent la pile de filtres.
- Les E/S de lecture sont toujours envoyées à travers la pile volume et/ou stockage.
Ce niveau de support est connu sous le nom de BypassIO partiel.
Modifications et ajouts de DDI pour BypassIO
Les DDI suivants pertinents pour les pilotes de filtre ont été ajoutés pour fournir une prise en charge de BypassIO :
- Fonction FltVetoBypassIo
- Enumérateur FS_BPIO_INFLAGS
- Structure FS_BPIO_INFO
- Structure FS_BPIO_INPUT
- Enumérateur FS_BPIO_OPERATIONS
- Enumérateur FS_BPIO_OUTFLAGS
- Structure FS_BPIO_OUTPUT
- Structure FS_BPIO_RESULTS
- Code de contrôle FSCTL_MANAGE_BYPASS_IO
- Fonction FsRtlGetBypassIoOpenCount
De plus, les DDI suivants ont été modifiés pour prendre en charge BypassIO :
- Un champ BypassIoOpenCount a été ajouté à la structure FSRTL_ADVANCED_FCB_HEADER. Le système de fichiers utilise ce champ pour maintenir un compte des FileObjects uniques sur un flux qui a actuellement BypassIO activé. L’ajout de ce champ augmente la taille de la structure. La version de la structure à utiliser à partir de Windows 11 est FSRTL_FCB_HEADER_V4.
Effet d’autres opérations sur des handles activés pour BypassIO
Activer BypassIO sur un handle n’affecte pas les autres handles. Cependant, d’autres opérations sur un handle activé pour BypassIO affectent l’utilisation de BypassIO, comme dans les scénarios suivants :
Si vous avez le Handle A ouvert sur un fichier où BypassIO est activé et fonctionne, et qu’une autre personne (par exemple, un autre thread ou processus) ouvre le Handle B pour effectuer des E/S mises en cache ou mappées en mémoire, alors BypassIO est temporairement suspendu sur le Handle A jusqu’à ce que le Handle B soit fermé. Le système utilise alors le chemin d’E/S traditionnel pour garantir que des données obsolètes ne surviennent pas. Le système continue d’utiliser le chemin d’E/S traditionnel sur ce handle jusqu’à ce que toutes les sections de données et les cartes de cache soient démantelées. En conséquence, les filtres doivent fermer le fichier du handle avant que BypassIO ne puisse reprendre.
Si un fichier activé pour BypassIO est marqué comme sparse, toutes les opérations BypassIO commencent à utiliser le chemin d’E/S traditionnel.
Défragmenter un fichier activé pour BypassIO entraîne le passage de toutes les opérations BypassIO au chemin d’E/S traditionnel. Une fois la défragmentation terminée, le système revient au chemin BypassIO sur ce handle.
Mise en œuvre de la prise en charge de BypassIO dans les mini-filtres
Mettez à jour vos fichiers INF ou MANIFEST
À partir de Windows 11, les développeurs de filtres doivent ajouter SUPPORTED_FS_FEATURES_BYPASS_IO à SupportedFeatures dans les fichiers INF ou MANIFEST de leur pilote. (Vous pouvez taper fltmc instances
dans une invite de commande élevée pour voir les valeurs « SprtFtrs » pour tous les filtres actifs).
Remarque
Un filtre qui ne peut jamais prendre en charge BypassIO doit toujours ajouter SUPPORTED_FS_FEATURES_BYPASS_IO à son état SupportedFeatures, puis mettre un veto de manière appropriée à l’intérieur du filtre, en précisant la raison.
Les mini-filtres sont encouragés à minimiser autant que possible le veto de BypassIO.
Si un mini-filtre se connecte à un volume où BypassIO est activé, mais que ce mini-filtre n’a pas mis à jour son paramètre SupportedFeatures pour inclure SUPPORTED_FS_FEATURES_BYPASS_IO, toutes les opérations BypassIO sur ce volume sont immédiatement bloquées, revenant au chemin d’E/S traditionnel, ce qui entraîne une dégradation des performances de jeu.
Les mini-filtres qui ne filtrent pas IRP_MJ_READ ou IRP_MJ_WRITE sont automatiquement inscrits à la prise en charge de BypassIO, comme s’ils avaient ajouté SUPPORTED_FS_FEATURES_BYPASS_IO dans SupportedFeatures.
Les opérations FS_BPIO_OP_ENABLE et FS_BPIO_OP_QUERY échouent sur une pile s’il y a un mini-filtre attaché qui ne s’inscrit pas.
Mettre en œuvre la prise en charge des requêtes BypassIO
Les mini-filtres doivent ajouter la prise en charge des requêtes BypassIO, qui sont envoyées via le code de contrôle FSCTL_MANAGE_BYPASS_IO. Veuillez consulter la section Prise en charge des opérations BypassIO pour plus de détails.
Détermination du bon fonctionnement de BypassIO
Une commande fsutil ajoutée émet un FSCTL_MANAGE_BYPASS_IO spécifiant l’opération FS_BPIO_OP_QUERY. Les résultats affichés identifient le premier pilote empêchant BypassIO et la raison.
> fsutil bypassIo state /v <path>
Où <path> peut être un volume, un répertoire ou un nom de fichier spécifique, et /v est un indicateur optionnel pour des détails supplémentaires.
Dans ce premier exemple, supposons que le mini-filtre WOF ne se soit pas inscrit à BypassIO. Exécuter la commande fsutil bypassIo state c:\
produit la sortie suivante :
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.
Dans ce second exemple, exécuter fsutil bypassIO state /v c:\
sur un système où BitLocker est activé produit la sortie suivante :
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
Comportement spécifique à NTFS
BypassIO peut être activé sur un fichier résident NTFS ; cependant, le fichier suit le chemin d’E/S traditionnel tant qu’il est résident. Si une écriture se produit sur le fichier de sorte qu’il devienne non résident, le système passe au chemin BypassIO.
La compression NTFS ne peut pas être activée sur un fichier actif pour BypassIO.
Le chiffrement NTFS peut être activé sur un fichier actif pour BypassIO. BypassIO est suspendu.
BypassIO n’affecte pas les opérations de lecture/écriture déchargées.