设置上下文

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

根据 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)设置的引用计数。 这在发布上下文进行了说明。