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

          最近的一段时间,我又对自己的要求放松了,人是有惰性的,稍微一松懈,就全功尽弃了,所以无时无刻都应该提醒自己,自己不应该昏昏的过,千万不要意味现在的这样就是可以,即使自己想这样,公司也不允许,没有产品的公司,是无法使自己长呆下去的,因为在公司没有任何的积累,所以只能积累自己,积累各行各业的经验,使自己长期的处于高端的水平。继续学习,加油,加油!

          今天,来看一下,文件系统过滤驱动可以做的事情,其实主要是做两个类型IO的过滤,IRP和FastI/O.

          IRP是作为处理IO请求操作的默认方式,IRP可被用于同步或异步I/O,缓存或者非缓存I/O,也可用于分页I/O,内存管理器通过发送合适的IRP给文件系统来处理页错误。


          Fast I/O是一种的特殊的I/O,它被用于缓存文件上面的同步I/O处理,在快速I/O操作中,数据在用户空间和系统缓存之间直接传输,不需要通过文件系统和存储驱动堆栈(存储驱动不使用快速I/O),如果快速I/O的读请求或者写请求发出的时候,所有的数据都驻留在系统缓存中,请求将很快被满足,否则,一个页错误发生,导致一个或者多个IRP被产生,当这种情况发生,快速I/O例程返回FALSE或者将其调用者设置为等待状态,直到页错误被处理。如果快速I/O例程返回FALSE,请求错误失败,调用者必须创建IRP.


          文件系统和文件系统过滤驱动都需要支持IRP,但是它们不需要支持快速I/O,但是它们必须执行快速I/O,如果文件系统和文件系统过滤驱动不支持快速I/O,它们必须定义返回FALSE的快速I/O例程(那种情况下,快速I/O例程不执行任何功能),当I/O管理器接收到一个同步文件I/O请求(或者是分页I/O),它首先调用快速IO例程,如果快速I/O例程返回TRUE,操作通过快速I/O例程处理,如果快速I/O例程返回FALSE,I/O管理器创建IRP并将其发送。


          文件系统过滤驱动不需要在控制设备对象上支持任何I/O操作。但是,附加在指定文件系统或者卷上面的过滤设备对象需要将所有的不处理或者不识别的IRP传递给驱动堆栈的下一次层驱动。额外的,附加在卷上的过滤设备对象必须执行FastIoDetachDevice例程。


           文件系统过滤驱动使用的设备对象的类型。


           为了对不同的IRP和fast IO请求写出有效的派遣函数的前提是,我们要搞清楚文件系统过滤驱动的哪些设备对象可以接收到哪些请求。


           不像PNP设备的驱动,比如磁盘驱动,文件系统过滤驱动不用创建功能或者物理设备对象。而是,创建控制设备对象和过滤设备对象。控制设备对象对于系统和用户模式的应用程序作为过滤驱动本省的代表,过滤设备对象为过滤文件系统和卷上的操作做实际的工作,一般来说,文件系统过滤驱动创建一个控制设备对象和一个或多个过滤设备对象。


           对于每一种你的过滤驱动接收到的IO请求,你的目标设备对象是如下的一个或是多个:


           过滤驱动控制设备对象(CDO),它本省没有附加在驱动堆栈上。


           过滤设备对象,它附加在整个文件系统队列中的文件系统CDO上面。


           过滤设备对象,它附加在已经绑定的文件系统卷设备对象(VDO)的上面。


           过滤驱动可以注册一组派遣例程处理IRP,另一组来处理fast IO请求,每一种类型的请求必须只被一个历程处理。而且在处理之前,我们必须对上面的目标设备对象是哪一种查询清楚,以便进行合适的处理。


           文件系统过滤驱动的控制设备对象:


           和文件系统不一样,需要创建经过命名的控制设备对象,文件系统过滤驱动不被要求一定需要控制设备对象,如果创建,它可以选择命名,代表整个过滤驱动本身对于系统来说,它可以接收来自用户模式应用程序的请求(极少情况下,也对于内核模式下的驱动)和对他们进行合适的操作。        


           大多数文件系统过滤驱动都使用CDO,虽然它不是强制要求的。为了提供支持,当过滤驱动调用IoCreateDevice例程去创建CDO时候,必须为对象提供一个设备名,用户模式应用程序可以调用CreateFile通过用户模式的设备设备名,得到一个指向命名的过滤驱动CDO的一个句柄。


           比如对于MyLegacyFilter内核模式驱动,这个驱动可以将CDO命名为:


           \Device\MyLegacyFilter
   
           然后调用IoCreateSymbolicLink链接一个用户模式可以看见的设备名,整个名字就是用户模式应用程序通过其来得到的CDO的句柄。
       
            \\.\MyLegacyFilter


            虽然一般来说,文件系统过滤驱动在控制设备对象CDO上面不需要支持任何的IO请求。但是大多数过滤驱动允许如下的IO请求发送到过滤驱动的CDO。


             IRP_MJ_CREATE (打开目标设备对象,返回一个句柄给用户应用程序)


             IRP_MJ_CLEANUP (关闭用户模式应用程序的目标设备对象的句柄)


             IRP_MJ_CLOSE(关闭保留的通往目标设备对象的句柄)


             IRP_MJ_DEVICE_CONTROL,IRP_MJ_FILE_SYSTEM_CONTROL 或FastIoDeviceControl(发送私有的IOCTL或FSCTL请求给过滤驱动)


             注意:不像另外的文件系统过滤驱动创建的设备对象,CDO是不附加在其驱动堆栈上面的。所有是没有设备对象附加在CDO的上面或者下面的。因此对于任何接收到的请求,CDO可以完全假设它是唯一的接收人,如果对于过滤驱动对象和文件系统CDO来说就不是这样。所以CDO必须明确的完成它所接收到的每个IRP,对于fast IO请求,必须返回TRUE或FALSE.


              过滤设备对象附加在文件系统上面的操作:


              为了过滤整个文件系统,文件系统过滤驱动可以创建一个过滤设备对象,并将其附加在处于全局文件系统队列的文件系统驱动的CDO上面。


               发送到文件系统的IO请求的类型:


               附加在文件系统上面的过滤设备对象通常可以接收到如下类型IO请求:


               IRP_MJ_DEVICE_CONTROL
 
               IRP_MJ_FILE_SYSTEM_CONTROL


               IRP_MJ_SHUTDOWN



               如果文件系统支持打开其控制设备对象的句柄,过滤驱动还可以接收到如下类型的IO请求:


               IRP_MJ_CLEANUP

               IRP_MJ_CLOSE
  
               IRP_MJ_CREATE


               一般来说,对于所有不认识,或者不将处理的所有IRP,附加在文件系统上面的文件系统过滤设备对象应该将这些请求直接发送到驱动堆栈的下一层驱动进行处理。


                过滤设备对象附加在卷上面的操作:

                为了去过滤一个卷,文件系统过滤驱动可以创建一个过滤设备对象,并将其附加在卷上的卷设备对象之上(VDO)


                 附加在卷上面的过滤设备对象通常可以接收到如下类型的IO请求:


                 IRP_MJ_CLEANUP
                 IRP_MJ_CLOSE
                 IRP_MJ_CREATE
                 IRP_MJ_DEVICE_CONTROL
                 IRP_MJ_DIRECTORY_CONTROL
                 IRP_MJ_FILE_SYSTEM_CONTROL
                 IRP_MJ_FLUSH_BUFFERS
                 IRP_MJ_INTERNAL_DEVICE_CONTROL
                 IRP_MJ_LOCK_CONTROL
                 IRP_MJ_PNP
                 IRP_MJ_QUERY_EA
                 IRP_MJ_QUERY_INFORMATION
                 IRP_MJ_QUERY_QUOTA
                 IRP_MJ_QUERY_SECURITY
                 IRP_MJ_QUERY_VOLUME_INFORMATION
                 IRP_MJ_READ
                 IRP_MJ_SET_EA
                 IRP_MJ_SET_INFORMATION
                 IRP_MJ_SET_QUOTA
                 IRP_MJ_SET_SECURITY
                 IRP_MJ_SET_VOLUME_INFORMATION
                 IRP_MJ_SHUTDOWN
                 IRP_MJ_WRITE
                 FastIoCheckIfPossible
                 FastIoDetachDevice
                 FastIoDeviceControl
                 FastIoLock
                 FastIoQueryBasicInfo
                 FastIoQueryNetworkOpenInfo
                 FastIoQueryOpen
                 FastIoQueryStandardInfo
                 FastIoRead
                 FastIoReadCompressed
                 FastIoUnlockAll
                 FastIoUnlockAllByKey
                 FastIoUnlockSingle
                 FastIoWrite
                 FastIoWriteCompressed
                 MdlRead
                 MdlReadComplete
                 MdlReadCompleteCompressed
                 MdlWriteComplete
                 MdlWriteCompleteCompressed
                 PrepareMdlWrite

                 注意:附加在卷上面文件系统过滤设备对象,被要求将所有不识别的或者不将处理的IRP,到发送到驱动堆栈中的下一层驱动进行处理。但是,必须处理FastIoDetachDevice。

                 注意:在XP系统以后,如下的Fast Io回调已经过时,文件系统过滤驱动不应该使用它们。

                 AcquireForCcFlush
                 AcquireFileForNtCreateSection
                 AcquireForModWrite
                 ReleaseForCcFlush
                 ReleaseFileForNtCreateSection
                 ReleaseForModWrite
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值