文件流、流上下文和按流上下文

注意

为了获得最佳可靠性和性能,请使用支持筛选器管理器的 文件系统微筛选器驱动程序 ,而不是旧的文件系统筛选器驱动程序。 若要将旧驱动程序移植到微筛选器驱动程序,请参阅 移植旧版筛选器驱动程序指南

文件流是用于保存文件数据的字节序列。 通常,一个文件只有一个文件流,即该文件的默认数据流。 但在支持多个数据流的文件系统上,每个文件可以有多个文件流。 其中一个流是未命名的默认数据流。 其他被命名为备用数据流。 打开文件时,实际上是在打开给定文件的流。

当文件系统首次打开文件流时,它会创建特定于文件系统的 流上下文 结构,例如文件控制块 (FCB) 或流控制块 (SCB) ,并将此结构的地址存储在生成的文件对象的 FsContext 成员中。

对于本地文件系统,如果再次打开已打开的文件流 (进行共享读取访问(例如,) ),则 I/O 子系统会创建另一个文件对象,但文件系统不会创建新的流上下文。 这两个文件对象都接收同一流上下文结构的地址。 因此,对于本地文件系统,流上下文指针唯一标识文件流。

对于支持按流上下文的网络文件系统,如果使用相同的网络共享名称或 IP 地址再次打开已打开的文件流,则行为与本地文件系统的行为相同。 I/O 子系统创建新的文件对象,但文件系统不会创建新的流上下文。 相反,它将相同的 FsContext 指针值分配给这两个文件对象。 但是,如果使用其他路径打开文件流, (例如,不同的共享名称,或以前使用共享名称) 打开的文件的 IP 地址,则文件系统会创建新的流上下文。 因此,对于支持按流上下文的网络文件系统, FsContext 指针不会唯一标识文件流。

每流上下文是筛选器定义的结构,其中包含FSRTL_PER_STREAM_CONTEXT结构作为其成员之一。 筛选器驱动程序使用此结构来跟踪有关文件系统打开的每个文件流的信息。

Per-Stream上下文的文件系统支持

在 Windows XP 及更高版本上,支持按流上下文的文件系统必须使用包含 FSRTL_ADVANCED_FCB_HEADER 结构的流上下文结构。

文件系统拥有与特定文件流关联的每个流上下文的全局列表。 当文件系统为文件流创建新的流上下文 (FSRTL_ADVANCED_FCB_HEADER对象) 时,它会调用 FsRtlSetupAdvancedHeader 来初始化此列表。 当旧文件系统筛选器驱动程序调用 FsRtlInsertPerStreamContext 时,筛选器创建的按流上下文将添加到全局列表中。

当文件系统删除文件流的流上下文时,它会调用 FsRtlTeardownPerStreamContexts 来释放筛选器与文件流关联的所有按流上下文。 此例程针对全局列表中的每个流上下文调用 FreeCallback 例程。 FreeCallback 例程必须假定文件流的文件对象已释放。

若要查询文件系统是否支持给定文件对象表示的文件流的按流上下文,请对文件对象调用 FsRtlSupportsPerStreamContexts 。 对于某些类型的文件,文件系统可能支持按流上下文,但不支持其他类型的文件。 例如,NTFS 和 FAT 目前不支持对文件进行分页的每个流上下文。 因此,如果 FsRtlSupportsPerStreamContexts 对一个文件流返回 TRUE,这并不意味着它对所有文件流返回 TRUE。