文件系统Minifilter驱动(三)

5).管理文件名

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 

 

6).管理Contexts 

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 

 

7). Minifilter驱动产生的I/O请求

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 

8).用户模式和内核模式间的通信 

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 

 

9). User-Mode Library 

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 

你可能感兴趣的:(文件系统驱动翻译)