Partager via


Prise en charge des opérations BypassIO

À compter de Windows 11, tous les mini-filtres doivent ajouter la prise en charge des opérations BypassIO. Les opérations BypassIO sont demandées en appelant FltFsControlFile ou ZwFsControlFile avec :

Cette page fournit des détails pour chaque opération BypassIO. La demande d’opération est spécifiée sous la forme d’une valeur FS_BPIO_OPERATIONS dans le membre Operation de FS_BPIO_INPUT.

Pour plus d’informations sur BypassIO, consultez BypassIO pour les filtres.

demande de FS_BPIO_OP_ENABLE

Cette demande peut provenir du mode utilisateur ou noyau. BypassIO sur les écritures non mises en cache n’est actuellement pas pris en charge.

FS_BPIO_OP_ENABLE demande au système d’activer BypassIO pour le fichier donné, ce qui signifie qu’un pilote risque de ne pas voir toutes les lectures non mises en cache pour ce fichier.

BypassIO est un concept ouvert par fichier ; autrement dit, une requête FS_BPIO_OP_ENABLE affecte uniquement l’objet de fichier associé à la demande d’activation et ne modifie pas le comportement d’autres ouvertures sur le même fichier ou flux. Si plusieurs demandes d’activation vers le même objet de fichier sont envoyées, seule la première demande est significative et toutes les requêtes suivantes sont ignorées.

Dans le rappel de préopération du pilote :

  • Si un pilote peut prendre en charge BypassIO pour le fichier donné, il doit transférer la requête vers le bas de la pile.

  • Si le pilote ne peut pas prendre en charge BypassIO pour le fichier donné, il doit appeler FltVetoBypassIo avec les informations suivantes :

    • Nom du pilote, qui se trouve dans la structure FLT_RELATED_OBJECTS vers laquelle pointe le paramètre FltObjects.
    • Code d’erreur NTSTATUS qui décrit la raison pour laquelle vous opposez la demande d’activation dans le paramètre OperationStatus .
    • Chaîne unique et descriptive avec des détails sur la raison pour laquelle vous avez bloqué la demande d’activation dans le paramètre FailureReason .

    FltVetoBypassIo écrit le nom du pilote, le code d’erreur et la chaîne décrivant la raison pour laquelle le minifilter a bloqué la demande d’activation dans la structure FS_BPIO_OUTPUT et écrit un événement ETW avec l’état, la raison fournie par le filtre et le nom du filtre dans le journal des événements.

Le minifilter doit terminer FSCTL_MANAGE_BYPASS_IO avec STATUS_SUCCESS si FltVetoBypassIo réussit ; sinon, il doit retourner l’erreur renvoyée par FltVetoBypassIo .

Pendant la post-opération, le pilote peut voir si tous les pilotes ci-dessous sont capables de prendre en charge BypassIO. Si c’est le cas, le pilote doit conserver l’état nécessaire pour le fichier et poursuivre le traitement d’achèvement. Il incombe au système de fichiers et au système de fichiers de gérer correctement les requêtes qui peuvent ne pas être compatibles avec l’état bypassIO.

Remarque

Tous les filtres de la pile du système de fichiers ont la possibilité de veto sur la demande d’activation BypassIO pendant la pré-opération, mais sont encouragés à le conserver autant que possible.

Le système de fichiers oppose automatiquement une demande BypassIO pour les types de fichiers suivants :

  • Répertoires (d’autres flux de données sur un répertoire peuvent utiliser BypassIO)
  • Volumes (DASD s’ouvre)
  • Fichiers compressés NTFS
  • Fichiers encryted NTFS
  • Fichiers partiellement alloués
  • Fichiers d'échange
  • Tous les fichiers sur les volumes DAX

La plupart des filtres n’ont pas besoin de maintenir l’état activé par BypassIO sur un flux spécifique. Au lieu de cela, ces informations peuvent être interrogées en appelant FsRtlGetBypassIoOpenCount.

exemple FS_BPIO_OP_ENABLE : filtre de chiffrement

Lorsqu’un filtre de chiffrement reçoit une opération de FS_BPIO_OP_ENABLE sur un fichier :

  • Si le fichier est déjà chiffré, le filtre doit appeler FltVetoBypassIo pour veto à l’opération BypassIO, en fournissant l’état approprié et un message de diagnostic, par exemple :

    • OpStatus = STATUS_NOT_SUPPORTED_WITH_ENCRYPTION
    • FailureReason = « Fichier chiffré non pris en charge »
  • Si le fichier n’est pas actuellement chiffré, le filtre doit autoriser BypassIO. Si une demande ultérieure est effectuée pour chiffrer ce fichier, le filtre peut utiliser l’opération de FS_BPIO_OP_STREAM_PAUSE pour désactiver BypassIO.

demande de FS_BPIO_OP_DISABLE

Cette demande peut provenir du mode utilisateur ou noyau. Il permet à un pilote de nettoyer tout état BypassIO associé.

Si un pilote a précédemment autorisé BypassIO à être activé sur ce fichier et doit maintenant désactiver la prise en charge de BypassIO pour un fichier, il doit envoyer l’opération FS_BPIO_OP_DISABLE FSCTL_MANAGE_BYPASS_IO en haut de la pile du système de fichiers à l’aide du handle associé. Un exemple de cas où cette condition peut se produire est un pilote de chiffrement qui a reçu une demande de chiffrement de ce fichier.

Si un pilote reçoit FS_BPIO_OP_DISABLE mais n’a pas actuellement activé BypassIO, il doit ignorer la requête. Si cette opération est envoyée sur un fichier qui ne dispose actuellement pas de BypassIO activé, elle doit être ignorée.

Cette opération ne doit pas être défaillante.

demande de FS_BPIO_OP_QUERY

Cette demande peut provenir du mode utilisateur ou noyau.

Un filtre doit traiter une demande de FS_BPIO_OP_QUERY similaire à une opération de FS_BPIO_OP_ENABLE , appelant FltVetoBypassIo pour qu’il s’aligne sur les mêmes informations de diagnostic que celles décrites précédemment dans les paramètres appropriés. La principale différence est que le pilote n’entre pas dans l’état BypassIO ENABLE pendant une requête.

L’opération de FS_BPIO_OP_QUERY peut être envoyée sur les handles d’annuaire et de volume (une demande de FS_BPIO_OP_ENABLE ne peut pas être envoyée sur des handles de répertoire ou de volume).

Exemple de requête : filtre de chiffrement

Lorsqu’un filtre de chiffrement reçoit une opération de FS_BPIO_OP_QUERY sur un fichier :

  • Si le fichier est déjà chiffré, le filtre doit appeler FltVetoBypassIo pour veto à l’opération BypassIO, en fournissant un état et un message de diagnostic appropriés, tels que :

    • OpStatus = STATUS_NOT_SUPPORTED_WITH_ENCRYPTION
    • FailureReason = « Fichier chiffré non pris en charge »
  • Si le fichier n’est pas actuellement chiffré, le filtre doit réussir la demande de requête.

demande de FS_BPIO_OP_VOLUME_STACK_PAUSE

Cette demande peut provenir du mode utilisateur ou noyau.

Si un pilote de pile de volumes a précédemment autorisé BypassIO à être activé sur un volume et doit maintenant arrêter BypassIO (par exemple, en raison d’une demande externe), le pilote doit envoyer une opération de FS_BPIO_OP_VOLUME_STACK_PAUSE FSCTL_MANAGE_BYPASS_IO au-dessus de la pile de volumes pour informer le système de fichiers d’arrêter l’exécution de BypassIO sur les piles de stockage et de volume de ce volume. Le système de fichiers vide toutes les opérations BypassIO actives de ce volume, puis retourne. Le pilote de pile de volumes peut ensuite traiter la requête externe.

Tous les fichiers bypassIO actifs arrêtent ensuite d’effectuer des opérations BypassIO au niveau de la pile de stockage. Cette demande d’opération :

  • Peut être envoyé sur un handle de volume ou n’importe quel handle de fichier pour le volume donné.
  • Peut être envoyé plusieurs fois au même volume.
  • Peut être envoyé s’il n’existe aucun fichier BypassIO activé sur le volume.

BypassIO continue à fonctionner sur la pile du système de fichiers.

Cette opération ne doit pas être défaillante.

Exemple de pause de pile de volumes

BitLocker est un exemple de composant qui utilise cette opération lorsqu’il doit activer le chiffrement sur un volume.

Un autre exemple est le scénario suivant : supposons que Volsnap a autorisé BypassIO à être activé sur un volume sans instantanés de volume actif. Plus tard, une demande a été effectuée pour créer un instantané de volume. Volsnap effectue les actions suivantes avant de continuer :

  • Envoie l’opération FS_BPIO_OP_VOLUME_STACK_PAUSE en haut de la pile demandant que le système désactive BypassIO sur la pile de volumes. Il effectue cette opération chaque fois qu’un nouvel instantané est créé. Lors d’un retour réussi, BypassIO est désormais désactivé et vidé sur le volume donné.
  • Traite la demande de création d’instantané

Volsnap doit ensuite vétotor toutes les futures BPIO_OP_ENABLE et BPIO_OP_QUERY demandes sur ce volume.

demande de FS_BPIO_OP_VOLUME_STACK_RESUME

Un pilote de pile de volumes envoie cette opération FSCTL au système de fichiers pour reprendre le traitement BypassIO sur le volume donné. Il envoie cette opération lorsque le scénario qui a provoqué l’envoi du pilote FS_BPIO_OP_VOLUME_STACK_PAUSE n’est plus actif. Cette opération peut être envoyée même si BypassIO n’est pas activé ou suspendu.

Cette demande peut provenir du mode utilisateur ou noyau.

Cette opération ne doit pas être défaillante.

Exemple de reprise de la pile de volumes

À l’aide du scénario de pause de la pile de volumes décrit précédemment, supposons que le volume n’a plus de captures instantanées actives. Volsnap envoie FS_BPIO_OP_VOLUME_STACK_RESUME uniquement une fois que le dernier instantané disparaît.

demande de FS_BPIO_OP_STREAM_PAUSE

Un filtre peut envoyer une opération de FS_BPIO_OP_STREAM_PAUSE pour suspendre BypassIO sur un flux. Cette demande peut provenir du mode utilisateur ou noyau. Tous les fichiers bypassIO actifs arrêtent d’effectuer des opérations BypassIO.

Plus précisément, si un filtre précédemment autorisé à être activé sur un flux et qu’il doit arrêter BypassIO (en raison d’une demande externe telle qu’une demande de chiffrement d’un fichier ou d’un répertoire), il peut envoyer un FS_BPIO_OP_STREAM_PAUSE à la pile de filtres pour indiquer au système de fichiers d’arrêter l’exécution de BypassIO sur le flux donné. Un filtre ne doit pas envoyer cette opération en haut de la pile.

Avant que le système de fichiers ne retourne, il interrompt tous les handles BypassIO ouverts sur le flux et termine toutes les opérations BypassIO actives sur le flux. Ces actions garantissent que, lors du retour, le filtre peut effectuer l’opération de fichier dont il a besoin.

Cette opération peut être envoyée plusieurs fois au même flux. Le système de fichiers l’ignore s’il est envoyé sur un flux qui n’est pas actuellement activé pour BypassIO.

Si un filtre effectue une opération de pause de flux, BypassIO continue sur les piles de volume et de stockage.

Cette opération ne doit pas être défaillante.

Exemple de pause de flux : filtre de chiffrement

Supposons qu’un filtre de chiffrement a autorisé BypassIO à être activé sur un flux qui n’a pas été chiffré, mais a reçu ultérieurement une demande pour chiffrer ce flux.

Avant que le filtre de chiffrement continue, il doit appeler FsRtlGetBypassIoOpenCount pour déterminer si BypassIO est actif sur ce flux. Si c’est le cas, le filtre de chiffrement envoie une opération de FS_BPIO_OP_STREAM_PAUSE demandant que le système désactive BypassIO. Une fois le retour réussi, BypassIO est désactivé et vidé, afin que le filtre puisse effectuer en toute sécurité la demande de chiffrement. Pour éliminer les conditions de concurrence possibles, le filtre doit opposer un veto à toutes les futures FS_BPIO_OP_ENABLE et FS_BPIO_OP_QUERY demandes sur ce flux désormais chiffré.

demande de FS_BPIO_OP_STREAM_RESUME

Lorsque le scénario qui a provoqué l’envoi d’une opération de FS_BPIO_OP_STREAM_PAUSE n’existe plus, le filtre envoie une opération de FS_BPIO_OP_STREAM_RESUME au système de fichiers pour reprendre le traitement BypassIO d’un flux donné. Cette demande peut provenir du mode utilisateur ou noyau.

Si cette opération est envoyée lorsque BypassIO n’est pas activé ou suspendu, il est ignoré.

Les pauses et les reprise ne sont pas comptabilisées. Au lieu d’un cv, le système de fichiers émet une requête FS_BPIO_OP_QUERY en haut de la pile du système de fichiers pour déterminer si les filtres restants sont toujours bloquants. Le système de fichiers reprend BypassIO uniquement si tous les filtres de la pile ne bloquent pas BypassIO.

Cette opération ne doit pas être défaillante.

Exemple de reprise de flux : filtre de chiffrement

À l’aide du scénario de FS_BPIO_OP_STREAM_PAUSE décrit précédemment, supposons que le fichier précédemment chiffré après l’appel à FS_BPIO_OP_STREAM_PAUSE n’est plus chiffré. Le filtre doit ensuite envoyer l’opération de FS_BPIO_OP_STREAM_RESUME pour permettre à BypassIO de reprendre sur ce flux.

demande de FS_BPIO_OP_GET_INFO

Cette demande peut provenir du mode utilisateur ou noyau. Le système de fichiers retourne des informations sur BypassIO pour le volume dans une structure FS_BPIO_INFO.