设置上下文

创建新上下文后,微筛选器驱动程序可以通过调用以下集例程之一将其附加到对象:

集例程将执行以下操作,具体取决于 Operation 参数的值:

  • 如果 操作 == FLT_SET_CONTEXT_KEEP_IF_EXISTS

    • 如果微筛选器尚未为 对象设置相同类型的上下文,则设置例程:
      • 将新分配的上下文附加到 对象。
      • 递增引用计数。
    • 否则,如果微筛选器已设置上下文,则设置例程:
      • 返回STATUS_FLT_CONTEXT_ALREADY_DEFINED (NTSTATUS 错误代码) 。
      • 不替换现有上下文。
      • 不递增引用计数。
      • OldContext 参数中存储指向现有上下文的指针(如果参数为非 NULL)。 当不再需要此指针时,微筛选器驱动程序必须通过调用 FltReleaseContext 来释放它。
  • 如果 操作 == FLT_SET_CONTEXT_REPLACE_IF_EXISTS

    • 集例程始终将新上下文附加到 对象。
    • 如果微筛选器驱动程序已设置上下文,则设置例程:
      • 删除现有上下文,设置新上下文,并递增新上下文上的引用计数。
      • 如果 OldContext 参数为非 NULL,它将接收指向已删除上下文的指针。 当不再需要此指针时,微筛选器驱动程序必须通过调用 FltReleaseContext 来释放它。

设置上下文类型后,微筛选器可以在后续 I/O 操作期间 () 获取上下文 ,以确定是否需要执行任何操作。

最终必须 删除每个成功的上下文集。

在以下代码示例(取自 CTX 示例微筛选器)中, CtxInstanceSetup 例程创建并设置实例上下文:

status = FltAllocateContext(
           FltObjects->Filter,              //in: Filter
           FLT_INSTANCE_CONTEXT,            //in: ContextType
           CTX_INSTANCE_CONTEXT_SIZE,       //in: ContextSize
           NonPagedPool,                    //in: PoolType
           &instanceContext);               //out: ReturnedContext
...
status = FltSetInstanceContext(
           FltObjects->Instance,            //in: Instance
           FLT_SET_CONTEXT_KEEP_IF_EXISTS,  //in: Operation
           instanceContext,                 //in: NewContext
           NULL);                           //out: OldContext

if (instanceContext != NULL) {
  FltReleaseContext(instanceContext);
}
return status;

请注意,调用 FltSetInstanceContext 后,调用 FltReleaseContext 以释放 由 FltAllocateContext (而不是FltSetInstanceContext) 设置的引用计数。 发布 上下文中对此进行了说明。