filter管理器消除了legacy过滤驱动重获和管理文件名所必需的许多工作。当一个名被请求时,filter管理器在引用计数结构中以适当的格式为当前操作提供名: 规范名, opened名或短名.
minifilter驱动可以调用FltGetDestinationFileNameInformation 来为正被rename或其NTFS hard link正被创建的文件或目录构造一个全路径名。这个名可以以规范的或打开的文件的格式返回。
filter管理器也为重获规范文件名信息(由于文件名tunneling,该信息无效)提供FltGetTunneledName 例程。
为提高性能,filter管理器把名放到一个cache中,该cache在系统中的所有minifilter驱动之间可能是共享的。
修改名字空间的Minifilter驱动可以通过注册callback例程来截取名字查询操作从而利用filter管理器对名提供者的支持,比如upper minifilter驱动产生或规范化一个名的请求.
用于名管理的Filter管理器例程
filter管理器为名字管理提供以下支持例程:
FltGetDestinationFileNameInformation
FltGetFileNameInformation
FltGetFileNameInformationUnsafe
FltGetTunneledName
FltParseFileNameInformation
FltReleaseFileNameInformation
用于名管理的Minifilter驱动Callback例程
以下callback例程存储于FLT_REGISTRATION结构中,此结构作为一个参数被传给FltRegisterFilter, 用于minifilter驱动修改名字空间:
Callback例程名 |
Callback例程类型 |
GenerateFileNameCallback |
PFLT_GENERATE_FILE_NAME |
NormalizeContextCleanupCallback |
PFLT_NORMALIZE_CONTEXT_CLEANUP |
NormalizeNameComponentCallback |
PFLT_NORMALIZE_NAME_COMPONENT |
filter管理器使minifilter驱动能把上下文与object关联起来,来跨I/O操作保持状态。有上下文的Object包括卷,实例,流和流句柄.
第三方文件系统必须使用FSRTL_ADVANCED_FCB_HEADER 结构(取代 FSRTL_COMMON_FCB_HEADER结构)来适应流和流句柄context.
上下文(除了卷上下文,它必须从非分页池中分配)可以从分页或非分页池中分配。
当所有未决引用已经被释放时,上下文被自动释放。如果minifilter驱动定义了一个上下文cleanup callback例程,filter管理器就会在上下文被释放之前调用该例程。上下文以此顺序cleanup: 流句柄,流,实例和卷。
当关联的Object被删除,当实例被断开或当minifilter驱动被卸载时,filter管理器负责删除上下文。
如果某个minifilter驱动对每个卷仅支持一个实例,那它应该使用实例上下文而非卷上下文来获得更佳性能。minifilter驱动也可以通过在流或流句柄上下文中存储指向minifilter驱动实例上下文的指针来提高性能。
分页文件的上下文不被支持,以下操作期间也不支持上下文:
Create请求的pre-oper处理
close请求的Post-oper处理
IRP_MJ_NETWORK_QUERY_OPEN请求的处理
看CTX例子,它是一个使用上下文的minifilter驱动.
用于上下文管理的Filter管理器例程
filter管理器为创建、注册和设置上下文提供以下支持例程:
FltAllocateContext
FltRegisterFilter
FltSetInstanceContext
FltSetStreamContext
FltSetStreamHandleContext
FltSetVolumeContext
以下例程用于查询上下文支持:
FltSupportsStreamContexts
FltSupportsStreamHandleContexts
以下例程用于获得和引用上下文:
FltGetContexts
FltGetInstanceContext
FltGetStreamContext
FltGetStreamHandleContext
FltGetVolumeContext
FltReferenceContext
以下例程用于释放和删除上下文:
FltDeleteContext
FltDeleteInstanceContext
FltDeleteStreamContext
FltDeleteStreamHandleContext
FltDeleteVolumeContext
FltReleaseContext
FltReleaseContexts
用于context管理的Minifilter驱动Callback例程
以下callback例程存储于FLT_REGISTRATION 结构中,此结构作为一个参数被传给FltRegisterFilter, 用于minifilter驱动管理上下文:
Callback例程名 |
Callback例程类型 |
ContextAllocateCallback |
PFLT_CONTEXT_ALLOCATE_CALLBACK |
ContextCleanupCallback |
PFLT_CONTEXT_CLEANUP_CALLBACK |
ContextFreeCallback |
PFLT_CONTEXT_FREE_CALLBACK |
minifilter驱动可以从它自己在当前卷或另一个卷上的实例中产生并发送基于IRP的I/O操作。 此I/O操作仅minifilter驱动实例,绑定位置在此实例之下的legacy过滤驱动和文件系统可见。这解决了许多在legacy过滤驱动模型中递归I/O相关的问题,在该模型中,被legacy过滤驱动产生的I/O请求必须从顶部驱动开始遍历整个文件系统栈。
在某个minifilter驱动的所有未决I/O操作被完成之前,filter管理器不能卸载它。
用于由Minifilter驱动产生的I/O请求的Filter管理器例程
filter管理器为创建、打开、读写文件提供了以下支持例程:
FltClose
FltCreateFile
FltCreateFileEx
FltReadFile
FltWriteFile
以下例程用于设置和移除重解析点:
FltTagFile
FltUntagFile
以下例程用于产生I/O请求:
FltAllocateCallbackData
FltFreeCallbackData
FltPerformAsynchronousIo
FltPerformSynchronousIo
FltReuseCallbackData
以下例程用于取消文件open请求并重发一个I/O请求:
FltCancelFileOpen
FltReissueSynchronousIo
filter管理器也提供下列多种用途的例程:
FltDeviceIoControlFile
FltFlushBuffers
FltFsControlFile
FltQueryInformationFile
FltQuerySecurityObject
FltQueryVolumeInformationFile
FltSetInformationFile
FltSetSecurityObject
filter管理器通过通信端口支持用户模式和内核模式之间的通信。minifilter驱动通过指定要被应用于通信端口object的一个安全描述符来控制端口上的安全。端口通信不是buffered,因此它更快更高效。用户模式应用程序或服务可以回答来自minifilter驱动的消息从而双向通信.
当minifilter驱动创建了一个通信服务器端口时,它暗中开始收听端口上引入的连接。当某个用户模式调用者试图连接到该端口时,filter管理器用新创连接的一个句柄调用minifilter驱动的 ConnectNotifyCallback 例程。当filter管理器恢复控制时,它传给用户模式调用者一个表示用户模式调用者对这个连接的endpoint的一个单独的文件句柄。该句柄可用于把I/O完成端口和收听者端口关联起来。
仅当用户模式调用者在端口上已拥有了安全描述符指定的权限时,一个连接才会被同意。对端口的每一个连接都有它自己的消息队列和私有endpoint。
任何一个(内核或用户的)endpoint的关闭都会结束相应的连接。当某个用户模式调用者关闭endpoint句柄时,filter管理器调用minifilter驱动的DisconnectNotifyCallback 例程以便minifilter驱动可以关闭连接句柄。
通信服务器端口的关闭会阻止新连接但不会结束现有的连接。当minifilter驱动卸载时filter管理器就会结束现有的连接。
用于在用户模式和内核模式间通信的Filter管理器例程
filter管理器为内核模式minifilter驱动与用户模式应用程序的通信提供了以下支持例程:
FltCloseClientPort
FltCloseCommunicationPort
FltCreateCommunicationPort
FltSendMessage
以下例程用于用户模式应用程序与minifilter驱动通信:
FilterConnectCommunicationPort
FilterGetMessage
FilterReplyMessage
FilterSendMessage
用于在用户模式和内核模式间通信的Minifilter驱动Callback例程
以下minifilter驱动的callback例程作为参数被传给FltCreateCommunicationPort:
Callback例程名 |
Callback例程类型 |
ConnectNotifyCallback |
PFLT_CONNECT_NOTIFY |
DisconnectNotifyCallback |
PFLT_DISCONNECT_NOTIFY |
MessageNotifyCallback |
PFLT_MESSAGE_NOTIFY |
filter管理器用户模式接口为包括过滤驱动在内的产品提供了一般功能。用户模式library是Fltlib.dll. 应用程序包括头文件FltUser.h和FltUserStructures.h, 和对FltLib.lib的链接.
这些用户模式接口激活了对minifilter驱动的全面控制和用户模式服务或控制程序与过滤驱动间的通信。用户模式接口也为管理工具提供了接口来允许对filters,卷和实例的枚举。
Filter管理器用户模式Library例程
filter管理器为加载和卸载minifilter驱动提供了以下支持例程:
FilterLoad
FilterUnload
以下例程用于创建和关闭minifilter驱动及实例句柄:
FilterClose
FilterCreate
FilterInstanceClose
FilterInstanceCreate
以下例程用于绑定和断开minifilter驱动实例:
FilterAttach
FilterAttachAtAltitude
FilterDetach
以下例程用于枚举filters,卷和实例:
FilterFindFirst
FilterFindNext
FilterInstanceFindFirst
FilterInstanceFindNext
FilterVolumeFindFirst
FilterVolumeFindNext
FilterVolumeInstanceFindFirst
FilterVolumeInstanceFindNext
以下例程用于查询信息:
FilterGetDosName
FilterGetInformation
FilterInstanceGetInformation
以下例程用于用户操作发起通信:
FilterConnectCommunicationPort
FilterSendMessage
以下例程用于minifilter驱动响应通信:
FilterGetMessage
FilterReplyMessage