您的位置:首页 > 其它

文件系统Minifilter驱动(四)

2009-03-02 13:22 435 查看

四、控制Filter管理器操作

在早于Vista的Windows中,filter管理器的操作由注册表中下列REG_DWORD AttachWhenLoaded值控制:
HKLM/System/CurrentControlSet/Services/FltMgr
当AttachWhenLoaded被设置为零时,filter管理器不会绑定到任何卷上直到某个minifilter驱动向filter管理器注册.当AttachWhenLoaded被设置为1时,filter管理器在引导时绑定到所有卷上。
2K SP4及以后或XP SP2及更高版本上AttachWhenLoaded的默认值为零。2K3 SP1及后来版本上AttachWhenLoaded默认值为1.
Vista中AttachWhenLoaded值不存在.
当minifilter驱动安装到Vista之前的Windows版本上,软件安装器应置AttachWhenLoaded为1.若修改前AttachWhenLoaded的值为零,则安装器应在minifilter驱动安装之后重启系统.

五、开发和测试工具

本节描述的filter管理器工具在2K3 SP1的IFS Kit和Vista及以后版本的OS中提供了.
也鼓励Minifilter驱动开发者使用多用途的内核模式开发和测试工具,比如带驱动指定的规则的PREfast.
Fltmc.exe 控制程序
Fltmc.exe控制程序是common minifilter驱动管理操作的命令行应用. 开发者可以使用Fltmc.exe来加载和卸载minifilter驱动,绑定minifilter驱动到卷或从卷断开,以及枚举minifilter驱动、实例和卷.
!fltkd Debugger Extension
!fltkd调试器扩展命令在Debugging Tools for Windows中已经提供了.常用命令如下:
命令
描述
!cbd
filter管理器等价于!irp
!filter
列出指定的filter的详细信息
!filters
列出所有已绑定的minifilter驱动
!frames
列出所有filter管理器frame和已绑定的minifilter驱动
!instance
列出指定的实例的详细信息
!volume
列出指定卷的详细信息
!volumes
列出所有卷和已绑定的minifilter驱动实例的详细信息
更多额外的调试帮助,要用调试版本的Fltmgr.sys测试minifilter驱动,它包含众多的 ASSERT来捕获一般错误.
Filter Verifier
Filter Verifier是Driver Verifier 中的一个I/O Verification 选项,它验证minifilter驱动对filter管理器函数的使用. 安装Filter Verifier要用filter管理器.开发者应总是开发minifilter驱动时使用Driver Verifier和Filter Verifier.
要使用Filter Verifier,需指定minifilter驱动的名并激活Driver Verifier(Verifier.exe)中的I/O Verification选项.当minifilter驱动向filter管理器注册时校验就会启动.
Filter Verifier在minifilter驱动中的有效用法如下:
纠正参数的使用和context的调用
纠正pre-oper和post-oper callback例程的返回值
使callback数据中参数的改变一致而连贯
Filter Verifie跟踪以下filter管理器objects:
Contexts
Callback数据机构
Queued Work Items
NameInformation结构
File Objects
Filter Objects
实例Objects
卷Objects

六、嵌入Legacy过滤驱动的指导方针

微软鼓励开发者嵌入legacy过滤驱动到filter管理器模型中来获得更好的性能提高系统稳定性. 有经验的开发者会发现把legacy过滤驱动嵌入到minifilter驱动中相对容易。微软的过滤驱动开发者被推荐用以下方法:
首先用一套可靠的衰退测试来验证legacy过滤驱动和被嵌入的 minifilter驱动之间的行为.
创建一个minifilter驱动外壳并系统地从legacy过滤驱动中移植功能到minifilter驱动.例如,令attachment保持工作,然后每次嵌入一个操作,在操作之后进行测试。
最后改变用户模式/内核模式通信,以便你可以使用现有工具来测试minifilter驱动.
用PREfast编译并激活Driver Verifier中的Filter Verifier I/O verification选项来测试.
在嵌入过程期间,你应该回顾所有的legacy过滤驱动代码来充分利用filter管理器的能力.尤其是要记住下面的:
如果合适基于IRP I/O和fast I/O的操作用相同的操作,这会减少代码的复制.
当注册操作时,minifilter驱动可以明确选择忽视所有的分页I/O和cached I/O,出去检查这些的代码.
实例通知大大简化了attach/detach逻辑.
仅注册minifilter驱动必须处理的操作;你可以忽视其他所有的事情.
利用filter管理器context和名管理支持.
利用filter管理器对发出非递归I/O的支持.
minifilter驱动不能以来局部变量来维护从pre-oper处理到post-oper处理的context.可以分配一个lookaside列表来存储操作状态.
当一个名或context结束时确定释放了引用.
用户模式中的完成端口为构造队列添加了一项强大的技术。你大概只需要一个单一的连接到一个单一的已命名的端口.
下表列出了legacy过滤驱动中的一般操作和它们是如何映射到filter管理器模型的.
Legacy 过滤驱动模型
Filter管理器模型
没有完成例程的Pass-through操作
如果你的minifilter驱动从不为这种类型的I/O操作工作,则无需为其注册pre-oper或post-oper callback例程.

否则,从为此操作注册pre-oper callback例程中返回 FLT_PREOP_SUCCESS_NO_CALLBACK.

看Returning FLT_PREOP_SUCCESS_NO_CALLBACK一文.
带有完成例程的Pass-through操作
从pre-oper callback例程中返回 FLT_PREOP_SUCCESS_WITH_CALLBACK.

看Returning FLT_PREOP_SUCCESS_WITH_CALLBACK.
在 pre-oper callback 例程中pend操作
需要时调用FltLockUserBuffer来确保一切user buffer都被锁住,以便在一个worker线程中它们能被访问.

通过调用像FltAllocateDeferredIoWorkItem和 FltQueueDeferredIoWorkItem这样的支持例程queue工作到一个为worker线程.

从pre-oper callback例程中返回FLT_PREOP_PENDING.

当准备好返回I/O操作到filter管理器时,调用FltCompletePendedPre-oper.

看Pending an I/O Operation in a Pre-oper Callback Routine.
在post-oper callback例程中pend操作
在pre-oper callback例程中,调用 FltLockUserBuffer来确保user buffers已经被锁住,以便在一个worker线程中它们能被访问.

通过调用像FltAllocateGenericWorkItem 和FltQueueGenericWorkItem这样的支持例程来queue工作到一个worker线程.

从post-oper callback例程中返回 FLT_POSTOP_MORE_PROCESSING_REQUIRED.

当准备好返回I/O操作给filter管理器时,调用 FltCompletePendedPost-oper.

看 Pending an I/O Operation in a Post-oper Callback Routine.
令操作同步
从pre-oper callback例程中返回 FLT_PREOP_SYNCHRONIZE.

看Returning FLT_PREOP_SYNCHRONIZE.
在 pre-oper callback例程中完成操作
设置最终的操作状态和信息到该操作的FLT_CALLBACK_DATA 结构的成员IoStatus 中.

从pre-oper callback 例程中返回 FLT_PREOP_COMPLETE.

看Completing an I/O Operation in a Pre-oper Callback Routine.
在操作已经于pre-oper callback例程中被pend之后完成该操作
设置最终的操作状态和信息到该操作的FLT_CALLBACK_DATA 结构的成员IoStatus 中.

从worker线程中调用FltCompletePendedPre-oper 来处理I/O操作,以CallbackStatus参数的形式传递FLT_PREOP_COMPLETE.

看Completing an I/O Operation in a Pre-oper Callback Routine.
在完成例程中做所有的完成工作
从 post-oper callback例程中返回FLT_POSTOP_FINISHED_PROCESSING.

看Writing Post-oper Callback Routines.
在安全的IRQL做完成工作
从 post-oper callback例程中调用FltDoCompletionProcessingWhenSafe.

看Ensuring that Completion Processing is Performed at Safe IRQL.
从完成例程中Signal一个事件
从此操作的post-oper callback例程中返回FLT_PREOP_SYNCHRONIZE.

filter管理器在IRQL <= APC_LEVEL像调用pre-oper callback例程一样调用同一线程context中的post-oper callback例程.

看Returning FLT_PREOP_SYNCHRONIZE.
令一个成功的create操作失败
从create的post-oper callback例程中调用 FltCancelFileOpen.

设置一个适当的错误NTSTATUS值到该操作的 FLT_CALLBACK_DATA 结构的成员IoStatus 中.

返回FLT_POSTOP_FINISHED_PROCESSING.

看Failing an I/O Operation in a Post-oper Callback Routine.
不接受某个I/O走fast I/O路线
从该操作的post-oper callback例程中返回FLT_STATUS_DISALLOW_FAST_IO.

看 Disallowing a Fast I/O Operation in a Pre-oper Callback Routine.
修改某个I/O操作的参数
设置已修改的参数值到该操作的FLT_CALLBACK_DATA 结构的成员Iopb 中.

要通过调用FltSetCallbackDataDirty标记FLT_CALLBACK_DATA结构为dirty,除非你已经修改了FLT_CALLBACK_DATA结构的成员IoStatus中的内容.

看 Modifying the Parameters for an I/O Operation.
锁住这个操作的user buffer
使用Accessing the User Buffers for an I/O Operation一文中描述的技术和指导方针.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: