注册上下文类型

微筛选器驱动程序必须首先注册它使用的每种上下文类型。 微筛选器注册其使用的上下文类型后,可以 创建上下文

注册上下文类型的步骤

微筛选器从其 DriverEntry 例程调用 FltRegisterFilter,以注册它使用的每种上下文类型。 在调用 FltRegisterFilter 之前,微筛选器驱动程序执行以下操作:

  • 创建 FLT_CONTEXT_REGISTRATION 结构的可变长度数组。 此数组中元素的顺序并不重要;但是,数组中的最后一个元素必须是 {FLT_CONTEXT_END}。
  • 将指向所创建数组的指针存储在FLT_REGISTRATION结构的 ContextRegistration 成员中。 微筛选器在 FltRegisterFilterRegistration 参数中传递此结构。

对于微筛选器驱动程序使用的每个上下文类型,它必须至少提供一个上下文定义。 定义采用 FLT_CONTEXT_REGISTRATION 结构的形式,其中每个结构定义上下文的类型、大小和其他信息。

当微筛选器驱动程序调用 FltAllocateContext 创建新上下文时,筛选器管理器使用 Size 参数以及 FLT_CONTEXT_REGISTRATION 结构的 SizeFlags 成员来选择要使用的上下文定义:

  • 对于固定大小的上下文,FLT_CONTEXT_REGISTRATION 结构的 Size 成员指定由微筛选器驱动程序定义的上下文结构部分的大小(以字节为单位)。 上下文的最大大小为 MAXUSHORT (64 KB) 。 零是有效的大小值。 筛选器管理器使用 lookaside 列表实现固定大小的上下文。 筛选器管理器为每个大小值创建两个查找列表:一个分页和一个非分页。

  • 对于可变大小的上下文, 必须将 Size 成员设置为 FLT_VARIABLE_SIZED_CONTEXTS。 筛选器管理器直接从分页或非分页池分配可变大小的上下文。

在 FLT_CONTEXT_REGISTRATION 结构的 Flags 成员中,可以指定FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH标志。 如果微筛选器驱动程序使用固定大小的上下文并且指定了此标志,则如果上下文的大小大于或等于请求的大小,筛选器管理器将从旁观列表中分配上下文。 否则,上下文的大小必须等于请求的大小。

对于给定的上下文类型,微筛选器驱动程序可以提供最多三个固定大小的上下文定义,每个定义具有不同的大小和一个可变大小的定义。 有关详细信息,请参阅 FLT_CONTEXT_REGISTRATION

用于上下文管理的微筛选器回调例程

微筛选器驱动程序可以选择性地提供以下与上下文相关的回调例程,这些例程存储在 FLT_REGISTRATION 结构中,该结构作为参数传递给 FltRegisterFilter

回调例程 说明
PFLT_CONTEXT_ALLOCATE_CALLBACK 在极少数情况下,微筛选器可能需要定义自己的回调例程来分配上下文,而不是依赖于筛选器管理器。
PFLT_CONTEXT_CLEANUP_CALLBACK 在释放上下文之前要调用的微筛选器清理例程。
PFLT_CONTEXT_FREE_CALLBACK 在极少数情况下,微筛选器可能需要定义自己的回调例程来释放上下文,而不是依赖于筛选器管理器。

上下文注册代码示例

以下代码示例取自 CTX 示例微筛选器驱动程序,其中显示了一个 FLT_CONTEXT_REGISTRATION 结构数组,这些结构用于注册实例、文件、流和文件对象, (流句柄) 上下文。

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};