Compartilhar via


Fluxos de arquivos, contextos de fluxo e contextos de Per-Stream

Observação

Para obter a confiabilidade e o desempenho ideais, use drivers de minifiltro do sistema de arquivos com suporte do Gerenciador de Filtros em vez de drivers de filtro do sistema de arquivos herdados. Para portar seu driver herdado para um driver de minifiltro, consulte Diretrizes para portabilidade de drivers de filtro herdados.

Um fluxo de arquivos é uma sequência de bytes usada para armazenar dados de arquivo. Normalmente, um arquivo tem apenas um fluxo de arquivos, isto é, o fluxo de dados padrão do arquivo. No entanto, em sistemas de arquivos com suporte para vários fluxos de dados, cada arquivo pode ter vários fluxos de arquivos. Um desses fluxos é o fluxo de dados padrão, que não tem nome. Os outros são chamados de fluxos de dados alternativos. Ao abrir um arquivo, você está realmente abrindo um fluxo do arquivo fornecido.

Quando um sistema de arquivos abre um fluxo de arquivos pela primeira vez, ele cria uma estrutura de contexto de fluxo específica do sistema de arquivos, como um FCB (bloco de controle de arquivo) ou um SCB (bloco de controle de fluxo) e armazena o endereço dessa estrutura no membro FsContext do objeto de arquivo resultante.

Para sistemas de arquivos locais, se o fluxo de arquivos já aberto for aberto novamente (para acesso de leitura compartilhado, por exemplo), o subsistema de E/S criará outro objeto de arquivo, mas o sistema de arquivos não criará um novo contexto de fluxo. Ambos os objetos de arquivo recebem o endereço da mesma estrutura de contexto de fluxo. Assim, para sistemas de arquivos locais, o ponteiro de contexto de fluxo identifica exclusivamente um fluxo de arquivos.

Para sistemas de arquivos de rede que dão suporte a contextos por fluxo, o comportamento será o mesmo que para sistemas de arquivos locais se o fluxo de arquivos já aberto for aberto novamente usando o mesmo nome de compartilhamento de rede ou endereço IP. O subsistema de E/S cria um novo objeto de arquivo, mas o sistema de arquivos não cria um novo contexto de fluxo. Em vez disso, ele atribui o mesmo valor de ponteiro FsContext a ambos os objetos de arquivo. No entanto, se o fluxo de arquivos for aberto usando um caminho diferente (por exemplo, um nome de compartilhamento diferente ou um endereço IP para um arquivo aberto anteriormente usando um nome de compartilhamento), o sistema de arquivos criará um novo contexto de fluxo. Assim, para sistemas de arquivos de rede que dão suporte a contextos por fluxo, o ponteiro FsContext não identifica exclusivamente um fluxo de arquivos.

Um contexto por fluxo é uma estrutura definida por filtro que contém uma estrutura FSRTL_PER_STREAM_CONTEXT como um de seus membros. Os drivers de filtro usam essa estrutura para acompanhar informações sobre cada fluxo de arquivos que o sistema de arquivos abre.

Suporte do sistema de arquivos para contextos de Per-Stream

No Windows XP e posteriores, os sistemas de arquivos que dão suporte a contextos por fluxo devem usar estruturas de contexto de fluxo que contenham uma estrutura FSRTL_ADVANCED_FCB_HEADER .

O sistema de arquivos possui a lista global de contextos por fluxo associados a um fluxo de arquivos específico. Quando o sistema de arquivos cria um novo contexto de fluxo (FSRTL_ADVANCED_FCB_HEADER objeto) para um fluxo de arquivos, ele chama FsRtlSetupAdvancedHeader para inicializar essa lista. Quando um driver de filtro do sistema de arquivos herdado chama FsRtlInsertPerStreamContext, o contexto por fluxo criado pelo filtro é adicionado à lista global.

Quando o sistema de arquivos exclui seu contexto de fluxo para um fluxo de arquivos, ele chama FsRtlTeardownPerStreamContexts para liberar todos os contextos por fluxo associados ao fluxo de arquivos. Essa rotina chama a rotina FreeCallback para cada contexto por fluxo na lista global. A rotina FreeCallback deve assumir que o objeto de arquivo para o fluxo de arquivos já foi liberado.

Para consultar se o sistema de arquivos dá suporte a contextos por fluxo para o fluxo de arquivos representado por um determinado objeto de arquivo, chame FsRtlSupportsPerStreamContexts no objeto de arquivo. Um sistema de arquivos pode dar suporte a contextos por fluxo para alguns tipos de arquivos, mas não para outros. Por exemplo, NTFS e FAT atualmente não dão suporte a contextos por fluxo para arquivos de paginação. Portanto, se FsRtlSupportsPerStreamContexts retornar TRUE para um fluxo de arquivo, isso não implica que ele retorna TRUE para todos os fluxos de arquivo.