创建上下文
微筛选器注册其使用的上下文类型后,可以通过调用 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,后者用于指示) 可变大小的上下文定义。 请注意,未在 Flags 成员中设置FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH标志。 在这种情况下,如果 FltAllocateContext 的 ContextSize 参数的值与上下文定义的 Size 成员的值匹配,则 FltAllocateContext 将从相应的非分页 lookaside 列表中分配实例上下文。 如果值不匹配, 则 FltAllocateContext 将失败,返回值STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND。
成功后, FltAllocateContext 将新上下文中的引用计数初始化为 1。 当不再需要上下文时,微筛选器驱动程序必须释放此引用。 因此,每次对 FltAllocateContext 的调用都必须与对 FltReleaseContext 的后续调用相匹配。
创建上下文后,微筛选器可以为 对象设置它。