创建上下文

微筛选器注册其使用的上下文类型后,可以通过调用 FltAllocateContext 来创建上下文。 此例程根据 注册上下文类型中所述的条件选择要使用的适当上下文定义。

在分配上下文并尝试设置它之前,微筛选器可以调用以下例程来确定基础文件系统是否支持文件、流或流句柄上下文:

在以下代码示例(取自 CTX 示例微筛选器 驱动程序) 中,CtxInstanceSetup 例程调用 FltAllocateContext 来创建实例上下文:

status = FltAllocateContext(
      FltObjects->Filter,           //Filter
      FLT_INSTANCE_CONTEXT,         //ContextType
      CTX_INSTANCE_CONTEXT_SIZE,    //ContextSize
      NonPagedPool,                 //PoolType
      &instanceContext);            //ReturnedContext

在 CTX 示例中,为实例上下文注册了以下上下文定义:

{ FLT_INSTANCE_CONTEXT,              //ContextType
  0,                                 //Flags
  CtxContextCleanup,                 //ContextCleanupCallback
  CTX_INSTANCE_CONTEXT_SIZE,         //Size
  CTX_INSTANCE_CONTEXT_TAG },        //PoolTag

上下文定义具有固定大小,因为 Size 成员是CTX_INSTANCE_CONTEXT_SIZE (与FLT_VARIABLE_SIZED_CONTEXTS,后者用于指示) 可变大小的上下文定义。 请注意,未在 Flags 成员中设置FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH标志。 在这种情况下,如果 FltAllocateContextContextSize 参数的值与上下文定义的 Size 成员的值匹配,则 FltAllocateContext 将从相应的非分页 lookaside 列表中分配实例上下文。 如果值不匹配, 则 FltAllocateContext 将失败,返回值STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND。

成功后, FltAllocateContext 将新上下文中的引用计数初始化为 1。 当不再需要上下文时,微筛选器驱动程序必须释放此引用。 因此,每次对 FltAllocateContext 的调用都必须与对 FltReleaseContext 的后续调用相匹配。

创建上下文后,微筛选器可以为 对象设置它