Registering Context Types 注册上下文类型
当一个微过滤驱动调用FltRegisterFilter从它的入口函数,它必须注册每一个要用到的上下文类型。
为了注册上下文类型,微过滤驱动创建一个可变长的数组存储 FLT_CONTEXT_REGISTRATION 结构体,并且在FLT_REGISTRATION 结构体里存储一个指向 FLT_CONTEXT_REGISTRATION 结构体的指针 ContextRegistration,微过滤驱动传递FLT_REGISTRATION 结构体的参数给FltRegisterFilter。数组里FLT_CONTEXT_REGISTRATION 结构体的顺序没有关系,但是最后要以{FLT_CONTEXT_END}结尾。
对于每一个微过滤驱动要使用的上下文类型,它都必须在FLT_CONTEXT_REGISTRATION 结构体里提供至少一个上下文定义,每一个FLT_CONTEXT_REGISTRATION 结构体为上下文定义类型,大小和其他信息。
对于一个固定长度的上下文,Size成员指定了上下文结构体部分的大小,按比特计算。上下文结构体是被微过滤驱动定义的,它的最大大小事64KB(MAXSHORT)。0是一个合法的Size值。过滤器管理器执行固定长度上下文用后备列表(lookaside lists)。过滤管理器创建俩个后备列表为每个Size值:一个是分页的,一个是非分页的。
对于一个可变长的上下文,Size值必须设为FLT_VARIABLE_SIZED_CONTEXTS 。过滤管理器直接从分页或非分页池中分配可变长的大小上下文。
Flags成员,FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH flag能被指定。如果微过滤驱动用固定长度的上下文并且flag值被指定 ,过滤管理器分配一个上下文从后备列表。上下文的大小要大于或等于要求的大小。
对于给定的上下文类型,微过滤驱动能提供最多3个固定长度的上下文定义 ,每一个只能有一个不同大小,一个可变长的定义 。
微过滤驱动能提供上下文清理(cleanup)回调函数,它将被调用在上下文释放之前 。
微过滤驱动能定义它自己的回调历程,用于分配上下文或释放上下文,而不是依赖驱动管理器。然而,这是不太必要的。
下面一个最简单的存储FLT_CONTEXT_REGISTRATION 结构体的数组的示例:
const FLT_CONTEXT_REGISTRATION contextRegistration[] = {
{ FLT_INSTANCE_CONTEXT, //上下文类型,一共6种,在上篇文章中介绍过
0, //Flags,一般为0
CtxContextCleanup, //清理回调函数
CTX_INSTANCE_CONTEXT_SIZE, //大小
CTX_INSTANCE_CONTEXT_TAG }, //池子的标签
{ FLT_CONTEXT_END } //这个必须有,要不不知道数组到底有多少元素
};