Partager via


Flux de fichiers, contextes de flux et contextes de Per-Stream

Notes

Pour une fiabilité et des performances optimales, utilisez des pilotes de minifiltre de système de fichiers avec prise en charge de Filter Manager au lieu des pilotes de filtre de système de fichiers hérités. Pour porter votre pilote hérité vers un pilote de minifiltre, consultez Recommandations pour le portage des pilotes de filtre hérités.

Un flux de fichiers est une séquence d’octets utilisés pour contenir les données de fichier. Généralement un fichier a un seul flux de fichier, à savoir le flux de données par défaut du fichier. Toutefois, sur les systèmes de fichiers qui prennent en charge plusieurs flux de données, chaque fichier peut avoir plusieurs flux de fichiers. L’un de ces flux est le flux de données par défaut, qui n’est pas nommé. Les autres sont nommés flux de données alternatifs. Lorsque vous ouvrez un fichier, vous ouvrez en fait un flux du fichier donné.

Lorsqu’un système de fichiers ouvre un flux de fichiers pour la première fois, il crée une structure de contexte de flux spécifique au système de fichiers, telle qu’un bloc de contrôle de fichier (FCB) ou un bloc de contrôle de flux (SCB), et stocke l’adresse de cette structure dans le membre FsContext de l’objet fichier résultant.

Pour les systèmes de fichiers locaux, si le flux de fichiers déjà ouvert est rouvert (pour l’accès en lecture partagé, par exemple), le sous-système d’E/S crée un autre objet de fichier, mais le système de fichiers ne crée pas de nouveau contexte de flux. Les deux objets de fichier reçoivent l’adresse de la même structure de contexte de flux. Ainsi, pour les systèmes de fichiers locaux, le pointeur de contexte de flux identifie un flux de fichiers de manière unique.

Pour les systèmes de fichiers réseau qui prennent en charge les contextes par flux, le comportement est le même que pour les systèmes de fichiers locaux si le flux de fichiers déjà ouvert est rouvert à l’aide du même nom de partage réseau ou de la même adresse IP. Le sous-système D’E/S crée un objet de fichier, mais le système de fichiers ne crée pas de contexte de flux. Au lieu de cela, il affecte la même valeur de pointeur FsContext aux deux objets de fichier. Toutefois, si le flux de fichiers est ouvert à l’aide d’un chemin d’accès différent (par exemple, un autre nom de partage ou une adresse IP pour un fichier précédemment ouvert à l’aide d’un nom de partage), le système de fichiers crée un nouveau contexte de flux. Ainsi, pour les systèmes de fichiers réseau qui prennent en charge les contextes par flux, le pointeur FsContext n’identifie pas de manière unique un flux de fichiers.

Un contexte par flux est une structure définie par filtre qui contient une structure FSRTL_PER_STREAM_CONTEXT comme l’un de ses membres. Les pilotes de filtre utilisent cette structure pour suivre les informations relatives à chaque flux de fichiers que le système de fichiers ouvre.

Prise en charge du système de fichiers pour les contextes Per-Stream

Sur Windows XP et versions ultérieures, les systèmes de fichiers qui prennent en charge les contextes par flux doivent utiliser des structures de contexte de flux qui contiennent une structure FSRTL_ADVANCED_FCB_HEADER .

Le système de fichiers possède la liste globale des contextes par flux associés à un flux de fichiers particulier. Lorsque le système de fichiers crée un contexte de flux (FSRTL_ADVANCED_FCB_HEADER objet) pour un flux de fichiers, il appelle FsRtlSetupAdvancedHeader pour initialiser cette liste. Lorsqu’un pilote de filtre de système de fichiers hérité appelle FsRtlInsertPerStreamContext, le contexte par flux créé par le filtre est ajouté à la liste globale.

Lorsque le système de fichiers supprime son contexte de flux pour un flux de fichiers, il appelle FsRtlTeardownPerStreamContexts pour libérer tous les contextes par flux que les filtres ont associés au flux de fichiers. Cette routine appelle la routine FreeCallback pour chaque contexte par flux dans la liste globale. La routine FreeCallback doit supposer que l’objet fichier du flux de fichiers a déjà été libéré.

Pour savoir si le système de fichiers prend en charge les contextes par flux pour le flux de fichiers représenté par un objet de fichier donné, appelez FsRtlSupportsPerStreamContexts sur l’objet fichier. Un système de fichiers peut prendre en charge des contextes par flux pour certains types de fichiers, mais pas pour d’autres. Par exemple, NTFS et FAT ne prennent pas actuellement en charge les contextes par flux pour la pagination des fichiers. Par conséquent, si FsRtlSupportsPerStreamContexts retourne TRUE pour un flux de fichiers, cela n’implique pas qu’il retourne TRUE pour tous les flux de fichiers.