Secuencias de archivos, contextos de flujo y contextos de Per-Stream

Nota:

Para obtener una confiabilidad y un rendimiento óptimos, use controladores de minifiltro del sistema de archivos con compatibilidad con el Administrador de filtros de archivos en lugar de controladores de filtro del sistema de archivos heredados. Para migrar el controlador heredado a un controlador de minifiltro, consulte Directrices para portar controladores de filtro heredados.

Una secuencia de archivos es una secuencia de bytes que se usa para contener datos de archivo. Un archivo tiene normalmente solo una secuencia de archivo, a saber, la secuencia de datos predeterminada del archivo. Sin embargo, en los sistemas de archivos que admiten varias secuencias de datos, cada archivo puede tener varias secuencias de archivos. Una de estas secuencias es la secuencia de datos predeterminada, que no tiene nombre. Los demás se denominan flujos de datos alternativos. Al abrir un archivo, realmente va a abrir una secuencia del archivo especificado.

Cuando un sistema de archivos abre una secuencia de archivos por primera vez, crea una estructura de contexto de secuencia específica del sistema de archivos, como un bloque de control de archivos (FCB) o un bloque de control de flujo (SCB) y almacena la dirección de esta estructura en el miembro FsContext del objeto de archivo resultante.

En el caso de los sistemas de archivos locales, si la secuencia de archivos ya abierta se vuelve a abrir (por ejemplo, para el acceso de lectura compartido), el subsistema de E/S crea otro objeto de archivo, pero el sistema de archivos no crea un nuevo contexto de secuencia. Ambos objetos de archivo reciben la dirección de la misma estructura de contexto de secuencia. Por lo tanto, para los sistemas de archivos locales, el puntero de contexto de secuencia identifica de forma única una secuencia de archivos.

En el caso de los sistemas de archivos de red que admiten contextos por secuencia, el comportamiento es el mismo que para los sistemas de archivos locales si la secuencia de archivos ya abierta se vuelve a abrir con el mismo nombre de recurso compartido de red o dirección IP. El subsistema de E/S crea un nuevo objeto de archivo, pero el sistema de archivos no crea un nuevo contexto de secuencia. En su lugar, asigna el mismo valor de puntero FsContext a ambos objetos de archivo. Sin embargo, si la secuencia de archivos se abre con una ruta de acceso diferente (por ejemplo, un nombre de recurso compartido diferente o una dirección IP para un archivo abierto previamente con un nombre de recurso compartido), el sistema de archivos crea un nuevo contexto de secuencia. Por lo tanto, para los sistemas de archivos de red que admiten contextos por secuencia, el puntero FsContext no identifica de forma única una secuencia de archivos.

Un contexto por secuencia es una estructura definida por filtro que contiene una estructura FSRTL_PER_STREAM_CONTEXT como uno de sus miembros. Los controladores de filtro usan esta estructura para realizar un seguimiento de la información sobre cada secuencia de archivos que abre el sistema de archivos.

Compatibilidad del sistema de archivos con contextos de Per-Stream

En Windows XP y versiones posteriores, los sistemas de archivos que admiten contextos por secuencia deben usar estructuras de contexto de flujo que contengan una estructura de FSRTL_ADVANCED_FCB_HEADER .

El sistema de archivos posee la lista global de contextos por secuencia asociados a una secuencia de archivos determinada. Cuando el sistema de archivos crea un nuevo contexto de secuencia (FSRTL_ADVANCED_FCB_HEADER objeto) para una secuencia de archivos, llama a FsRtlSetupAdvancedHeader para inicializar esta lista. Cuando un controlador de filtro del sistema de archivos heredado llama a FsRtlInsertPerStreamContext, el contexto por secuencia creado por el filtro se agrega a la lista global.

Cuando el sistema de archivos elimina su contexto de secuencia para una secuencia de archivos, llama a FsRtlTeardownPerStreamContexts para liberar todos los contextos por secuencia que los filtros tienen asociados a la secuencia de archivos. Esta rutina llama a la rutina FreeCallback para cada contexto por secuencia en la lista global. La rutina FreeCallback debe suponer que el objeto de archivo de la secuencia de archivos ya se ha liberado.

Para consultar si el sistema de archivos admite contextos por secuencia para la secuencia de archivos representada por un objeto de archivo determinado, llame a FsRtlSupportsPerStreamContexts en el objeto de archivo. Un sistema de archivos puede admitir contextos por secuencia para algunos tipos de archivos, pero no para otros. Por ejemplo, NTFS y FAT no admiten actualmente contextos por secuencia para paginar archivos. Por lo tanto, si FsRtlSupportsPerStreamContexts devuelve TRUE para una secuencia de archivos, esto no implica que devuelva TRUE para todas las secuencias de archivos.