文件系统Minifilter驱动(四)

四、控制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一文中描述的技术和指导方针. 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值