您的位置:首页 > 其它

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

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

今天,来看一下,文件系统过滤驱动可以做的事情,其实主要是做两个类型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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: