Windows驱动_文件系统过滤驱动之三

来源:互联网 发布:刘吉桦陈铭 知乎 编辑:程序博客网 时间:2024/05/18 12:03

                 最近的时间多了起来,但是自己不能放松,也应该持续的学习,历史经验表明,以后的发展,都取决于空余时间,而不是工作时间,工作时间上,是很难拉开距离的。所以,我们都应该学会使用工作外的时间,之前呆的几个公司,都有大量的时间,而自己没有浪费这些时间,不停的学习,努力,最终使现在的自己比别人总是高一个台阶。看问题,已经不仅仅的停留在问题上,技术如果仅仅是技术,那么技术就什么都不是了。

 

               


                 今天来看一下,文件系统堆栈:

 

                 文件系统驱动一般创建两种不同于设备驱动的设备对象,一个是控制设备对象(CDO),一个是卷设备对象(VDO),一般来说,文件系统堆栈有一组CDO,和一组VDO还有一些附加在文件系统上面由过滤文件系统驱动创建的过滤设备对象组成,文件系统的设备对象一般在堆栈的最底层。

 

                 文件系统控制设备对象:

                 文件系统控制设备对象代表整个文件系统,而不是每个独立的卷,被转载在一个称为全局文件系统队列中。文件系统驱动一般在它的DriverEntry例程中创建一个或多个已经命名了的控制设备对象。举例来说,FastFat驱动创建2个CDO,一个为固定媒体装置,一个对于可删除是媒体转置。CDFS仅仅只创建一个CDO,因为它只用于可删除媒体装置。

                文件系统控制设备对象之所以需要命名,是因为为了对于文件系统过滤驱动和其他的内核模式支持例程给予标识,用来在卷设备对象和控制设备对象之间以示区别。

 

                文件系统卷设备对象:

                文件系统卷设备对象代表被文件系统绑定的特定的卷。当绑定一个卷时,文件系统创建一个卷设备对象,来响应卷绑定请求。不像控制设备对象一样,一个卷设备设备对象一般都会涉及一个逻辑或者物理的存储设备。

                 注意:不像控制设备对象,卷设备对象不应该命名,因为命名一个卷设备对象将创建一个安全漏洞。

 

                 绑定一个卷:

                 卷绑定流程的启动一般是通过打开在一个逻辑卷(或者分区,或者动态卷)的一个文件请求来触发的,具体可由如下流程进行:

 

                 1,一个用户模式的应用程序调用CreateFile打开一个文件,或者内核模式驱动调用ZwCreateFile或者IoCreateFileSpecifyDeviceObjectHint.

 

                 2, IO管理器检测请求的目标对象是那个逻辑卷并查看这个卷是否被绑定。如果VPB_MOUNTED标志被设置,说明这个卷已经被文件系统绑定。

 

                 3,如果卷在系统启动后没有被文件系统绑定(VPB_MOUNTED标志没有被设置),IO管理器发送卷绑定请求给卷可能绑定的所有文件系统。(IRP_MJ_FILE_SYSTEM_CONTROL,IRP_MN_MOUNT_VOLUME).
 
                 并不是所有的文件系统需要在系统启动时候绑定的,甚至在系统启动以后,对于那些还没有绑定的内置文件系统,IO管理器发送卷绑定请求给文件系统识别器(FsRec),来检测文件系统可以识别的卷启动扇区的相关标志位。

               如果FsRec发现卷被一个还没有装载的文件系统格式化了,IO管理器通过发送装载文件系统的请求(IRP_MJ_FILE_SYSTEM_CONTROL,IRP_MN_LOAD_FILE_SYSTEM)给FsRec,来装载文件系统。然后,IO管理器发送一个原始的卷绑定请求给文件系统。

 

               4,每一个接收到卷绑定请求的文件系统,首先都会检测卷的启动扇区,检查一些例如卷的格式,或者另外的一些信息查看是否是跟自己文件系统格式化的一致,如果格式配对成功,文件系统将绑定这个卷。

               下面来看一下,当文件系统识别了卷后,如何进行绑定。

               卷怎样被文件系统绑定,取决于文件系统,也取决与文件系统是否之前绑定过卷。

                当文件系统接收到为一个新卷绑定文件系统请求时,它创建一个VDO来代表这个卷,VDO由一个DEVICE_OBJECT加上一个可选的文件系统定义的设备扩展组成,新创建的VDO形成新的(或重装的)卷的文件系统的卷堆栈基本。
      
               文件系统通过设置和VDO关联的VPB(volume parameter block)的标志VPB_MOUNTED,来为存储设备对象绑定一个卷。

               当文件系统绑定了一个卷后,文件系统过滤驱动可以附着在新的文件系统卷堆栈的上面,所有的发往文件系统的IO请求,都会自动的首先发送到卷堆栈上层的文件系统过滤设备对象。仅当IO管理器发送快速IO解除请求给卷堆栈,卷即将删除的时候,文件系统过滤驱动应该在卷堆栈上面进行卸载。

              注意:卷的设备对象驻留在存储设备堆栈上,但它不一定在堆栈的最顶层。此外,即使卷已经被绑定,存储过滤驱动仍然可以附加在存储堆栈的顶部。对于驱动的开发者,我们要明确,当一个文件系统从VDO发送一个IRP到存储设备堆栈的时候,IRP被发送到卷的设备对象,不是存储堆栈的最顶层设备对象。(然后,当IO管理器直接发送一个IRP给存储堆栈,绕开了文件系统,IRP最先送到存储堆栈的最顶层的设备对象)。

 

               卷绑定图示举例:

               我们这里用CDFS文件系统为例,先看CDFS在没有绑定任何卷之前,我们看到下图中,两个过滤设备对象已经附着在CDFS控制设备对象CDO的上面(这里,我们假设全局的文件系统队列中已经包含了CDFS的控制设备对象)

 

             

              下面这幅图,显示了CD-ROM存储设备在没有绑定CDFS之前的驱动堆栈。

 

              

 

 

                下面这幅图比较复杂,表示了CDFS文件已经绑定在CD-ROM设备的卷上面后,文件系统驱动堆栈,卷设备堆栈,CD-ROM存储设备堆栈之间的关系。

                                

                

 

                我们从这张图里可以看到:

 

                CDFS控制设备对象是文件系统驱动堆栈的基础,这个堆栈,在没有绑定在任何存储设备之前,可以直接接收IRP.也可以包含文件系统过滤设备对象。文件系统过滤设备对象附着在文件系统控制设备对象上去查看卷绑定请求(IRP_MJ_FILE_SYSTEM_CONTROL,IRP_MN_MOUNT_VOLUME),文件系统控制设备对象需要命名,以至可以和不命名的卷设备对象进行区分。

 

                 在图中我们看到,在CDFS卷已经绑定后,第二个存储过滤设备对象可以附着在CD-ROM存储设备堆栈的最顶层。但是这个过滤设备对象接收不到任何从文件系统堆栈下发到存储设备堆栈的IRP,它只能接收到直接发送给存储设备堆栈的IRP.

 

                 这里,需要特别指出的是,文件系统已经绑定了一个卷后,存储设备堆栈仍然可以接收到直接发送过来的IRP.比如,电源请求的IRP一般都会直接发送到存储设备堆栈,而不发送给文件系统堆栈(所以,文件系统过滤驱动不应该在DriverEntry中注册有关电源IRP_MJ_POWER的回调函数)

 

                 虽然,有关PNP的IRP(IRP_MJ_PNP)可以发送到文件系统堆栈,但是附着在文件系统卷上的过滤驱动链默认应该直接转送这些IRP到下层驱动以至于文件系统卷设备可以传递这些IRP到下层的存储设备堆栈。

      

      
      

      

       

 

 

原创粉丝点击