文件过滤驱动加载过程
文件系统过滤驱动

1 引言文件系统过滤概述文件安全性问题已成为当今信息科学领域最重要的课题之一。
目前,解决这个问题的主要技术手段有两种:一是利用应用层HOOK(钩子)技术,对Windows 提供的文件操作函数(API)及由文件操作所触发的Windows消息进行HOOK,经过适当的处理达到预期目的,缺点是效率低、稳定性和一致性差,不适合于大型系统的开发;另一种是开发文件过滤驱动程序,文件过滤驱动作为一种内核态中间层驱动,不需要改变下层驱动或用户程序而增加新的功能,具有效率高、可靠性强、可扩充等特点,成为现阶段信息安全技术研究的热点。
1.1 文件过滤驱动在信息安全领域的应用1 文件加/解密文件过滤驱动程序可以实现对指定文件、目录,甚至整个逻辑盘的加/解密功能。
当文件在写入磁盘的过程中,截获所有对该文件的IRP_MJ_WRITE,在其分发例程中对IRP携带的数据进行加密处理后写入磁盘;文件被从磁盘读取的过程中,截获所有对该文件的IRP_MJ_READ,在其分发例程中对IRP携带的数据进行解密处理后向上层返回。
加密后的文件在磁盘中以密文形式存储,保证了数据存储的安全性。
2 病毒防护应用程序在创建一个新文件或打开一个已存在文件时,文件系统过滤驱动程序截获IRP_MJ_create,判断被打开文件是否存在和病毒特征代码库相匹配的特征,若存在,说明文件感染了病毒,失败掉该IRP,拒绝打开;否则,使IRP继续向下传递,完成正常的打开操作。
3 进程控制为了防止恶意进程的破坏,有时需要规定只允许某些经过安全验证的特定进程对受保护的文件进行访问,其他不在规则范围内的进程不允许访问。
我们可以通过系统提供的PsGetCurrentProcessId、PsGetCurrentThreadId等API函数得到发起I/O请求的进程及线程的相关信息,如:获得发起进程名称,与安全访问规则(进程白名单)中的可信进程相比较,若该进程位于规则中,说明信任其行为是安全的,允许访问受保护文件;否则,拒绝访问。
Windows文件系统过滤驱动开发教程(第二版)

Hale Waihona Puke -1. 改版序大约两年以前我在驱动开发网上发表了一组描述如何开发 Windows 文件系统过滤驱动的文章。非常庆幸这些文章能 给大家带来帮助。
原本的文章中我使用了自己编写的代码。我不打算在这里论述代码风格的优劣并发起一场辩论,无可怀疑的是,读者们 大多喜欢看到类似微软范例的代码。为此我把文章中的代码换成微软标准的文件过滤驱动范例 sfilter 的代码。赠于喜欢此 书的读者和驱动开发的后来者们。
文件系统驱动和设备驱动的区别 以及介绍

文件系统过滤驱动以及设备驱动的区别一、何谓文件系统过滤驱动?文件系统过滤驱动是一种可选的,为文件系统提供具有附加值功能的驱动程序。
文件系统过滤驱动是一种核心模式组件,它作为Windows NT执行体的一部分运行。
文件系统过滤驱动可以过滤一个或多个文件系统或文件系统卷的I/O操作。
按不同的种类划分,文件系统过滤驱动可以分成日志记录、系统监测、数据修改或事件预防几类。
通常,以文件系统过滤驱动为核心的应用程序有防毒软件、加密程序、分级存储管理系统等。
二、文件系统过滤驱动并不是设备驱动设备驱动是用来控制特定硬件I/O设备的软件组件。
例如:DVD存储设备驱动是一个DVD驱动。
相反,文件系统过滤驱动与一个或多个文件系统协同工作来处理文件I/O操作。
这些操作包括:创建、打开、关闭、枚举文件和目录;获取和设置文件、目录、卷的相关信息;向文件中读取或写入数据。
另外,文件系统过滤驱动必须支持文件系统特定的功能,例如缓存、锁定、稀疏文件、磁盘配额、压缩、安全、可恢复性、还原点和卷装载等。
下面两部分详细的阐述了文件系统过滤驱动和设备驱动之间的相似点与不同点。
1、文件系统过滤驱动同设备驱动的相似点:下列部分描述了Windows操作系统中文件系统过滤驱动和设备驱动之间的相似点:(1)、类似的结构类似于设备驱动,文件系统过滤驱动有着属于自己的DriverEntry、Dispatch和I/O组件例程。
文件系统过滤驱动同设备驱动一样调用许多相同的系统核心例程,它们都会过滤发送给它们所关联的设备的I/O请求。
(2)、类似的功能:文件系统过滤驱动和设备驱动都是I/O子系统的组成部分,因此它们都接收和作用于I/O请求包(IRP)。
类似于设备驱动,文件系统过滤驱动同样可以创建它们自己的IRP并将该IRP发送到低层驱动。
这两种驱动均可以通过注册回调函数来接收多种系统事件的通知。
(3)、其它类似点:同设备驱动类似,文件系统过滤驱动可以接收传入的I/O控制码(IOCTLs)。
Windows 文件过滤驱动经验总结

P 后什么都不做,直接调用 IoCompleteRequest() 来返回。 (2) 拿到这个 IRP 后什么都不做,直接传递到底层设备,
使用IoSkipCurrentIrpStackLocation() 后调用 IoCallDriver() 传递。 (3) 使用 IoBui
ldSynchronousFsdRequest() 或 IoBuildDeviceIoControlRequest()来建立 IRP 的。
Windows 文件过滤驱动经验总结 1、获得文件全路径以及判断时机 除在所有 IRP_MJ_XXX 之前自己从头创建 IRP
发送到下层设备查询全路径外,不要尝试在 IRP_MJ_CREATE 以外的地方获得全路径,因为只有在 IRP_MJ_CREATE 中才会使
用 ObCreateObject() 来建立一个有效的 FILE_OBJECT。而 在 IRP_READ IRP_WRITE 中它们是直接操作
TION 等 IRP 不要去管它,因为它只是一个过程。最终读 写还是如上所介绍。至于以上这些 IRP 哪个是由 CC MGR 发送的,哪些是由
I/O MGR 发送和在什么时候发送的,这个已经有很多讨论了,相 信可以找到。
7、举例说明关于 IRP 传递与完成注意事项 只
看 Walter Oney 的那本 《Programming the Microsoft Windows driver model》里介绍的
其是你要达到一些特殊目的,这时候更需要注意,如 IRP_MN_QUERY_DIRECTORY,不同的标志结果有很大的不同。 3、从
头建立 IRP 获取全路径注意点 自己从头建立一个 IRP_MJ_QUERY_INFORMATION 的 IRP 获取全路径时需要注意,不
Windows文件系统的过滤器驱动程序设计

Windows文件系统的过滤器驱动程序设计西安电子科技大学李新摘要:某些应用程序对文件系统的性能有较高要求。
例如媒体播放器需要满足最小数据传输率才能保证视觉上的流畅。
由于Windows文件系统本身没有提供这样的保证,需要编写过滤器驱动程序添加这项功能。
本文首先介绍系统驱动体系和文件系统工作机制,然后分析文件系统过滤器驱动程序的功能特点,最后介绍一种满足此类应用程序传输带宽的总体解决方案(来源于文献1)。
关键词:文件系统过滤器驱动程序设备对象堆栈一.基础知识1.系统组件Windows NT操作系统含有许多功能相互独立的内核模式组件。
如内核I/O管理器、硬件抽象层、存储管理器、配置管理器、对象管理器、运行支持和过程结构等组件。
Windows 2000在此基础上增加了即插即用管理器和电源管理器。
两种系统分别采用不同的驱动模型。
本文整体上以Windows 2000的文档为主。
不过文件系统具有特殊性(非WDM),在两个系统中的运行机制基本相似。
在这些内核组件中,I/O管理器最为关键,它由文件系统、中间层驱动程序和最低层设备驱动程序三部分组成,对所有的核心态驱动程序提供统一的通信接口IRP(I/O请求包方式)。
应用程序的I/O操作都是通过这种方式调用I/O管理器的服务完成的。
主要服务有:配置管理、内存管理、对象管理、安全监视等等。
2.驱动程序驱动程序实质是能被操作系统加载调用,为系统设备实现相应功能的内核模式的动态链接库。
形式上可以看作是一个包含许多例程的容器。
当第一次安装时,由I/O管理器调用驱动程序入口函数DriverEntry,驱动程序在此进行自身初始化,设置其它例程的进入点,使操作系统接下来可以调用这些服务例程。
驱动程序加载时机与它的启动类型和启动组设置有关。
启动类型有五种,通常文件系统及其过滤器驱动程序属于SERVICE_BOOT_START或SERVICE_DEMAND_START。
驱动体系是分层的。
文件系统Minifilter驱动

文件系统Minifilter驱动声明:本系列文章源于WDK,所有权利归原作者所有,翻译的目的只为交流和学习。
除了商用你可以随意地使用这篇译文。
但请不要删除声明。
——by jununfly说明:所有preoperation及postoperation均简写为pre-oper和post-oper所有文件系统过滤驱动均简写为FSFD(文件系统过滤驱动)所有基于IRP的I/O即IRP-based I/O均简写为IRP-I/O版本:20090220Filter管理器和Minifilter驱动架构Filter 管理器是一个内核模式驱动,它遵照legacy文件系统filter模型并具有FSFD必需的功能。
利用这些功能,第三方开发者可以写 minifilter驱动,这样的驱动比legacy(陈旧的) FSFD更易于开发,因此缩短了开发过程同时制造出更高质量、更灵活的驱动。
本章包括:一、Filter管理器概念Filter管理器随Windows一起被安装,但它只在minifilter驱动被加载时才起作用。
Filter管理器被绑定到目标卷的文件系统栈上。
当Minifilter驱动要执行过滤I/O操作时,必须先向filter 管理器注册来间接绑定到文件系统栈上。
Legacy 过滤驱动在文件系统I/O栈中的位置,相对于其他过滤驱动来说是在系统启动时由它的加载顺序组决定的。
例如,一个antivirus过滤驱动在栈中的位置应该高于一个“复制操作”的过滤驱动,因而它能在文件被复制到远程服务器之前探测病毒并消除文件中的病毒。
因此,FSFilter Anti- Virus加载顺序组中的过滤驱动的加载要先于FSFilter Replication组中的过滤驱动。
每一个加载顺序组都有一个相应的系统定义的类和INF文件中要使用的类GUID。
像legacy过滤驱动一样,minifilter驱动的绑定也按照一定的顺序。
不过,绑定顺序是由altitude这个唯一标识符决定。
文件过滤驱动学习笔记1

文件过滤驱动学习笔记1文件系统过滤驱动,是在驱动级别上实现的,对文件系统的一举一动进行检测的一种技术。
这里仅指windows操作系统。
过滤包括文件打开、读写、重命名、删除,目录的操作等。
文件过滤非常有用,大多数实时监控的杀毒软件都会利用到这个技术。
从今天开始,分享在学习过程中的一些心得。
Wdk提供了一个sfile例子,供我们参考。
微软的习惯很好,在抛出一个新的东西之后,它的文档肯定有一个同步的跟进。
并且文档做得非常好,msdn,各种help。
比起google的android,微软的脚步走得更加坚实。
言归正传。
源文件在我电脑的路径是C:\WinDDK\6001.18002\src\filesys\filter\sfilter。
这个目录下有乱七八糟8个文件,而真正的代码只有sfilter.c一个。
让我们开始揭开它神秘的面纱吧。
看代码一般从入口开始看起。
DriverEntry。
sfilter的DriverEntry 做了三件事。
1填充MajorFunction,2填充fastIoDispatch,3注册文件系统变化回调。
1.填充MajorFunction这个不多说了,上层应用程序调用驱动时,就是利用这些接口。
比如CreateFile时候,会调用IRP_MJ_CREATE。
我们要进行过滤,就需要在这些例程中做事情。
2.填充fastIoDispatch这个我至今没看懂啥意思。
不过看雪上的高人都说,这个东西没必要管它,最多只是速度上的损失。
3.注册系统变化回调status = IoRegisterFsRegistrationChange( DriverObject, SfFsNotification );SfFsNotification这个函数是绑定设备控制对象的关键所在。
其重要性就在于,它能探测动态加载的卷设备,包括u盘等。
这里着重说说这个东西。
我们知道,驱动中实现过滤的一般方法就是绑定。
绑定一个我们自己的设备对象到设备栈顶,所有的IRP信息到来后首先到达我们的设备对象,从而可以优先获取系统信息。
WindowsNT内核下文件系统过滤驱动程序开发

收稿日期:2002209203.作者简介:李 凡(19432),男,教授;武汉,华中科技大学计算机科学与技术学院(430074).基金项目:国家高性能计算基金资助项目(00303).WindowsN T 内核下文件系统过滤驱动程序开发李 凡 刘学照 卢 安华中科技大学计算机科学与技术学院谢四江北京电子科技学院科研中心摘要:分析了基于N T 内核的WindowsN T/2000/XP 操作系统下文件系统过滤驱动程序的开发原理、步骤和应用,以实现动态的病毒扫描、透明的文件加密解密、文件保护和系统恢复等功能,保障了文件系统的信息安全.给出了一个实现透明的文件加解密的过滤驱动程序实例.关 键 词:WindowsN T 内核;过滤驱动;文件系统;IRP中图分类号:TP311.5 文献标识码:A 文章编号:167124512(2003)0120019203 在WindowsN T 和基于N T 内核的Windows 2000/XP 操作系统中,通常需要通过开发文件系统过滤驱动程序来保证文件系统的信息安全运行,主要包括动态病毒扫描、透明文件加密解密、文件保护和系统恢复等功能.文件系统驱动程序(File System Driver ,简称FSD )管理文件系统格式.WindowsN T 的文件系统驱动程序是I/O 子系统的一个组件,为用户提供在磁盘或者磁带等非易失性存储介质上存取数据服务.WindowsN T 的文件系统驱动程序和其他的设备驱动程序的一个主要的区别就在于文件系统驱动程序和内存管理器、高速缓存管理器有机的结合在一起,有着密不可分的关系.为了提高系统性能,FSD 通常使用高速缓存(Cache )管理器以高速缓存文件数据.FSD 还和内存管理器结合起来,以使内存映射文件能被正确实现[1].本文首先探讨文件系统过滤驱动程序开发的原理和步骤,然后给出一个实现文件透明加密解密的实例.由于WindowsN T/2000/XP 操作系统的文件系统过滤驱动程序开发有着很类似的方面,下文中如果没有特别说明,则是针对以N T 内核为基础的WindowsN T/2000/XP 操作系统而言的.1 文件系统过滤驱动程序开发 WindowsN T 的I/O 管理器是一个可扩展的结构,通过开发过滤驱动程序可以扩展I/O 子系统的功能.I/O 管理器支持分层驱动程序模型,每个I/O 请求包(IRP )的处理分别经过各层驱动程序,直到某层驱动程序完成这个请求.这样第三方开发的驱动程序就有机会插入到这个层次结构中并获得截获及处理来自上层的操作请求的机会,把这种驱动程序称为过滤驱动程序[2].文件系统过滤驱动程序是针对文件系统而言的.WindowsN T 的I/O 管理器根据用户的文件操作请求构造IRP 发到文件系统驱动程序,文件系统驱动程序把相应于文件系统的操作转换为相应于存储设备驱动程序的操作并通过I/O 管理器来调用存储设备驱动程序[3].I/O 管理器在发送操作请求到目标设备之前会检查是否有其他的设备附着于目标设备对象之上.通过构造附加的设备对象附着在文件系统或者存储设备对象之上,并为该设备对象指定专门的驱动程序,I/O 管理器就会把要发送到目标设备的请求先发到附加的过滤设备,在该设备对应的过滤驱动程序中对原始请求加入附加的处理来实现对文件系统操作的截取、监控甚至替换.文件系统过滤驱动程序可以附着在文件系统驱动程序之上,也可以加入到文件系统驱动程序和存储设备驱动程序之间,如图1所示.具体实现一个过滤驱动程序的基本步骤包括:构造一个设备对象(过滤设备)附着在目标设备上;在这个过滤设备对应的驱动程序(过滤驱动程序)中截取发送到目标设备的操作;在过滤操作中可能需要构造新的IRP 来驱动下层驱动程序,也可能需要为某个IRP 指定对应的完成例程以第31卷第1期 华 中 科 技 大 学 学 报(自然科学版) Vol.31 No.12003年 1月 J.Huazhong Univ.of Sci.&Tech.(Nature Science Edition ) Jan. 2003图1 文件系统过滤驱动程序在系统中的位置便这个IRP被下层驱动程序完成返回后调用;在合适的时候可以断开过滤程序[3].2 文件透明加密解密的过滤器实例 下面给出一个在WindowsN T下进行文件加密解密的过滤器具体实现过程.用户的数据在存储到磁盘上设定的安全区域(例如安全文件夹)之前经过了加密处理,读取时经过解密返回给用户,这个过程对用户来说是透明的.对这个安全区域访问时先要通过认证处理,这样就保证了安全区域里的数据安全.对于现有的Windows N T/ 2000/XP系列操作系统的文件系统本身来说,只是对Windows2000/XP支持的5.0版本以上的N TFS文件系统本身实现了加密文件系统(EFS).对所有文件系统分区的文件实现透明的加密解密并采用特殊的加密算法,就需要通过文件系统过滤驱动程序来实现.在文件系统驱动程序和硬盘驱动程序之间加入过滤驱动程序.当文件系统驱动程序写硬盘的时候,过滤驱动程序首先对数据进行加密然后再调用硬盘驱动程序.当文件系统驱动程序读硬盘的时候,过滤驱动程序先调用硬盘驱动程序读取数据并对从硬盘返回的已加密数据进行解密,然后再返回给文件系统驱动程序.过滤器在系统中位于文件系统驱动程序和磁盘驱动程序之间.要实现这个过滤器,首先需要把过滤器挂接在某个硬盘分区之上,可以在过滤驱动程序的Driver Entry例程或者应用程序中调用DeviceIo2 Control发送一个IOCTL请求驱动程序来挂接到硬盘上.该过程的函数调用过程为:由ZwCreate2 File得到硬盘分区的设备句柄,再用ObRefer2 enceObjectByHandle得到对应的FIL E-OBJ ECT 指针(WindowsN T把每个设备当作一个文件来看待,并有一个对应的FIL E-OBJ ECT结构描述其属性),调用Io G et RelatedDeviceObject得到硬盘分区设备对象指针.然后调用IoCreateDevice来构造代表过滤器的一个设备并为它指定驱动程序也就是过滤驱动程序.最后调用IoAttachDe2 viceByPointer把该设备挂接在硬盘分区设备上.这样文件系统驱动程序发送到这个硬盘分区设备的所有请求都会先经过过滤器.硬盘驱动程序由Driver Entry提供一系列的IRP处理函数供高层驱动程序调用.在过滤驱动程序中实现加密解密是通过截取IRP-MJ-READ和IRP-MJ-WRITE来实现的.在过滤驱动程序的Driver Entry例程中指定处理函数: DriverObject→MajorFunction[IRP-MJ-WRITE]=MyFilterWrite;DriverObject→MajorFunction[IRP-MJ-READ]=MyFilterRead.在IRP-MJ-WRITE的处理函数中如果需要加密处理就在非分页内存中分配一段与待写数据空间大小相同的内存,并把待写数据拷贝到这段内存中,对这段内存数据调用加密处理,建立这段内存的内存描述符MDL,更新IRP结构中的Irp→MdlAddress指向这个新建立的MDL,并记住原先的值.为这个IPR指定一个完成例程,接着调用下层的硬盘驱动程序写入已加密数据.硬盘驱动程序完成这个写操作并返回后,系统会调用指定的这个完成例程.在完成例程中恢复Irp→MdlAddress为原来的值并且释放原先分配的那段内存.在IRP-MJ-READ的处理函数中解密是一个近似相反的过程.先直接调用硬盘驱动程序取得数据,然后在它的完成例程中对读取的数据进行解密返回上层驱动程序.3 主要应用和展望基于文件系统过滤驱动程序可以实现动态的病毒扫描.文件系统针对病毒的安全措施有两种:一种是以杀为主的静态反病毒措施,另一种是以防为主的动态反病毒措施.动态的反病毒措施也就是对病毒实时监控,这个可以通过文件系统过滤驱动程序来实现.基本方法是在文件系统驱动程序上面加入一个过滤驱动程序来过滤被病毒感染的文件.这个过滤驱动程序先于文件系统看到I/O操作请求,在截取到上层传下来的写操作请求时如果侦测到病毒特征就拒绝这个请求,保证02 华 中 科 技 大 学 学 报(自然科学版) 第31卷硬盘数据的安全.另外,利用文件系统过滤驱动程序可以实现分级的存储管理.举例来说,一个系统中有两个存储设备,一个存取速度很快价格很昂贵;另一个存取速度较慢但是价格便宜.可以作一个过滤驱动程序附着在文件系统驱动程序之上来优化系统性能.把不常用的数据放在慢速设备上,当截取到对这些数据的操作请求时先把这些数据转移到快速设备然后再向下传递原来的操作请求到文件系统驱动程序,这样就可以在现有设备不变的情况下获得更好的系统性能.开发文件系统过滤驱动程序的用途在于它可以扩展、修改、甚至替代现有文件系统的操作而不用重新开发新的文件系统驱动程序.随着信息技术的发展和WindowsN T 应用的普及,文件系统过滤驱动程序的开发会有着更广泛的应用.参考文献[1]S olomon D A ,Russinovich M E.Inside microsoft win 2dows 2000,third edition.New Y ork :Microsoft Press ,2001.[2]Chris Cant.Windows WDM 设备驱动程序开发指南.孙 义,马莉波等译.北京:机械工业出版社,2000.[3]Nagar R.Windows N T file system internals.NewY ork :O.Reilly &Associates ,1998.Development of f ilter driver of f ile systeminside Windows NT kernelL i f an L i u X uez hao L u A n Xie S ijiangAbstract :The analysis of the principle ,process and application of the development of File System Filter Driver (FSFD )inside WindowsN T \2000\XP operating system based on WindowsN T kernel were made to achieve dynamic virus scan ,transparent file encryption/decryption ,file protection ,system recovery and ensure the information security of file system.An instance of realizing transparent encryption/decryption of disk file was given.K ey w ords :WindowsN T kernel ;filter diver ;file system ;IRPLi fan Prof.;College of Computer Sci.&Tech.,Huazhong Univ.of Sci.&Tech.,Wuhan 430074,China.韩国材料科学代表团来我校访问2002年12月5日,以中韩联委会委员、浦项科技大学Lee Sung Hak 教授为团长,韩国科学与工程基金会R &D 项目主任Sung Nak Won 教授、釜山国立大学Park Ik Min 教授、浦项科技大学K im Nack Joon 教授和汉阳大学Shin Dong Huuk 教授组成的韩国材料科学代表团一行5人访问我校.王乘副校长会见了来访客人.在化学系、材料学院共同组织的研讨会上,Sung Nak Won 教授介绍了韩国科学与工程基金会的情况,中韩两国的教授们还就新材料、新技术方面的研究进行了热烈交流和讨论.会后,代表团参观了化学系实验室、模具技术国家重点实验室和快速制造中心.12第1期 李 凡等:WindowsN T 内核下文件系统过滤驱动程序开发 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件过滤驱动学习笔记(二)
1.概述
刚学习文件系统过滤时只是做一些简单的应用也没有深究其中的细节;说起来对文件系统过滤也只是一知半解惭愧的很。
后与人讨论发现很多细节自己很模糊;比如其中涉及的驱动对象之间的区别、卷设备加载对文件过滤驱动的影响等。
自己还是需要仔细研究一下,最近查了一些官方及前辈们的资料似乎有些理解在此记录下来做个笔记。
2.相关对象说明
在文件过滤驱动学习中会遇到几种设备对象总是混淆。
最近硬着头皮查阅DDK才有些理解。
2.1.存储设备(Storage Device)
存储设备可以理解为一个磁盘、一个CD;它可以物理的也可以是逻辑的,它上边可以有一个或多个卷设备对象。
大多数存储设备是一个PnP设备,它们由PnP管理器加载。
存储设备表现为PnP设备树(PnP Device Tree)上的一个节。
注意:文件系统驱动和文件系统过滤驱动都不是PnP设备驱动。
2.2.存储卷(Storage Volume)
存储卷是一个存储设备如固定磁盘,软盘,CD盘,格式化后存储的目录与文件。
一个很的大卷可以被分成一个或多个逻辑卷;每一个卷都会被格式化成指定的一种格式,如NTFS,FA T等。
它通常是一个物理设备对像(PDO)。
它与文件系统卷对象是不同的。
2.3.文件系统卷设备对象(File System VDO)
一个存储卷被文件系统加载时就会产生一个文件系统卷设备对像(File System VDO);它总是与指定的逻辑或物理设备相联结(这里我理解应该是说它总是代表了一种数据存储及组织格式,也就是我们常说的FA T和NTFS)。
文件系统过滤驱动就是要附加到这种设备对象上过滤读写相关的操作。
DDK上说文件系统卷设备对象是不需要命名的,因为给它命名会带来安全隐患;这点没有太理解还需要再查阅一些资料。
2.4.文件系统控制设备对象(File System CDO )
文件系统控制设备对象是一个文件系统的入口,它不是单个的卷并且它是存储在全局文件系统队列里的。
一个文件系统驱动在入口创建一个或多个CDO,例如FastFat就创建两个CDO。
一个是针对固定媒体一个针对可移动媒体。
CDFS只创建一个因为它只有一个移动媒体。
文件系统控制设备对象是文件系统过滤驱动要过滤的另一个重要对象,因为在卷加载时会发一个消息给文件系统驱动,需要知道有新的卷加载安装就需要对这个设备对象进行过滤。
这个对象的作用我理解为是用来管理文件系统卷设备对象的。
3.加载过程
3.1.OS启动时的加载
3.1.1.OS的加载过程中的文件系统
1)在系统的启动(BOOT)期间,操作系统加载boot file system, RA W file system和所有启动类型为SERVICE_BOOT_START的驱动,完成之后把控制权交给系统内核。
当内核得到控制权时这些驱动已经加载到内存了。
驱动的加载顺序是由驱动加载顺序组来分配决定的;在文件系统过滤驱动中,那里新加入文件系统过滤驱动加载组之中的驱动在其它所有过滤驱动之前加载。
2)I/O管理器创建一个四个元素文件系统全局队列,分别是CD-ROM,磁盘,磁带还有网络文件系统。
之会每当新注册一个文件系统,它的控制设备对象就会添加到队列中。
在这时因为没有文件系统注册,所有这个队列是空的。
3)PnP管理器调用RA W file system和所有启动类型为SERVICE_BOOT_START驱动的DriverEntry例程。
如果类型为SERVICE_BOOT_START驱动有依赖的驱动需要启动也这在这时启动。
PnP管理器调用Boot Device Driver的AddDevice例程来启动Boot Device。
如果Boot Device有子设备(child device),它们也将被列举出来;如果它们的驱动是Boot-Start Driver(启动类型为SERVICE_BOOT_START的驱动)那么这些子设备也将被配置和启动。
如果一个设备的驱动不完全是Boot-Start Driver它们将不被启动,PnP 管理器会为它们创建一个DevNode(设备节)。
这个点上,所有Boot Driver和Boot Device 都被加载和启动。
4)PnP管理器遍历PnP Device Tree,定位并加载那个与每个devnode关联但没有运行的设备。
当每一个PnP设备启动的时候,如果他们有子设备则会遍历他们。
PnP管理器配置这些子设备并加载他们的驱动启动设备。
PnP管理器加载每一个设备驱动时并不考虑他们的StartType、LoadOrderGroup、Dependencies属性。
这么一步PnP管理器只配置和启动那些可以枚举到的设备和它们的子设备。
不启动那个不可枚举到的设备,即便能枚举到他们的子设备。
5)PnP管理器初始化那个启动类型为SERVICE_SYSTEM_START的驱动。
注意,文件系统识别器(file system recognizer FsRec)就在这个时候被加载。
别外需要注意是,它虽然在“Boot File System”加载顺序组中但它并不是一个Boot File System。
实际的Boot File System是在BOOT 卷(Boot V olume)被安装(mounted)时被Boot Process加载的。
在后来的SERVICE_SYSTEM_START阶段,文件系统在文件系统加载顺序组被加载,它包括命名管道文件系统、邮槽文件系统。
但它不包括那些基于媒体的文件系统如NTFS,FA T,UDFS,CDFS等等。
网络文件系统及在网络加载顺序组的也在这个时候加载。
6)所有驱动在boot time 被初始化后,I/O管理调用那些驱动的重新初始化例程。
7)服务控制管理器加载所有SERVICE_AUTO_START的服务
3.2.卷挂载的过程
3.2.1.文件系统识别器
在系统启动后,存储设备上的所有卷都加载到了系统,然而并不是所有内建(build-in)加载且也不是所有文件系统卷都会被安装(mount)。
文件系统识别器的功能需要处进IRP_MJ_CREA TE请求,查找访问卷的文件系统是否被安装没有就安装它们。
在ReactOS-0.3.4中可以找到文件系统识别器的相关实现。
XPSP2中FS_REC中FsRecCreateAndRegisterDO是用来注册某一种文件系统的识别器对像的。
可以断下来观察一下。
其中和ReactOS-0.3.4略有差别大体相同。
3.2.2.卷挂载
当我动态插入一个磁盘时,PnP管理器会为我们生成一个存储设备。
并发现请求向Mount
Manager发出请求,Mount Manager收到请求后收集这个存储设备的信息并为他们生成存储卷名。
这时一个磁盘的插入动作完成。
如果我们要对这个磁盘发生读写操作,系统会解析这个路径如J:\,如果相应的卷没有安装文件系统,就给文件系统识别器发一个IRP_FILE_SYSTEM_CONTROL的请求。
文件系统识别器会识别出是什么文件系统并加载它,同时这个请求再会发给真实的文件系统来完成并安装文件系统卷。
这样卷的挂载就完成了。
这也就是我们为什么要注册一个回调去监视文件系统控制对像的激活并绑定它。
同时也去过滤每一个文件系统控制设备对象的IRP_FILE_SYSTEM_CONTROL请求。