Setting Contexts 设置上下文
在创建一个上下文之后,微过滤驱动能把它和一个对象绑定 ,通过调用FltSetXxxContext ,Xxx代表上下文类型。
如果Operation变量 被设为 FLT_SET_CONTEXT_KEEP_IF_EXISTS,FltSetXxxContext绑定一个新的上下文和一个对象仅在微过滤驱动没有为这个对象设置上下文时成功 。如果设置了,则会失败,返回状态STATUS_FLT_CONTEXT_ALREADY_DEFINED,新的上下文不会替代旧的上下文 。如果旧的上下文不是空non-NULL,它接收到一个指向旧的上下文的指针,当旧的上下文不用时,微过滤驱动需要释放它,通过调用FltReleaseContext。
如果Operation变量被设为FLT_SET_CONTEXT_REPLACE_IF_EXISTS,FltSetXxxContext一直绑定新的上下文和对象。如果微过滤驱动已经设置了一个上下文,删除存在的上下文,设置新的上下文 ,并增加引用数在新的上下文里 。如果旧的上下文是非空的,它接收一个指向删除的上下文的指针。当这个指针不需要了,微过滤驱动必须释放它通过调用FltReleaseContext。
例如:
status = FltAllocateContext(
FltObjects->Filter, // 过滤器
FLT_INSTANCE_CONTEXT, //上下文类型
CTX_INSTANCE_CONTEXT_SIZE, //上下文大小
NonPagedPool, //池子类型
&instanceContext); //返回的上下文
...
status = FltSetInstanceContext(
FltObjects->Instance, //对象实例
FLT_SET_CONTEXT_KEEP_IF_EXISTS, //操作
instanceContext, //新的上下文
NULL); //旧的上下文
if (instanceContext != NULL) {
FltReleaseContext(instanceContext);
}
return status;
注意:在调用FltSetInstanceContext之后,我们要调用FltReleaseContext去释放引用数量,它被FltAllocateContext 设置。