在miniFilter驱动里管理上下文

上下文 是一个由微过滤器定义的结构,可以用于和一个过滤管理器对象关联。微过滤器可以微下列对象创建和设置上下文:

  • 文件(Files,Vista及后续操作系统)
  • 实例
  • 流句柄(File objects)
  • Transactions(Files,Vista及后续操作系统)

除了卷上下文必须在非分页的内存池上分配,其他的既可以在非分页也可以在分页内存池中分配。

过滤管理器在他们挂载的对象删除后、微过滤器驱动实例从卷上解挂载或微过滤器卸载,自动删除相关的上下文。

注册上下文类型

当微过滤器驱动在DriverEntry中调用 FsRegisterFilter时,必须注册好每个要使用的上下文类型。

要注册上下文类型,微过滤器驱动创建一个类型为 FLT_CONTEXT_REGISTRATION 的变长数组。保持在 FLT_REGISTRATION 结构的 ContextRegistration 域中,传递到 FltRegisterFilter 函数的 Registration 参数。数组中的成员的顺序没有关系,但最后一个成员必须是 {FLT_CONTEXT_END}。

对于微过滤器驱动使用到的每一个上下文类型,FLT_CONTEXT_REGISTRATION 结构必须至少提供一个上下文定义。每一个FLT_CONTEXT_REGISTRATION结构定义了上下文的类型、大小和其他信息。

微过滤器驱动调用FltAllocateContext创建一个新的上下文,过滤管理器使用size参数

对于固定大小的上下文,FLT_CONTEXT_REGISTRATION结构的Size成员指定了字节大小,上下文的大小最大为MAXUSHORT(64KB)。0也是一个有效的值。过滤管理器用旁视列表分配固定大小的上下文。

对于不定大小的上下文,Size成员必须设置为FLT_VARIABLE_SIZED_CONTEXTS。过滤管理器直接从分页或非分页的内存池中分配不定长的上下文。

FLT_CONTEXT_REGISTRATION结构的Flags成员,可以指定FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH。如果微过滤器驱动使用定长的上下文,并且指定了这个标志,上下文的大小大于等于请求的长度的话,过滤管理器从旁视列表里分配内存。否则上下文大小必须等于请求大小。

对于一个给定的上下文类型,微过滤器驱动可以支持3种固定大小(每一个大小不同)的上下文定义和1种变长定义。【更多信息,参见FLT_CONTEXT_REGISTRATION】

微过滤器驱动支持可选上下文释放前的清理回调例程。【参见 PFLT_CONTEXT_CLEANUP_CALLBACK】

微过滤器驱动可以定义一个他自己的分配、释放回调例程。【参见PFLT_CONTEXT_ALLOCATE_CALLBACK 和 PFLT_CONTEXT_FREE_CALLBACK】。

下面是从CTX示例中的部分代码,展示了一个用于注册实例、文件、流和文件对象(流句柄)的FLT_CONTEXT_REGISTRATION结构数组。

Leave a comment

Your comment