-
-
[翻译] 文件流与流上下文
-
发表于: 2021-5-11 20:46 10891
-
前言
一些名词的意思老是忘,干脆记个笔记。
本人英语水平一般,有错误欢迎指出
正文
文件流是用于保存文件数据的字节序列数据。通常一个文件只有一个文件流,即文件的默认数据流。但是在支持多个数据流的文件系统上,每个文件可以有多个文件流。其中之一是默认数据流,它是未命名的。其他的称为备用数据流。当打开一个文件时,实际上是打开这个文件的一个流。
当文件系统第一次打开文件流时,它会创建一个特定文件系统的流上下文结构,例如文件控制块(FCB)或流控制块(SCB),并将该结构的地址存储在文件对象的FsContext成员中。
对于本地文件系统,如果已经打开的文件流再次打开(例如,对于共享读访问),I/O子系统将创建一个新的文件对象,但文件系统不会创建一个新的流上下文。两个文件对象接收相同的流上下文结构的地址。因此,对于本地文件系统,流上下文指针唯一地标识一个文件流。
对于支持per-stream(翻译软件给的看起来是错的,我也不知道这个词,就没翻译)上下文的网络文件系统,如果使用相同的网络共享名称或IP地址打开已经打开的文件流,则其行为与本地文件系统相同。I/O子系统创建一个新的文件对象,但是文件系统不创建一个新的流上下文。相反,它将相同的FsContext指针值赋给两个文件对象。但是,如果文件流使用不同的路径打开(例如,不同的共享名,或以前使用共享名打开的文件的IP地址),文件系统会创建了一个新的流上下文。因此,对于支持per-stream上下文的网络文件系统,FsContext指针不能唯一地标识文件流。
per-stream上下文是一个过滤器定义的结构,它包含一个FSRTL_PER_STREAM_CONTEXT结构作为其成员之一。过滤驱动程序使用此结构来跟踪文件系统打开的每个文件流的信息。
文件系统per-stream上下文的支持
在Microsoft Windows XP和更高版本上,支持逐流上下文的文件系统必须使用包含,FSRTL_ADVANCED_FCB_HEADER结构的流上下文结构。与特定文件流相关联的每个流上下文的全局列表由文件系统拥有。当文件系统为文件流创建一个新的流上下文(FSRTL_ADVANCED_FCB_HEADER对象)时,它调用FsRtlSetupAdvancedHeader来初始化这个列表。当文件系统筛选驱动程序调用FsRtlInsertPerStreamContext时,由该筛选器创建的逐流上下文将被添加到全局列表中。
当文件系统为文件流删除它的流上下文时,它调用FsRtlTeardownPerStreamContexts来释放过滤器与文件流关联的所有流上下文。这个例程为全局列表中的每个流上下文调用FreeCallback例程。注意,FreeCallback例程必须假定文件流的文件对象已经被释放。
若要查询文件系统是否支持由给定文件对象表示的文件流的per-stream上下文,请在文件对象上调用FsRtlSupportsPerStreamContexts。请注意,文件系统可能对某些类型的文件支持逐流上下文,但对其他类型的文件不支持。例如,NTFS和FAT目前不支持分页文件的per-stream上下文。因此,如果FsRtlSupportsPerStreamContexts对一个文件流返回TRUE,并不意味着它对所有文件流都返回TRUE。
来源 :https://docs.microsoft.com/en-us/windows-hardware/drivers/ifs/file-streams--stream-contexts--and-per-stream-contexts
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [翻译]Windows预取文件 12750
- [翻译]基于堆栈的文件对象 7156
- [翻译]文件过滤驱动中各种上下文的使用场景 11991
- [翻译] 文件流与流上下文 10892