删除上下文

最终必须删除通过成功调用 FltSetXxxContext设置的每个上下文。

发生以下情况时,筛选器管理器会自动删除上下文:

  • 将删除上下文附加到的对象
  • 微筛选器实例与卷分离
  • 已卸载微筛选器驱动程序

因此,微筛选器很少需要显式删除上下文。

微筛选器可以通过调用以下上下文删除例程之一来删除上下文:

仅当上下文当前 为对象设置时,才能将其删除。 如果上下文尚未设置,或者已由成功调用 FltSetXxxContext 替换,则无法删除该上下文。

如果 OldContext 为非 NULL 且不指向 NULL_CONTEXT,则 FltDeleteXxxContext 例程返回指向 OldContext 参数中的旧上下文的指针。 如果 OldContextNULL,筛选器管理器将递减上下文上的引用计数,然后释放该引用计数,除非微筛选器上有未完成的引用。

以下代码示例演示如何删除流上下文:

status = FltDeleteStreamContext(
 FltObjects->Instance,      //Instance
 FltObjects->FileObject,    //FileObject
           &oldContext);              //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
 FltReleaseContext(oldContext);
}

在此示例中, FltDeleteStreamContext

  • 从流中删除流上下文。
  • 不会递减上下文的引用计数,因为 OldContext 参数为非 NULL。
  • 返回已删除上下文的地址, (从 OldContext 参数的流) 中删除的上下文。

由于 非 NULL OldContext 参数,在执行任何所需的处理后,筛选器必须通过调用 FltReleaseContext 释放已删除的上下文。