Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
À propos de BypassIO
La fonctionnalité BypassIO offre un chemin d’E/S optimisé pour la lecture à partir de fichiers. Ce chemin réduit la surcharge processeur de lecture, ce qui permet de répondre aux demandes d’E/S de chargement et d’exécution de jeux de nouvelle génération sur Windows. BypassIO fait partie de l’infrastructure qui prend en charge DirectStorage sur Windows. Il est disponible à partir de Windows 11.
Il est important que les mini-filtres implémentent la prise en charge de BypassIO et que vous maintenez BypassIO activé autant que possible. Sans prise en charge des filtres, les performances des jeux se dégradent, ce qui entraîne une mauvaise expérience de jeu pour les utilisateurs finaux.
Les futures versions de Windows incluent des utilisations d’applications plus larges au-delà des jeux.
BypassIO est un concept par handle. Lorsque vous demandez BypassIO, vous le demandez pour un handle de fichier explicite. BypassIO n’a aucun effet sur les autres handles pour ce fichier.
FSCTL_MANAGE_BYPASS_IO et un IOCTL_STORAGE_MANAGE_BYPASS_IO équivalent ont été ajoutés dans le cadre de cette infrastructure. Les mini-filtres traitent FSCTL_MANAGE_BYPASS_IO, tandis que les systèmes de fichiers envoient IOCTL_STORAGE_MANAGE_BYPASS_IO aux piles de volume et de stockage. Ces codes de contrôle sont conçus pour être diagnostiques : ils retournent tous les deux l’identité du pilote qui a échoué la demande BypassIO et la raison de son veto.
Cet article fournit des détails architecturaux sur les piles de filtres et de stockage du système de fichiers, ainsi que des informations sur l'implémentation de BypassIO dans un pilote de minifiltre. Consultez BypassIO pour les pilotes de stockage pour les informations BypassIO spécifiques aux pilotes de stockage.
Étendue de la prise en charge de BypassIO
À compter de Windows 11, la prise en charge de BypassIO inclut les fonctionnalités suivantes :
Prise en charge uniquement sur les systèmes clients Windows. La prise en charge du système serveur sera disponible dans une prochaine version.
Prise en charge uniquement sur les appareils de stockage NVMe. La prise en charge d’autres technologies de stockage sera disponible dans une prochaine version.
Prise en charge uniquement sur le système de fichiers NTFS. La prise en charge d’autres systèmes de fichiers sera disponible dans une prochaine version.
Prise en charge des lectures non mises en cache uniquement. La prise en charge des écritures non mises en cache est disponible dans une prochaine version.
Prise en charge uniquement pour les fichiers (non pris en charge pour les descripteurs de répertoire ou de volume).
Comment fonctionne BypassIO
Lorsque vous appelez NtReadFile sur un FileHandle compatible BypassIO, l’opération ne transite généralement pas par la pile d’E/S traditionnelle, qui traverse l’ensemble de la pile du système de fichiers, de la pile de volumes et de la pile de 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 :
- L’opération ignore tous les filtres du système de fichiers.
- L’opération ignore tous les filtres de pile de volume.
- L’opération ignore tous les filtres et pilotes de pile de stockage qui se trouvent au-dessus du pilote de disque et entre le disque et les pilotes StorNVMe.
Dans les scénarios où la pile de filtres de système de fichiers prend en charge BypassIO, mais pas le volume et la pile de stockage :
- Les E/S de lecture contournent la pile de filtres.
- Les entrées/sorties passent toujours par le système de fichiers et la pile de stockage.
Ce niveau de support est connu sous le nom de BypassIO partiel.
Image montrant le chemin d’E/S traditionnel pour une requête de lecture.
Image montrant le chemin d’E/S BypassIO pour une requête de lecture.
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
En outre, les DDIS suivants ont changé 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 prend jamais en charge BypassIO doit toujours ajouter SUPPORTED_FS_FEATURES_BYPASS_IO à son état SupportedFeatures, puis rejeter de manière appropriée à l'intérieur du filtre, en expliquant 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 optent automatiquement pour la prise en charge de BypassIO, comme s’ils ont 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 qui empêche BypassIO et la raison pour laquelle.
> 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, le minifilter WOF n’opte pas pour 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
Vous pouvez activer BypassIO sur un fichier résident NTFS ; toutefois, le fichier prend 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.
Vous ne pouvez pas activer la compression NTFS sur un fichier actif BypassIO.
Vous pouvez activer le chiffrement NTFS sur un fichier actif BypassIO. BypassIO est suspendu.
BypassIO n’affecte pas les opérations de lecture/écriture déchargées.