Share via


Flussi di file, contesti di flusso e contesti di Per-Stream

Nota

Per garantire un'affidabilità e prestazioni ottimali, usare i driver minifilter del file system con il supporto di Gestione filtri anziché i driver di filtro del file system legacy. Per convertire il driver legacy in un driver minifilter, vedere Linee guida per la conversione dei driver di filtro legacy.

Un flusso di file è una sequenza di byte usata per contenere i dati dei file. Generalmente in un file è disponibile solo un flusso di file, vale a dire il flusso di dati predefinito del file. Tuttavia, in ogni file dei file system che supportano più flussi di dati possono essere presenti più flussi di file. Uno di questi flussi è il flusso di dati predefinito, senza nome. Gli altri sono denominati flussi di dati alternativi. Quando si apre un file, si apre effettivamente un flusso del file specificato.

Quando un file system apre un flusso di file per la prima volta, crea una struttura di contesto di flusso specifica del file system, ad esempio un blocco di controllo file (FCB) o un blocco di controllo di flusso (SCB) e archivia l'indirizzo di questa struttura nel membro FsContext dell'oggetto file risultante.

Per i file system locali, se il flusso di file già aperto viene nuovamente aperto (ad esempio per l'accesso in lettura condiviso), il sottosistema di I/O crea un altro oggetto file, ma il file system non crea un nuovo contesto di flusso. Entrambi gli oggetti file ricevono l'indirizzo della stessa struttura del contesto di flusso. Pertanto, per i file system locali, il puntatore al contesto del flusso identifica in modo univoco un flusso di file.

Per i file system di rete che supportano contesti per flusso, il comportamento è identico a quello dei file system locali se il flusso di file già aperto viene nuovamente aperto usando lo stesso nome o indirizzo IP della condivisione di rete. Il sottosistema di I/O crea un nuovo oggetto file, ma il file system non crea un nuovo contesto di flusso. Assegna invece lo stesso valore del puntatore FsContext a entrambi gli oggetti file. Tuttavia, se il flusso di file viene aperto usando un percorso diverso , ad esempio un nome di condivisione diverso o un indirizzo IP per un file aperto in precedenza usando un nome di condivisione, il file system crea un nuovo contesto di flusso. Pertanto, per i file system di rete che supportano contesti per flusso, il puntatore FsContext non identifica in modo univoco un flusso di file.

Un contesto per flusso è una struttura definita dal filtro che contiene una struttura FSRTL_PER_STREAM_CONTEXT come uno dei relativi membri. I driver di filtro usano questa struttura per tenere traccia delle informazioni su ogni flusso di file aperto dal file system.

Supporto del file system per i contesti di Per-Stream

In Windows XP e versioni successive, i file system che supportano contesti per flusso devono usare strutture di contesto di flusso che contengono una struttura FSRTL_ADVANCED_FCB_HEADER .

Il file system è proprietario dell'elenco globale di contesti per flusso associati a un flusso di file specifico. Quando il file system crea un nuovo contesto di flusso (oggetto FSRTL_ADVANCED_FCB_HEADER) per un flusso di file, chiama FsRtlSetupAdvancedHeader per inizializzare questo elenco. Quando un driver di filtro del file system legacy chiama FsRtlInsertPerStreamContext, il contesto per flusso creato dal filtro viene aggiunto all'elenco globale.

Quando il file system elimina il contesto di flusso per un flusso di file, chiama FsRtlTeardownPerStreamContexts per liberare tutti i contesti per flusso associati al flusso di file. Questa routine chiama la routine FreeCallback per ogni contesto per flusso nell'elenco globale. La routine FreeCallback deve presupporre che l'oggetto file per il flusso di file sia già stato liberato.

Per verificare se il file system supporta i contesti per flusso per il flusso di file rappresentato da un determinato oggetto file, chiamare FsRtlSupportsPerStreamContexts sull'oggetto file. Un file system potrebbe supportare contesti per flusso per alcuni tipi di file, ma non per altri. Ad esempio, NTFS e FAT non supportano attualmente contesti per flusso per il paging dei file. Pertanto, se FsRtlSupportsPerStreamContexts restituisce TRUE per un flusso di file, ciò non implica che restituisca TRUE per tutti i flussi di file.