my530
驱动牛犊
驱动牛犊
  • 注册日期2006-06-30
  • 最后登录2009-06-25
  • 粉丝2
  • 关注0
  • 积分7分
  • 威望79点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3031回复:7

请教,关于StreamContext的用法

楼主#
更多 发布于:2008-11-01 10:20
关于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函数,
Comments
FltGetStreamContext retrieves a context that was set for a file stream by a given minifilter driver instance. 

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. 

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

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

} FILE_CONTEXT, *PFILE_CONTEXT; 

PFILE_CONTEXT fileCtxPtr ;
NTSTATUS status ;
status = FltGetStreamContext( FltObjects->Instance,
                                  FltObjects->FileObject,
                                  &streamContext );

if (!NT_SUCCESS(status)&&(status==STATUS_NOT_FOUND)) 
{
   status = FltAllocateContext( Globals.Filter,
        FLT_STREAM_CONTEXT,
                                        sizeof(FILE_CONTEXT),
        PagedPool,
        &fileCtxPtr );
   if (!NT_SUCCESS( status )) 
   {
    KdPrint(("[Ctx]: Failed to create stream context"));
   }
   else
  {
      fileCtxPtr->EncryptFlagExist= IsEncrypted;
      status=FltSetStreamContext (FltObjects->Instance, 
                FltObjects->FileObject, 
                FLT_SET_CONTEXT_REPLACE_IF_EXISTS, 
                fileCtxPtr , 
                NULL); 
  if (!NT_SUCCESS(status)) FltReleaseContext( fileCtxPtr ); [color=#6666CC]//是否需要这句,因为在PreRead或PreWrite需要用到它[/color]
  }
}
else
{
    //FltReleaseContext( fileCtxPtr ); [color=#6666CC]//同样,是否需要这句,因为在PreRead或PreWrite需要用到它[/color]
}


5.在PreRead中,程序如下:
PFILE_CONTEXT fileCtxPtr ;
NTSTATUS status ;
 status = FltGetStreamContext( FltObjects->Instance,
                                      FltObjects->FileObject,
                                      &fileCtx );
if (!NT_SUCCESS(status)) {
            KdPrint(("PreRead:  Error getting stream context, status=%x\n",status) );
      //需要FltReleaseContext(fileCtx)还是FltReferenceContext(fileCtx)吗?
   return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
else
{
   //使用fileCtx 的值
.....
      *CompletionContext = fileCtx;

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

    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}


6.在PreClose或PreCleanup中,清除该PFILE_CONTEXT如何做?
VOID CleanupFileContext(
    __in PFLT_CONTEXT Context,
    __in FLT_CONTEXT_TYPE ContextType
    )
{
这样做吗?
PFILE_CONTEXT fileCtx=Context;
FltReleaseContext(fileCtx); 

还是要
if (ContextType==FLT_STREAM_CONTEXT)
FltDeleteContext(Context);
}

jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-11-02 09:48
4.PostCreate根据需要跟踪的文件,设置FltAllocateContext及FltSetStreamContext。
我参照ctx例子,程序大概的意思如下:
Copy codetypedef struct _FILE_CONTEXT
{    
      BOOLEAN EncryptFlagExist;

} FILE_CONTEXT, *PFILE_CONTEXT;

PFILE_CONTEXT fileCtxPtr ;
NTSTATUS status ;
status = FltGetStreamContext( FltObjects->Instance,
                                  FltObjects->FileObject,
                                  &streamContext );

if (!NT_SUCCESS(status)&&(status==STATUS_NOT_FOUND))
{
   status = FltAllocateContext( Globals.Filter,
        FLT_STREAM_CONTEXT,
                                        sizeof(FILE_CONTEXT),
        PagedPool,
        &fileCtxPtr );
   if (!NT_SUCCESS( status ))
   {
    KdPrint(("[Ctx]: Failed to create stream context"));
   }
   else
  {
      fileCtxPtr->EncryptFlagExist= IsEncrypted;
      status=FltSetStreamContext (FltObjects->Instance,
                FltObjects->FileObject,
                FLT_SET_CONTEXT_REPLACE_IF_EXISTS,
                fileCtxPtr ,
                NULL);

//JL2004回答:这里要的,因为Set不能功
  if (!NT_SUCCESS(status)) FltReleaseContext( fileCtxPtr ); //是否需要这句,因为在PreRead或PreWrite需要用到它
  }
}
else
{
//JL2004回答:这里不要,用完之后再Release
    //FltReleaseContext
}
向前,向前,向前....
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-11-02 09:49
Copy code
PFILE_CONTEXT fileCtxPtr ;
NTSTATUS status ;
status = FltGetStreamContext( FltObjects->Instance,
                                      FltObjects->FileObject,
                                      &fileCtx );
if (!NT_SUCCESS(status)) {
            KdPrint(("PreRead:  Error getting stream context, status=%x\n",status) );
      //需要FltReleaseContext(fileCtx)还是FltReferenceContext(fileCtx)吗?
   return FLT_PREOP_SUCCESS_NO_CALLBACK;
}
else
{
   //使用fileCtx 的值
.....
      *CompletionContext = fileCtx;

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

    return FLT_PREOP_SUCCESS_WITH_CALLBACK;
}


//========================


FltReleaseContext
就行,
向前,向前,向前....
jl2004
驱动小牛
驱动小牛
  • 注册日期2007-04-10
  • 最后登录2011-02-22
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望276点
  • 贡献值0点
  • 好评度129点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-11-02 09:50
VOID CleanupFileContext(
    __in PFLT_CONTEXT Context,
    __in FLT_CONTEXT_TYPE ContextType
    )
{
这样做吗?
PFILE_CONTEXT fileCtx=Context;
FltReleaseContext(fileCtx);

还是要
if (ContextType==FLT_STREAM_CONTEXT)
FltDeleteContext(Context);
}


可做可不做,Context会自动Delete的
向前,向前,向前....
my530
驱动牛犊
驱动牛犊
  • 注册日期2006-06-30
  • 最后登录2009-06-25
  • 粉丝2
  • 关注0
  • 积分7分
  • 威望79点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-11-02 10:19
jl2004 ,谢谢你的回答,
4.PostCreate根据需要跟踪的文件
NTSTATUS status ;
status = FltGetStreamContext( FltObjects->Instance,
                                  FltObjects->FileObject,
                                  &streamContext );

if (!NT_SUCCESS(status)&&(status==STATUS_NOT_FOUND))
{.......
}
else
{
//JL2004回答:这里不要,用完之后再Release
}

我想问PreRead或PreWrite要用streamContext ,如何得知streamContext ?用全局变量保存streamContext 吗?
在PreRead或PreWrite中,不需要再调用FltGetStreamContext吗?

谢谢!
my530
驱动牛犊
驱动牛犊
  • 注册日期2006-06-30
  • 最后登录2009-06-25
  • 粉丝2
  • 关注0
  • 积分7分
  • 威望79点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-11-02 10:21
再问一个问题,
当FltSetStreamContext 返回 !NT_SUCCESS(status)时,需要调 FltReleaseContext.
那么,FltGetStreamContext 返回 !NT_SUCCESS(status),不需要调FltReleaseContext,是吗?
Da Vinci
驱动牛犊
驱动牛犊
  • 注册日期2008-10-22
  • 最后登录2009-06-15
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望59点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-11-02 11:38
学习
我是菜鸟
jyss1644
驱动牛犊
驱动牛犊
  • 注册日期2007-08-15
  • 最后登录2011-04-11
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望180点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-11-02 13:57
学习了~
游客

返回顶部