5223|0

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教,关于minifilter中StreamContext的用法 [复制链接]

我想在PostCreate中设置上下文,在PreRead/PostRead或PreWrite/PostWrite能得到该上下文.

顺序:
1.在FLT_CONTEXT_REGISTRATION中定义。如:
     { FLT_STREAM_CONTEXT,
       0,
       CleanupStreamContext,
       sizeof(FILE_CONTEXT),
       CONTEXT_TAG },
2.InstanceSetup中,没做FltAllocateContext和FltSetStreamContext
3.FltGetStreamContext函数,

  1. Comments
  2. FltGetStreamContext retrieves a context that was set for a file stream by a given minifilter driver instance.

  3. FltGetStreamContext increments the reference count on the context that the Context parameter points to. When this context pointer is no longer needed, the caller must decrement its reference count by calling FltReleaseContext. Thus every successful call to FltGetStreamContext must be matched by a subsequent call to FltReleaseContext.

  4. 不好意思,英语不太好,FltGetStreamContext成功调用,是否需要FltReleaseContext或FltReferenceContext,因为别的函数可能需要用到它(看4或5)
复制代码

4.PostCreate根据需要跟踪的文件,设置FltAllocateContext及FltSetStreamContext。
我参照ctx例子,程序大概的意思如下:

  1. typedef struct _FILE_CONTEXT
  2. {   
  3.       BOOLEAN EncryptFlagExist;

  4. } FILE_CONTEXT, *PFILE_CONTEXT;

  5. PFILE_CONTEXT fileCtxPtr ;
  6. NTSTATUS status ;
  7. status = FltGetStreamContext( FltObjects->Instance,
  8.                                   FltObjects->FileObject,
  9.                                   &streamContext );

  10. if (!NT_SUCCESS(status)&&(status==STATUS_NOT_FOUND))
  11. {
  12.    status = FltAllocateContext( Globals.Filter,
  13.         FLT_STREAM_CONTEXT,
  14.                                         sizeof(FILE_CONTEXT),
  15.         PagedPool,
  16.         &fileCtxPtr );
  17.    if (!NT_SUCCESS( status ))
  18.    {
  19.     KdPrint(("[Ctx]: Failed to create stream context"));
  20.    }
  21.    else
  22.   {
  23.       fileCtxPtr->EncryptFlagExist= IsEncrypted;
  24.       status=FltSetStreamContext (FltObjects->Instance,
  25.                 FltObjects->FileObject,
  26.                 FLT_SET_CONTEXT_REPLACE_IF_EXISTS,
  27.                 fileCtxPtr ,
  28.                 NULL);
  29.   if (!NT_SUCCESS(status)) FltReleaseContext( fileCtxPtr ); [color=#6666CC]//是否需要这句,因为在PreRead或PreWrite需要用到它[/color]
  30.   }
  31. }
  32. else
  33. {
  34.     //FltReleaseContext( fileCtxPtr ); [color=#6666CC]//同样,是否需要这句,因为在PreRead或PreWrite需要用到它[/color]
  35. }

复制代码


5.在PreRead中,程序如下:

  1. PFILE_CONTEXT fileCtxPtr ;
  2. NTSTATUS status ;
  3. status = FltGetStreamContext( FltObjects->Instance,
  4.                                       FltObjects->FileObject,
  5.                                       &fileCtx );
  6. if (!NT_SUCCESS(status)) {
  7.             KdPrint(("PreRead:  Error getting stream context, status=%x\n",status) );
  8.       //需要FltReleaseContext(fileCtx)还是FltReferenceContext(fileCtx)吗?
  9.    return FLT_PREOP_SUCCESS_NO_CALLBACK;
  10. }
  11. else
  12. {
  13.    //使用fileCtx 的值
  14. .....
  15.       *CompletionContext = fileCtx;

  16.     //之后需要FltReleaseContext(fileCtx)还是FltReferenceContext(fileCtx)吗?

  17.     return FLT_PREOP_SUCCESS_WITH_CALLBACK;
  18. }

复制代码

6.在PreClose或PreCleanup中,清除该PFILE_CONTEXT如何做?

  1. VOID CleanupFileContext(
  2.     __in PFLT_CONTEXT Context,
  3.     __in FLT_CONTEXT_TYPE ContextType
  4.     )
  5. {
  6. 这样做吗?
  7. PFILE_CONTEXT fileCtx=Context;
  8. FltReleaseContext(fileCtx);

  9. 还是要
  10. if (ContextType==FLT_STREAM_CONTEXT)
  11. FltDeleteContext(Context);
  12. }
复制代码

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表