Creating Contexts 创建上下文
一旦一个微过滤驱动已经注册了它使用的上下文类型,它能创建一个上下文通过调用FltAllocateContext。这个例程根据上下文类型标准选择正确的上下文定义。
例如,我们创建一个上下文实例如下:
status = FltAllocateContext(
FltObjects->Filter, //驱动
FLT_INSTANCE_CONTEXT, //上下文类型
CTX_INSTANCE_CONTEXT_SIZE, //上下文大小
NonPagedPool, //池子类型
&instanceContext); //返回的上下文
它的原型如下:NTSTATUS
FltAllocateContext(
IN PFLT_FILTER Filter,
IN FLT_CONTEXT_TYPE ContextType,
IN SIZE_T ContextSize,
IN POOL_TYPE PoolType,
OUT PFLT_CONTEXT *ReturnedContext
);
这里只有第二个第三个和第四个需要驱动开发者指定,二三可以从定义 FLT_CONTEXT_REGISTRATION 结构体里找到,如下
{ FLT_INSTANCE_CONTEXT, //上下文类型 0, //Flags
CtxContextCleanup, //上下文回调函数
CTX_INSTANCE_CONTEXT_SIZE, //大小
CTX_INSTANCE_CONTEXT_TAG }, //池子标签
第四个参数分为分页(PagedPool)和非分页(NonPagedPool)
上面的例子是固定大小的上下文定义,因为Size是一个常量 。(如果Size的值为FLT_VARIABLE_SIZED_CONTEXTS,它将是可变长的上下文定义。)注意,Flags成员没有设置FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH flag。这种情况,如果赋给FltAllocateContext的Size值和上下文定义的Size值匹配,则创建成功,FltAllocateContext分配实例上下文从正确的非分页后备列表。如果不匹配,则失败,返回值STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND.
FltAllocateContext实例引用依赖上下文。当上下文不需要了,微过滤驱动必须释放引用。因此,每调用 FltAllocateContext必须调用和他匹配的FltReleaseContext。
它的原型如下:
VOID
FltReleaseContext(
IN PFLT_CONTEXT Context
);
调用释放资源:
FltReleaseContext(instanceContext);