文件系统Minifilter驱动
声明:
本系列文章源于WDK,所有权利归原作者所有,翻译的目的只为交流和学习。除了商用你可以随意地使用这篇译文。但请不要删除声明。
——by jununfly
说明:
所有preoperation及postoperation均简写为pre-oper和post-oper
所有文件系统过滤驱动均简写为FSFD
所有基于IRP的I/O即IRP-based I/O均简写为IRP-I/O
版本:
20090220
Filter管理器是一个内核模式驱动,它遵照legacy文件系统filter模型并暴露了FSFD中必需的一般功能。利用这些功能,第三方开发者可以写minifilter驱动,这样的驱动比legacy FSFD更易于开发,因此缩短了开发过程同时制造出更高质量、更灵活的驱动。
本章包括:
Filter管理器随Windows一起被安装,但它只在一个minifilter驱动被加载时才会起作用。Filter管理器绑定到目标卷的文件系统栈上。Minifilter驱动为它要过滤的I/O操作而通过向filter管理器注册来间接绑定到文件系统栈上。
Legacy过滤驱动在文件系统I/O栈中的位置,相对于其他过滤驱动来说是在系统启动时由它的加载顺序组决定的。例如,一个antivirus过滤驱动在栈中的位置应该高于一个replication过滤驱动,因而它能在文件被复制到远程服务器之前探测病毒并消除文件中的病毒。因此,FSFilter Anti-Virus加载顺序组中的过滤驱动的加载要先于FSFilter Replication组中的过滤驱动。每一个加载顺序组都有一个相应的系统定义的类和INF文件中要使用的类GUID。
像legacy过滤驱动一样,minifilter驱动的绑定也按照一个特定的顺序。不过,绑定体的顺序是由一个叫altitude的唯一标识符决定的。Minifilter驱动在特定卷上的一个特定altitude的绑定体被称为这个minifilter驱动的一个instance。
Minifilter驱动的altitude确保它的实例总是在相应的位置被加载,它决定filter管理器以什么顺序来调用minifilter驱动来处理I/O。Altitudes由微软分配和管理。
下图展示了一个用filter管理器简化后的I/O栈和三个minifilter驱动。
用Filter管理器简化后的I/O栈和Minifilter驱动
Minifilter驱动能过滤IRP-I/O操作、fast I/O和FSFilter callback操作。对每一个它要过滤的I/O操作它都可以注册一个pre-oper callback例程,一个post-oper callback 例程或二者都注册。当处理一个I/O操作时,filter管理器调用每个minifilter为此操作注册的callback例程。当该callback例程返回时,filter管理器调用下一minifilter驱动为此操作注册的callback例程。
举个例子,假设上图中的三个minifilter驱动都为同一I/O操作注册了callback例程,则filter管理器会以altitude由高到低的顺序(A,B,C)调用它们的pre-oper callback例程,然后把此I/O操作转寄给下一较低级的驱动进一步处理。当filter管理器接收到此I/O请求的完成时,它以相反的顺序即由低到高(C,B,A)调用每一个minifilter驱动的post-oper callback例程。
为了同legacy过滤驱动协同工作,filter管理器可以绑定filter设备对象到同一个文件系统I/O栈的多个位置。每一个filter管理器的filter设备对象都叫做一个frame。从legacy过滤驱动的角度来说,每一个filter管理器frame仅仅是另外的一个legacy过滤驱动。
每一个filter管理器frame都表示一个altitude区间。如果某个legacy过滤驱动被绑定到文件系统栈上,系统就为在该legacy过滤驱动之上或之下的altitude范围绑定一个filter管理器frame,来确保minifilter驱动绑定到正确的位置上。
如果某个minifilter驱动被卸载并重加载,则它会被重加载到同一frame(它从其中被卸载)中的同一altitude上。
用两个Filter管理器Frame和一个legacy过滤驱动简化后的I/O栈