阅读:1932回复:3
File Streams, Stream Contexts, and Per-Stream Contexts
搞了半天也不知道对不,请大牛指点,特别地:Per-Stream Contexts这个术语不知道怎么译?
文件流是一个用来记录文件数据的字节序列。通常一个文件有一个文件流,即文件的默认数据流。然而,在支持多数据流的文件系统上,每个文件能有多个文件流。它们其中一个是默认的数据流,该数据流是没有命名的。其它的是被命名的可选的数据流。当打开一个文件时,实际上打开了一个特定的文件流。 当一个文件系统第一次打开一个文件流,它产生一个文件系统流上下文结构(例如文件控制块或流控制块),并且保存这个结构地址在相应的文件对像的成员FsContext里。 对于本地文件系统,如果已经打开的文件流被再次打开(比如在共享的读方式),IO子系统产生另一个文件对像,但是文件系统不产生新的文件流上下文。两个文件对像接受同一个流上下文结构地址。因此,对于本地文件系统,流上下文指针唯一地标识一个文件流。 对于支持per-stream上下文的网络文件系统,如果一个已经打开的流用同样的网络共享名或IP地址再次被打开,这种方式和本地文件系统是一样的。IO子系统产生一个新的文件对像,但文件系统不产生新的流上下文,而分配一个同样的FsContext指针给这两个文件对像。然而如果文件流用不同的路径(例如,一个不同的共享名,或一个用共享名已经打开的文件的IP,文件系统会产生一个新的流上下文。因此,对于支持per-stream上下文的网络文件系统,FsContext指针不是唯一地标识一个文件流。 一个per-stream上下文是过滤驱动定义的结构,这个结构包含FSRTL_PER_STREAM_CONTEXT 结构。过滤驱动用这个结构来跟踪每个被文件系统打开的文件流的信息。 支持per-stream的文件系统:在XP和以后的版本,支持per-stream上下文的文件系统必须用含有FSRTL_PER_STREAM_CONTEXT结构的流上下文结构。 文件系统有一个特定的文件流相关的per-stream上下文全局列表。当文件系统为文件流产生一个新流上下文 (FSRTL_ADVANCED_FCB_HEADER object)时,它会调用 FsRtlSetupAdvancedHeader 来初始这个列表。当一个文件系统过滤驱动调用FsRtlInsertPerStreamContext,过滤驱动就会产生per-stream上下文并把它加到这个全局列表。 当一个文件系统删除它的文件流的流上下文时,它会调用FsRtlTeardownPerStreamContexts 来释放所有的与文件系统相关的per-stream上下文。这个例程调用FreeCallback 来为在全局列表中的每个per-stream上下文释放。注意:FreeCallback 必须断定文件流的文件对像已经被释放。 为了询问文件系统是否支持代表指定文件对像的文件流per-stream上下文,要调用FsRtlSupportsPerStreamContexts 。注意:一个文件系统可能对一些类型的文件支持per-stream上下文,而另一些则不支持。(比如,NTFS和FAT当前都不支持分页文件per-stream上下文。因此如果FsRtlSupportsPerStreamContexts对一个文件流返回TRUE,并不意味着它对所有的文件流会返回TRUE。 |
|
沙发#
发布于:2008-09-17 07:59
我们在文件系统中看到的文件实际上是流。一个文件有可能包括一个主的数据流和n个附加流。fat32只支持主流,没有附加流。ntfs支持多个附加流。
perstreamcontext有点象fcb ,但是它是在文件系统层面的,fcb对应一个文件,perstream对应的是一个流,一个流在系统中多次打开时,只存在一个perstreamcontext |
|
|
板凳#
发布于:2009-08-30 12:11
d我顶顶
|
|
地板#
发布于:2009-10-12 20:28
这么好的文章!!!
|
|