ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:25.82KB ,
资源ID:3314438      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3314438.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(windows系统过滤器之微过滤器驱动开发指南.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

windows系统过滤器之微过滤器驱动开发指南.docx

1、windows系统过滤器之微过滤器驱动开发指南微过滤器驱动开发指南0.译者序对我来说,中文永远是最美,最简洁,最精确和最高雅的文字。本文翻译仅仅用做交流学习。我不打算保留任何版权或者承担任何责任。不要引用到赢利出版物中给您带来版权官司。本文的翻译者是楚狂人,如果有任何问题,你可以通过邮箱MFC_Tan_Wen,或者是QQ16191935,或者是MSN walled_river与我交流。b5E2RGbCAP我翻译此文出于对文件系统技术的兴趣。这就是新的文件系统过滤接口。其实也不算什么新的东西,微软开发了另一个“旧模型的”过滤驱动,称之为过滤管理器Filter Manager)。从而提供了一系列新

2、的接口来让你开发新的过滤器。确实这套接口变简单清晰了。你至少避免了包含无数个信息的IRP,避免了请求在各个部件中循环的发来发去,一个分发例程中处理无数中情况,一不小心系统崩溃。我不知道花了多少时间才弄明白一个简单的缓冲读请求从用户到过滤到文件系统和缓冲管理器,虚拟内存管理器之间的关系!现在你也许不需要再管他们了,仅仅做好自己的过滤工作就可以。p1EanqFDPw这套接口强大吗?能实现你想要的功能吗?你很快就发现你没有研究过sfilter就看不懂Minifilter,或者是还得从sfilter开始做起更灵活一点。微软就是这样,拿僵硬而且也不简单的东西来“简化”强大灵活但是设计上一团糟的东西,对于

3、你来说是两者都必须学习,最后你的脑子被微软塞得满满的,不过没关系,我们已经习惯了.DXDiTa9E3d此文的原文是Filter Driver Development Guide,出自微软的网站。我在以下这个地址下载得到此文:RTCrpUDGiT我尽量在翻译中使文章保持原貌。如果您认为此文无法理解,建议您首先阅读旧的文件过滤驱动的相关资料。我认为必须有文件系统和windows驱动的相关知识,才能阅读此文。jLBHrnAILg我未必总是使用规范的名词,但我总是使用最容易理解的名词。一些常用的可能不翻译,比如IRP,MDL,有驱动开发经验的人应该可以理解。另一些可能采用中文英文)的方式。xHAQX7

4、4J0X一些解释如下:例程Routine):我不懂得例程和函数有什么不同。我认为例程就是函数。称为Routine而不是Function可能是为了避免其他c程序员理解得太容易。LDAYtRyKfE接口Api):编程开发接口,一个提供给你调用的函数。流Stream):如果你写过文件系统驱动,那么你一定知道FileObject,对你来说一个流就是一个FileObject。Zzz6ZB2Ltk文件File):一个文件可能有多个流,因为可能多次打开,多个FileObject可能对应一个文件。域Field):一个数据结构中的一个数据成员。喜欢数据库的人可能称为字段。喜欢面向对象的称为数据成员。dvzfvk

5、wMI1透明transparence):看不见,意味着也不需要管。不过请注意透明的反意词绝对不是不透明opacity)。rqyn14ZNXI不透明opacity):不知道的。比如空指针。因为空指针指向的是什么,从空指针本身是了解不到的。所以称为不透明的指针。EmxvxOtOco回调Callback)函数:一个由系统调用而且原则上你不能自己调的函数。预操作pre-operation)回调:如果打算过滤一个操作,那么这个回调出现在操作完成之前。后操作post-operation)回调:如果打算过滤一个操作,那么这个回调出现在操作完成之后。1.概述这个文档用于I/O管理器和基本文件系统之间的过滤驱动

6、。文件系统可能是本地或者网络的。这个文档不涉及文件系统和存储设备之间的过滤驱动,比如FtDisk和DMIO.SixE2yXPq5我们将主要讨论一种新的文件系统过滤驱动模型,所谓的微过滤器minfiter).以前的文件系统过滤基于一个例子sfilter.使用IRP和设备对象进行过滤。我们现在称之为“旧过滤模型”6ewMyirQFL新的架构中一个关键的组件其实是一个旧过滤模型的文件系统过滤驱动,被称为“过滤管理器Filter Manger)”.在未来,微软发行的操作系统将默认安装这个驱动。旧过滤模型中的设备对象(DEVICE_OBJECT.M2ub6vSTnP实例:一个过滤器在一个卷上唯一的某层上

7、生成的一个实例化对象。过滤管理器把所有的IO请求发到卷上的实例栈上。一个微过滤器在一个卷上可能不止一个实例.规范的例子是FileSpy.有时候把FileSpy的两个实例分别绑定在另一个过滤器的上边和下边。此时每个实例有一个私有的上下文.这个上下文包含IO操作的日志.可以用来比较一个过滤器上下的IO操作有什么不同。0YujCfmUCw文件:文件系统保存在一个磁盘上的可能包含若干个流的有名字的数据对象.流:指一个文件中的物理数据流.文件对象(FileObject:用来描述一个用户对一个文件中的一个物理数据流的一次打开。回调数据(CallbackData:过滤管理器中的一种数据结构,包含了一个操作中

8、的所有信息。对应于旧过滤模型中的IRP.eUts8ZQVRd3.微过滤器安装微过滤器可以通过一个INF文件安装。INF文件指出了这个微过滤器所支持的实例.实例的具体说明在第5节.每个实例有一组标志,还有一个唯一的数值固定了它在过滤栈中的位置。sQsAEJkW5TINF文件中有一个表标明了每个实例的层级.这用来给文件系统过滤的开发商装载他们的微过滤器.有标记标明了这个微过滤器是否需要自动的绑定.如果是,那么每个新的卷出现的时候,微过滤器都回收到一个通知.它可以在此绑定他们.绑定的时候,inf文件中的层级决定了绑定到什么层次上。GMsIasNXkA在微过滤器运行时,文件系统过滤开发商也可以在某个指

9、定的层级上动态的生成一个实例,这可以使用FilterAttachAtAltitude(调用.这对于开发者来说可以用来进行测试和排除bug.TIrRGchYzg4.微过滤器注册微过滤器是内核驱动。因此它必须导出一个名为DriverEntry的函数。在驱动加载的时候这个函数第一个被调用.很多微过滤器在DriverEntry(中调用FltRegisterFilter(.7EqZcWLZNXFilterRegisterFilter(需要传入一个参数。是一个FLT_REGISTRATION结构.包含了:一个卸载例程.实例通知回调,一组上下文回调指针,一组文件系统操作回调指针.一般情况下,微过滤过器只捕获

10、一部分操作,因此文件系统操作回调指针可能并不多。lzq7IGf02E对于某一种操作,微过滤器可以指定一些附加的标记来指明它是否在所有的情况下都收到它们.比如,如果FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO被指定了,微过滤器就不会收到任何此类IRP的paging I/O操作。zvpgeqJ1hk同样的,如果FLTFL_OPERATION_REGISTRATION_SKIP_CACHED_IO被指定了,那么只有这类操作的非缓冲请求能看见.(比如说,指定了IRP_MJ_READ类操作,那么所有的缓冲读就都不会被微过滤器捕获了。NrpoJac3v15.开始过

11、滤当一个微过滤器注册自己,它就应该在某个时间调用函数FltStartFiltering(来开始过滤。并不一定要在DriverEntry中调用。不过大多数微过滤器可能是这样做的。1nowfTG4KI这个函数将激发必要的通知,导致微过滤器绑定到卷上然后开始过滤I/O操作。为此,过滤管理器会通过微过滤器的inf文件遍历它注册过的所有的实例。fjnFLDa5Zo每个示例都有一个层级。一个层级是一个唯一的字符串,(如100.123456,这个定义了微过滤器的这个实例在栈上的位置。商业版本的微过滤器层级将由微软公司来分配。tfnNhnE6e5层级的数字越高,这个微过滤器绑定在栈上的位置就越高。一些示例层级

12、提供给开发者用来实现微过滤器。这些是仅有的不会被分配的层级。层级有两个作用:一是确定两个微过滤器之间的顺序关系,尤其是有时得实现一些不用去考虑个别微过滤器什么时候加载的功能。HbmVN777sL比如说,一个加密解密过滤器必须安装在一个防病毒的过滤的下边。否则,防病毒过滤器无法从已经加密的内容中发现病毒。另外就是提供了一个最小的测试矩阵,用来测试这些过滤驱动的互容性。如果这些驱动实例都是按一个指定的顺序在栈中的,那么测试的时候就不用再考虑排列各种不同的顺序了。V7l4jRB8Hs在inf文件中,一个实例和一个标记联系在一起。如果第1个位标记了,那么微过滤器不会在卷出现在系统中的时候得到通知。这样

13、的实例应该通过过滤管理器编程接口来手工的绑定。如果第2位被设置了,即使手工的发送了一个绑定请求,微过滤器也不会收到通知来要求绑定一个实例到一个卷。83lcPA59W96.实例的通知当一个实例生成的时候,一组回调函数提供来通知微过滤器。通过这些回调,微过滤器可以决定它的实例在什么时候绑定到卷上和从卷上解除了绑定。mZkklkzaaP6.1. 安装一个实例回调例程InstatanceSetupCallback(在下列情况下被调用:.当一个微过滤器加载的时候,每个存在的卷都会导致这个调用。.当一个新的卷被mount.当FltAttachVolume被调用被调用被调用.当FilterAttachAtA

14、ltitude(被调用 ( IN PCFLT_RELATED_OBJECTS FltObjects, IN FLT_INSTANCE_SETUP_FLAGS Flags, IN DEVICE_TYPE VolumeDeviceType, IN FLT_FILESYSTEM_TYPE VolumeFilesystemType。FltObjects结构喊有指向微过滤器,卷,和实例的指针。这个实例指将要在InstanceSetupCallback(函数中生成的实例。Flags标记是什么操作导致激发了InstanceSetupCallback(:AVktR43bpwFLTFL_INSTANCE_SET

15、UP_AUTOMATIC_ATTACHMENT: 这是一个微过滤器注册的时候,一个自动的绑定通知。过滤管理器为每个刚加载的微过滤器枚举所有的卷。如果是一个使用者明确的指定一个实例绑定到某一个卷,不会设置有这个标记。ORjBnOwcEdFLTFL_INSTANCE_SETUP_MANUAL_ATTACHMENT: 通过调用FilterAttach(用户态,或者是FilterAttachVolumeAtAltitude(用户态,或者是FltAttachVolume(内核态所发起的一个手工的请求。2MiJTy0dTTFLTFL_INSTANCE_SETUP_NEWLY_MOUNTED_VOLUME:

16、 文件系统刚刚挂载(mount了一个卷,所以呼叫InstanceSetupCallback(来通知微过滤器,如果它愿意可以生成实例来绑定这个卷。gIiSpiue7A在InstanceSetupCallback(中,微过滤器同时得到了卷设备类型VolumeDeviceType)和卷文件系统类型来获取卷属性。通过FltSetInstanceContext(在实例上设置上下文。当然这是需要绑定的时候。它甚至可以在卷上打开或者关闭文件。uEh0U1Yfmh如果这个回调返回了成功,那么这个实例将绑定到卷上。如果返回了一个警告或者错误,那么不会绑定。如果微过滤器没有指定InstanceSetup回调,那么

17、,系统将认为用户总是返回了STATUS_SUCCESS,实例总是会生成并绑定。IAg9qLsgBX6.2. 控制实例的销毁InstanceQueryTeardown(回调仅仅在一个手工解除绑定的请求下被调用。以下操作可能导致:WwghWvVhPEFltDetachVolume( (内核模式FilterDetach( (用户模式如果一个微过滤器没有提供这个回调,那么手工解除绑定是不被支持的。但是,卷的解挂载和InstanceTeardownComplete(会被调用。如果返回了错误或者警告,手工解除绑定会失败。推荐的错误代码有: STATUS_FLT_DO_NOT_DETACH,不过实际上你可以

18、返回任何错误代码。ooeyYZTjj1InstanceQueryTeardown(回调的原型是:typedef NTSTATUS(*PFLT_INSTANCE_QUERY_TEARDOWN_CALLBACK ( IN PCFLT_RELATED_OBJECTS FltObjects, IN FLT_INSTANCE_QUERY_TEARDOWN_FLAGS Flags 。和InstanceSetupCallback(类似,FltObject指出了与这个销毁操作有关的微过滤器,卷和实例。BkeGuInkxI6.3. 实例解绑定的同步如果InstanceTeardownStart(的时候已经决定要

19、解除绑定,那么这个例程中必须做以下的事情:PgdO0sRlMo(1重设所有的未决的I/O操作保证不会有新的I/O操作进入未决。(3对刚刚到达的操作开始最少的工作。同时,应该做以下操作:(1关闭所有打开的文件。(2取消所有本过滤器发起的I/O请求。(3停止将新的工作任务排队。然后微过滤器把控制权交还过滤管理器来继续它的销毁过程。当所有与这个实例相关的操作都排除干净或者完成了,InstanceTeardownComplete(会被调用。管理器保证此时所有此实例的存在的操作回调都完成了。这时微过滤器必须关闭所有这个实例打开的文件。3cdXwckm15这两个回调的原型如下: typedef VOID(

20、*PFLT_INSTANCE_TEARDOWN_CALLBACK ( IN PCFLT_RELATED_OBJECTS FltObjects,IN FLT_INSTANCE_TEARDOWN_FLAGS Reason。FltObjets中有微过滤器,卷和实例。Resson参数指明这次销毁的原因,可能是以下一些标记的组合:h8c52WOngMFLTFL_INSTANCE_TEARDOWN_MANUAL: 这次销毁操作是一个手工的请求。(FilterDetach(或者 FltDetachVolume(.v4bdyGiousFLTFL_INSTANCE_TEARDOWN_FILTER_UNLOAD:

21、 这次销毁操作是因为微过滤器执行卸载或者是选择了把卸载请求失败掉导致的。J0bm4qMpJ9FLTFL_INSTANCE_TEARDOWN_MANDATORY_FILTER_UNLOAD: 这次销毁操作是一次强制卸载导致的。这种情况下不能把卸载请求失败掉。XVauA9grYPFLTFL_INSTANCE_TEARDOWN_VOLUME_DISMOUNT: 这次销毁是一个卷被解挂载的结果。FLTFL_INSTANCE_TEARDOWN_INTERNAL_ERROR: 这次销毁是因为安装实例的时候的一个内部错误导致的,比如内存不足。bR9C6TJscw请注意没有返回值。InstanceTeardo

22、wnStart(和InstanceTeardownComplete(都不能失败。过滤管理器保证这些例程都运行在Passive IRQL.pN9LBDdtrd7.回调支持7.1 回调数据Callback data)回调数据Callback data)是过滤管理器用来描述I/O操作的新结构。类似旧过滤模型下的IRP.微过滤器通过这个结构和过滤管理器交互。不同的是,回调数据不像IRP那样管理一个栈结构。回调数据的管理都通过已经明确定义的过滤管理器接口。并且返回状态值给过滤管理器即可。DJ8T7nHuGTFLT_CALLBACK_DATA类型包含了微过滤器描述一个I/O操作所需要的所有的信息。下面继续

23、详细讲解这个结构中的各个域来说明其中包含的信息:QF81D7bvUAFlags:提供这个操作的一些信息。一个或多个下面的标记可能被设置在Flags中:FLTFL_CALLBACK_DATA_IRP_OPERATION: 这个回调数据描述一个IRP操作。4B7a9QFw9hFLTFL_CALLBACK_DATA_FAST_IO_OPERATION:这个回调数据描述一个FastIO操作。ix6iFA8xoXFLTFL_CALLBACK_DATA_FS_FILTER_OPERATION:这个回调描述一个文件系统过滤器操作。wt6qbkCyDEFLTFL_CALLBACK_DATA_SYSTEM_BU

24、FFER:这个操作所用的缓冲是一个系统分配的缓冲。Kp5zH46zRkFLTFL_CALLBACK_DATA_GENERATED_IO:这个操作是由一个微过滤器发起的。FLTFL_CALLBACK_DATA_REISSUED_IO:这个操作被一个当前实例之上的过滤器所重新发回给文件系统。Yl4HdOAA61FLTFL_CALLBACK_DATA_DRAINING_IO:只有设置了后操作Post-operation)回调的情况下,表明这是一个快速“排出”的I/O操作以便微过滤器的卸载。ch4PJx4BlIFLTFL_CALLBACK_DATA_POST_OPERATION:只有设置了后操作和FL

25、T_CLEAR_CALLBACK_DATA_DIRTY(来操作这个标记。E836L11DO5Thread: 发出这个操作的线程的地址。Iopb: 指向这个操作的可变参数的指针。这个结构在后边详叙。IoStatus:IO_STATUS_BLOCK结构返回操作最后的状态。如果一个微过滤器打算结束这个操作,那么必须先设置这个域,然后才能结束这个请求。对于传递给文件系统去的请求,在后操作过程Post-operation)中有操作最终的状态。S42ehLvE3MTagData:仅仅在Create操作的后操作回调中有效。当一个操作的目标文件有一个重解读点Reparse point)的时候设置这个位。501

26、nNvZFisQueueLinks:一个链表入口结构。有时要把回调数据Callback Data)放入工作队列中使用这个。jW1viftGw9QueueContext2:一组空指针结构,用来传入附加的上下文到工作队列处理过程中。FilterContext4:一组空指针结构,当回调数据进入了队列,微过滤器可以做任意使用。不依赖于过滤管理器的内部结构。xS0DOYWHLPRequestorMode:这个操作的者的请求模式。Iopb域所指的是一个FLT_IO_PARAMETER_BLOCK结构。包含了回调数据中可以修改的部分。对比IRP来说,这里相当于IRP的当前栈空间current stack location)。微过滤器必须访问这个结构来得到每次预操作pre-operation)和后操作来注明这个改变。更多详细的信息将在第8节中讲述。dGY2mcoKtT微过滤器在同一个I/O操作的预回调和后回调中,总是会看到参数是一样的。即使下面的过滤器可能已经修改了这些参数。这是由

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1