Share via


BypassIO pour les pilotes de filtre

À propos de BypassIO

À compter de Windows 11, BypassIO a été ajouté en tant que chemin d’E/S optimisé pour la lecture à partir de fichiers. L’objectif de ce chemin est de réduire la surcharge processeur liée aux lectures, ce qui permet de répondre aux demandes d’E/S liées au chargement et à l’exécution de jeux de nouvelle génération sur Windows. BypassIO fait partie de l’infrastructure pour prendre en charge DirectStorage sur Windows.

Il est important que les minifiltres implémentent 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 d’applications plus larges au-delà des jeux dans les prochaines versions de Windows.

BypassIO est un concept par handle. Lorsque BypassIO est demandé, il s’agit d’un handle de fichier explicite. BypassIO n’a aucun impact 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 minifiltres traitent FSCTL_MANAGE_BYPASS_IO, tandis que IOCTL_STORAGE_MANAGE_BYPASS_IO est envoyé par les systèmes de fichiers aux piles de volume/stockage. Ces codes de contrôle sont conçus pour être diagnostiques : ils retournent tous deux l’identité du pilote qui a échoué à la demande BypassIO et la raison du veto.

Cette page fournit des détails architecturaux sur les piles de filtre 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 obtenir des informations bypassIO spécifiques aux pilotes de stockage.

Étendue de la prise en charge de BypassIO

À partir de Windows 11, BypassIO est pris en charge comme suit :

  • Sur les systèmes clients Windows uniquement. La prise en charge du système de serveur sera ajoutée dans une version ultérieure.

  • Sur les appareils de stockage NVMe uniquement. La prise en charge d’autres technologies de stockage sera ajoutée dans une version ultérieure.

  • Sur le système de fichiers NTFS uniquement. La prise en charge d’autres systèmes de fichiers sera ajoutée dans une version ultérieure.

  • Seules les lectures non mises en cache sont prises en charge. La prise en charge des écritures non mises en cache sera ajoutée dans une version ultérieure.

  • Pris en charge uniquement sur les fichiers (non pris en charge sur les handles de répertoire ou de volume).

Fonctionnement de BypassIO

Lorsque NtReadFile est appelé sur un FileHandle avec BypassIO, l’opération ne passe 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. Au lieu de cela, l’opération passe directement du gestionnaire d’E/S au système de fichiers (NTFS), au pilote de disque (classpnp), puis au pilote StorNVMe. Avec un FileHandle entièrement compatible BypassIO :

  • Tous les filtres du système de fichiers sont ignorés.
  • Tous les filtres de pile de volumes sont ignorés.
  • Tous les filtres et pilotes de pile de stockage au-dessus du pilote de disque, et entre le disque et les pilotes StorNVMe, sont ignorés.

Dans les scénarios où la pile de filtres du système de fichiers prend en charge BypassIO, mais que la pile de volume et/ou de stockage ne le font pas, lisez les AUTHENTIFICATION ignorent la pile de filtres, mais sont toujours envoyées via le volume et/ou la pile de stockage. Ce niveau de prise en charge est appelé BypassIO partiel.

Image montrant le chemin d’E/S traditionnel pour une demande de lecture.

Image montrant le chemin d’accès d’E/S de contournement pour une demande de lecture.

Modifications et ajouts des DDIs pour BypassIO

Les DDIs suivants pertinents pour les pilotes de filtre ont été ajoutés pour fournir la prise en charge de BypassIO :

En outre, les DDIs 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 gérer un nombre d’objets FileObjects uniques sur un flux sur lequel BypassIO est actuellement activé. L’ajout de ce champ augmente la taille de la structure. La version de structure à utiliser à partir de Windows 11 est FSRTL_FCB_HEADER_V4.

Impact d’autres opérations sur les handles avec BypassIO

L’activation de BypassIO sur un handle n’a pas d’impact sur d’autres handles. Toutefois, d’autres opérations sur un handle avec BypassIO ont un impact sur l’utilisation de BypassIO, comme dans les scénarios suivants :

  • Si handle A est ouvert à un fichier sur lequel BypassIO est activé et fonctionne, et qu’une personne (par exemple, un autre thread ou processus) ouvre Handle B pour effectuer des E/S mises en cache ou mappées à la mémoire, BypassIO est temporairement suspendu sur Handle A jusqu’à ce que Handle B soit fermé. Le système utilise plutôt le chemin d’E/S traditionnel pour garantir que les données obsolètes ne se produisent 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 mappages de cache soient détruits. Les filtres doivent donc fermer le fichier du handle pour que BypassIO puisse reprendre.

  • Si un fichier avec BypassIO est marqué partiellement, toutes les opérations BypassIO commencent à utiliser le chemin d’E/S traditionnel.

  • La défragmentation d’un fichier avec BypassIO entraîne l’utilisation du chemin d’E/S traditionnel pour toutes les opérations BypassIO. Une fois la défragmentation terminée, le système revient au chemin BypassIO sur cette poignée.

Implémentation de la prise en charge de BypassIO dans des minifiltres

Mettre à jour vos fichiers INF ou MANIFEST

À compter de Windows 11, les développeurs de filtres doivent ajouter SUPPORTED_FS_FEATURES_BYPASS_IO à SupportedFeatures dans les fichiers INF ou MANIFEST de votre pilote. (Vous pouvez taper fltmc instances une invite de commandes avec élévation de privilèges pour afficher les valeurs « SprtFtrs » pour tous les filtres actifs.)

Notes

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 approprié à l’intérieur du filtre, en spécifiant la raison.

Les minifiltres sont encouragés à réduire autant que possible le veto à BypassIO.

Si un minifiltre s’attache à un volume sur lequel BypassIO est activé, mais que ce minifiltre 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, ce qui revient au chemin d’E/S traditionnel, ce qui entraîne une dégradation des performances de jeu.

Les minifiltres qui ne filtrent pas IRP_MJ_READ ou IRP_MJ_WRITE sont automatiquement inclus dans la prise en charge bypassIO, comme s’ils avaient ajouté des SUPPORTED_FS_FEATURES_BYPASS_IO dans SupportedFeatures.

Les opérations FS_BPIO_OP_ENABLE et FS_BPIO_OP_QUERY échouent sur une pile si un minifiltre attaché n’a pas été activé.

Implémenter la prise en charge des demandes BypassIO

Les minifiltres doivent ajouter la prise en charge des requêtes BypassIO, qui sont envoyées via le code de contrôle FSCTL_MANAGE_BYPASS_IO . Pour plus d’informations, consultez Prise en charge des opérations BypassIO .

Déterminer si BypassIO fonctionne

Une commande fsutil a été ajoutée qui é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>

<path> peut être un volume, un répertoire ou un nom de fichier spécifique, et /v est un indicateur détaillé facultatif.

Dans ce premier exemple, supposons que le minifiltre WOF n’a pas choisi BypassIO. L’exécution de la commande fsutil bypassIo state c:\ entraîne 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 deuxième exemple, l’exécution fsutil bypassIO state /v c:\ sur un système où BitLocker est activé entraîne 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 ; toutefois, le fichier prend le chemin d’E/S traditionnel tant qu’il est résident. Si une écriture se produit dans le fichier de sorte qu’il devient non-résident, le système bascule pour utiliser le chemin BypassIO.

La compression NTFS ne peut pas être activée sur un fichier actif BypassIO.

Le chiffrement NTFS peut être activé sur un fichier actif BypassIO. BypassIO est suspendu.

BypassIO n’a aucun impact sur les opérations de déchargement en lecture/écriture.