注册上下文类型
微筛选器驱动程序必须首先注册它使用的每种上下文类型。 微筛选器注册其使用的上下文类型后,可以 创建上下文。
注册上下文类型的步骤
微筛选器从其 DriverEntry 例程调用 FltRegisterFilter,以注册它使用的每种上下文类型。 在调用 FltRegisterFilter 之前,微筛选器驱动程序执行以下操作:
- 创建 FLT_CONTEXT_REGISTRATION 结构的可变长度数组。 此数组中元素的顺序并不重要;但是,数组中的最后一个元素必须是 {FLT_CONTEXT_END}。
- 将指向所创建数组的指针存储在FLT_REGISTRATION结构的 ContextRegistration 成员中。 微筛选器在 FltRegisterFilter 的 Registration 参数中传递此结构。
对于微筛选器驱动程序使用的每个上下文类型,它必须至少提供一个上下文定义。 定义采用 FLT_CONTEXT_REGISTRATION 结构的形式,其中每个结构定义上下文的类型、大小和其他信息。
当微筛选器驱动程序调用 FltAllocateContext 创建新上下文时,筛选器管理器使用 Size 参数以及 FLT_CONTEXT_REGISTRATION 结构的 Size 和 Flags 成员来选择要使用的上下文定义:
对于固定大小的上下文,FLT_CONTEXT_REGISTRATION 结构的 Size 成员指定由微筛选器驱动程序定义的上下文结构部分的大小(以字节为单位)。 上下文的最大大小为 MAXUSHORT (64 KB) 。 零是有效的大小值。 筛选器管理器使用 lookaside 列表实现固定大小的上下文。 筛选器管理器为每个大小值创建两个查找列表:一个分页和一个非分页。
对于可变大小的上下文, 必须将 Size 成员设置为 FLT_VARIABLE_SIZED_CONTEXTS。 筛选器管理器直接从分页或非分页池分配可变大小的上下文。
在 FLT_CONTEXT_REGISTRATION 结构的 Flags 成员中,可以指定FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH标志。 如果微筛选器驱动程序使用固定大小的上下文并且指定了此标志,则如果上下文的大小大于或等于请求的大小,筛选器管理器将从旁观列表中分配上下文。 否则,上下文的大小必须等于请求的大小。
对于给定的上下文类型,微筛选器驱动程序可以提供最多三个固定大小的上下文定义,每个定义具有不同的大小和一个可变大小的定义。 有关详细信息,请参阅 FLT_CONTEXT_REGISTRATION。
用于上下文管理的微筛选器回调例程
微筛选器驱动程序可以选择性地提供以下与上下文相关的回调例程,这些例程存储在 FLT_REGISTRATION 结构中,该结构作为参数传递给 FltRegisterFilter:
回调例程 | 说明 |
---|---|
PFLT_CONTEXT_ALLOCATE_CALLBACK | 在极少数情况下,微筛选器可能需要定义自己的回调例程来分配上下文,而不是依赖于筛选器管理器。 |
PFLT_CONTEXT_CLEANUP_CALLBACK | 在释放上下文之前要调用的微筛选器清理例程。 |
PFLT_CONTEXT_FREE_CALLBACK | 在极少数情况下,微筛选器可能需要定义自己的回调例程来释放上下文,而不是依赖于筛选器管理器。 |
上下文注册代码示例
以下代码示例取自 CTX 示例微筛选器驱动程序,其中显示了一个 FLT_CONTEXT_REGISTRATION 结构数组,这些结构用于注册实例、文件、流和文件对象, (流句柄) 上下文。
const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
{ FLT_INSTANCE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_INSTANCE_CONTEXT_SIZE, //Size
CTX_INSTANCE_CONTEXT_TAG //PoolTag
},
{ FLT_FILE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_FILE_CONTEXT_SIZE, //Size
CTX_FILE_CONTEXT_TAG //PoolTag
},
{ FLT_STREAM_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_STREAM_CONTEXT_SIZE, //Size
CTX_STREAM_CONTEXT_TAG //PoolTag
},
{ FLT_STREAMHANDLE_CONTEXT, //ContextType
0, //Flags
CtxContextCleanup, //ContextCleanupCallback
CTX_STREAMHANDLE_CONTEXT_SIZE, //Size
CTX_STREAMHANDLE_CONTEXT_TAG //PoolTag
},
{ FLT_CONTEXT_END }
};