创建上下文
一旦微筛选器注册了它使用的上下文类型,它就可以通过调用 FltAllocateContext来创建上下文。 此例程根据 注册上下文类型中所述的条件来选择要使用的适当上下文定义。
在分配上下文和尝试设置上下文之前,微筛选器可以调用以下例程来确定基础文件系统是否支持文件、流或流句柄上下文:
- FltSupportsFileContexts或FltSupportsFileContextsEx
- FltSupportsStreamContexts
- FltSupportsStreamHandleContexts
在以下代码示例中,从 CTX 示例微筛选 器驱动程序开始, CtxInstanceSetup 例程调用 FltAllocateContext 来创建实例上下文:
status = FltAllocateContext(
FltObjects->Filter, //Filter
FLT_INSTANCE_CONTEXT, //ContextType
CTX_INSTANCE_CONTEXT_SIZE, //ContextSize
NonPagedPool, //PoolType
&instanceContext); //ReturnedContext
在 CTX 示例中,为实例上下文注册了以下上下文定义:
{ FLT_INSTANCE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_INSTANCE_CONTEXT_SIZE, //Size
CTX_INSTANCE_CONTEXT_TAG }, //PoolTag
上下文定义的大小是固定的,因为 size 成员是 CTX_INSTANCE_CONTEXT_SIZE (与 FLT_VARIABLE_SIZED_CONTEXTS,后者用于指示大小可变的上下文) 定义。 请注意, 标志 成员中未设置 FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH 标志。 在这种情况下,如果FltAllocateContext的ContextSize参数的值与上下文定义的Size成员的值匹配,则FltAllocateContext将从相应的非分页后备链表列表中分配实例上下文。 如果值不匹配, FltAllocateContext 将失败,返回值为 STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND。
成功后, FltAllocateContext 会将新上下文中的引用计数初始化为一个。 如果不再需要该上下文,则微筛选器驱动程序必须释放此引用。 因此,每次调用 FltAllocateContext 时,必须通过对 FltReleaseContext的后续调用来匹配。
创建上下文后,可以通过微筛选器 将其设置为对象。