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);

 

 

 

posted @ 2010-12-29 11:00  UnhandleException  阅读(1007)  评论(0编辑  收藏  举报