释放上下文
微筛选器通过调用 FltReleaseContext 释放上下文。 每次成功调用以下例程之一,最终都必须通过对 FltReleaseContext 的调用进行匹配:
上下文创建例程:
上下文获取例程:
上下文集例程:
上下文引用递增例程:
请注意,当不再需要时,还必须释放 FltSetXxxContext 返回的 OldContext 指针和 FltDeleteContext 返回的 Context 指针。
在下面的代码示例(取自 CTX 示例微筛选器)中, CtxInstanceSetup 例程创建并设置实例上下文,然后调用 FltReleaseContext:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
...
status = FltSetInstanceContext(
FltObjects->Instance, //Instance
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //Operation
instanceContext, //NewContext
NULL); //OldContext
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
请注意,无论对 FltSetInstanceContext 的调用是否成功,都会调用 FltReleaseContext :
如果 FltSetInstanceContext 成功,则会将自己的引用添加到实例上下文 (即递增实例上下文) 的引用计数。 因此,不再需要 FltAllocateContext 设置的引用,并且对 FltReleaseContext 的调用会将其删除。
如果 FltSetInstanceContext 失败,则实例上下文只有一个引用,即 由 FltAllocateContext 设置的引用。 当 FltReleaseContext 返回时,实例上下文的引用计数为零,并且由筛选器管理器释放。