设置上下文
创建新上下文后,微型筛选器驱动程序可以通过调用以下集例程之一将其附加到对象:
- FltSetFileContext
- FltSetInstanceContext
- FltSetStreamContext
- FltSetStreamHandleContext
- FltSetTransactionContext
- FltSetVolumeContext
根据 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)设置的引用计数。 这在发布上下文中进行了说明。