文件系统识别器 File System Recognizers OSR.( Open Systems Resources, Inc) 陆麟 译 1999.4.24 在我们的文件系统栏里,有个常问的问题:有写”文件系统识别器”的必要么?确实,我们发现文件系 统识别器的用途有很多人都搞混淆了.在这篇文章里,我们将解释文件系统识别器到底是什么,为什么你 *可以*写(我认为并不*一定*要写-----陆麟),以及文件系统识别器到底干些什么,我们将提供一个文件 系统识别器的简单例子.可以用在你的FSD里. 首先,文件系统识别器(后称FSR)是个仅有一个简单任务的KERNEL模式驱动程序--他负责查看物理设 备是否有他能识别的媒体格式.如果发现,他负责装载完整的FSD.为什么不一上来就加载整个FSD呢?拿 出一个典型的FSD的"足迹"是十分重要的.因为有可能根本就不需要有完整的FSD被装入内存.仅用一个 小的驱动程序(FSR)有可能可省下上百K的内存.而且,所有NT的标准FSD都有FSR.据个例子吧,当一个系 统上的CD-ROM根本没有被使用过时,CDFS FSD根本就不需要载入内存.这些内存可以省下来进行更重要 的操作. 那么FSR怎样确认他认识的文件系统确实存在于物理设备上呢?通常情况下,通过检查设备上的'押' (SIGNATURE:)好象不翻译更好:)但是如果翻译的话'押'应该符合中国概念,比'标记好').'押'通常存在 于分区表内,分区的偏移处,或一个程序员定义的隐蔽的地方.本质上他它必须是独一无二的,不能使FSD 识别到根本不属于他的文件系统. 一些'押'的例子: HFS 0x4244 NTFS ‘NTFS ‘ FAT 0xe9 or 0xeb or 0x49 FSD装载后必须分析决定是否磁盘含有能识别的文件系统.如果有.FSD负责MOUNT该文件系统.FSR也分 析是否有能识别的文件系统.但是,他不MOUNT该文件系统,他装载FSD.一旦FSD装载完毕,FSR也就完成历 史使命,UNLOAD了事. Mount Processing FSR受NT文件系统的MOUNT行为的约束.因为MOUNT处理定义了FSR如何运作.重温一下MOUNT在NT下是如 何运作的是有好处的. 当一个卷被访问,他就被MOUNT了.有些卷在系统初始化时就MOUNT了.而用磁盘管理程序创建的卷和可 移动介质卷是远期MOUNT的例子.当卷被创建,指定驱动器符号后,它将在该盘被访问时才被MOUNT.否则 他不会被真正的MOUNT.同样,软盘驱动器只有在用户访问时才MOUNT相关的FSD. WIN32程序通常通过驱动器符号(盘符)来访问卷.当然,我们都知道那只不过是对象管理器名字 空间的一个符号联接而已.你能用SDK的WINOBJ工具来查看.(本人更推荐用SYSINTERNALS的WINOBJ. 他用了几个未公开的NATIVE API就完成了OSR写了一大堆代码才完成的相同功能.SYSINTERNALS的 WINOBJ才26K.而OSR的要700多K.而且写了个DRIVER配合.SDK的WINOBJ有问题.---陆麟)物理卷的盘符指 向物理介质的对象,而不是文件系统. 当IO管理器为物理介质找到设备对象(设备类型为FILE_DEVICE_DISK, FILE_DEVICE_TAPE, FILE_DEVICE_CD_ROM,FILE_DEVICE_VIRTUAL_DISK).该设备对象将得到一个Volume Parameter Block(VPB).VPB将指出卷是否被MOUNT.如果以及MOUNT.VBP将指出卷属于哪个文件系统.如果没有MOUNT. IO管理器将尝试MOUNT.IO管理器通过向每个已经注册的FSD调用FSD的IRP_MJ_FILE_SYSTEM_CONTROL 入口.辅参数为IRP_MN_MOUNT_VOLUME来为MOUNT卷.(FSD必须类型为FILE_DEVICE_DISK_FILE_SYSTEM, FILE_DEVICE_TAPE_FILE_SYSTEM,或FILE_DEVICE_CD_ROM_FILE_SYSTEM).IO管理器依次查询FSD是否卷能 被MOUNT.FSD按照后注册先调用的次序被调用.所以,最后被加载的FSD最先得到机会MOUNT卷. 第一个注册到NT的是RAW文件系统.他实际上注册了3个不同的文件系统设备对象.每个他能 处理的文件系统都注册了设备对象.不管什么时候RAW文件系统被要求MOUNT一个文件系统.属于RAW文件 系统的卷只能以"整卷"的方式打开.通常情况下,只有磁盘管理工具才用他. FSR假装成FSD唯一的目的就是处理MOUNT请求.他创建一个合适的设备对象,在IO管理器注册成FSD, 然后等待MOUNT请求.等到发现一个能识别的卷,就接受请求,并且返回错误STATUS_FS_DRIVER_REQUIRED, 然后IO管理器调用FSR来装载整个FSD.通过调用FSR的入口点IRP_MJ_FILE_SYSTEM_CONTROL,参数 IRP_MN_LOAD_FILE_SYSTEM来完成. 加载FSR比加载FSD更好的最主要之处是节省内存.当然这时一个客户不常用的FSD应尚未被完整地加载 到内存里.当FSD没完全加载,节省额外的内存可以确保系统的运作不捉襟见肘.当然,FSR也占用内存.但 总比整个FSD来得省. 实现: ...省略