文件系统过滤驱动开发(二)

来源:互联网 发布:shiro 细粒度数据权限 编辑:程序博客网 时间:2024/05/16 06:32

    声明:高手请一笑而过.>_<

 

    文件系统过滤驱动开发(一)里面已经讲了文件系统过滤驱动绑定设备的大概思路,剩下的就是一些细节处理部分.

 

    首先说说fast I/O派遣函数,我们知道,IRP是默认的I/O请求处理机制,IRP可以用于同步或者异步I/O,也可以用于缓存和非缓存I/O,同时还可以用于分页I/O.内存管理器通过发送合适的IRP到文件系统以处理缺页错误.快速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,也必须要定义快速I/O例程并返回FALSE(就是按照快速I/O例程的原型声明函数,然后函数里直接返回FALSE).当I/O管理器收到同步文件I/O请求(区别于分页I/O),它首先调用快速I/O例程.如果快速I/O例程返回TRUE,则请求被快速I/O例程完成.如果I/O例程返回FALSE,I/O管理器生成并发送IRP.文件系统过滤驱动不要求必须支持控制设备对象的I/O操作.但是,过滤设备对象绑定了文件系统或者卷是要求传递所有没有识别或者不想处理的IRP到驱动栈中的下一层驱动.同时,过滤设备对象绑定卷设备的必须实现FastIoDetachDevice.

 

    具体上面这个可以参考WDK文档fast I/O vs. IRPs,由于我们是文件系统过滤驱动,所以我们必须声明并实现fast I/O.fast I/O的初始化如下,需要注意的是FastIoDispatch的空间需要我们自己分配:

 

    对于不实现fast I/O产生的效率损失,书上是说很低.在10%以下,具体折中的做法可以判断被绑定设备是否实现了fast I/O,如果过实现,我们就直接调用底层设备的fast I/O处理函数.如果没有则直接返回FALSE.判断可以使用的宏和具体的代码可以参考下面(判断FastIoDeviceControl函数):

 

    to be continue...

原创粉丝点击