设置上下文
创建新上下文后,微筛选器驱动程序可以通过调用以下集例程之一将其附加到对象:
- 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) 设置的引用计数。 发布 上下文中对此进行了说明。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈