删除上下文
最终必须删除通过成功调用 FltSetXxxContext设置的每个上下文。
发生以下情况时,筛选器管理器会自动删除上下文:
- 将删除上下文附加到的对象
- 微筛选器实例与卷分离
- 已卸载微筛选器驱动程序
因此,微筛选器很少需要显式删除上下文。
微筛选器可以通过调用以下上下文删除例程之一来删除上下文:
- FltDeleteContext
- FltDeleteFileContext
- FltDeleteInstanceContext
- FltDeleteStreamContext
- FltDeleteStreamHandleContext
- FltDeleteTransactionContext
- FltDeleteVolumeContext
仅当上下文当前 为对象设置时,才能将其删除。 如果上下文尚未设置,或者已由成功调用 FltSetXxxContext 替换,则无法删除该上下文。
如果 OldContext 为非 NULL 且不指向 NULL_CONTEXT,则 FltDeleteXxxContext 例程返回指向 OldContext 参数中的旧上下文的指针。 如果 OldContext 为 NULL,筛选器管理器将递减上下文上的引用计数,然后释放该引用计数,除非微筛选器上有未完成的引用。
以下代码示例演示如何删除流上下文:
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 释放已删除的上下文。