hhyDriver
驱动小牛
驱动小牛
  • 注册日期2007-06-06
  • 最后登录2009-01-19
  • 粉丝0
  • 关注0
  • 积分154分
  • 威望150点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
阅读:2052回复:11

过滤驱动程序中能否捕捉到关闭文件操作

楼主#
更多 发布于:2007-11-23 09:40
过滤驱动程序中能否捕捉到关闭文件操作?
关闭文件时发送什么IRP?IRP_MJ_CLOSE?怎么区分是文件关闭时的close?
showna
驱动牛犊
驱动牛犊
  • 注册日期2005-12-18
  • 最后登录2012-12-20
  • 粉丝0
  • 关注0
  • 积分2313分
  • 威望133点
  • 贡献值1000点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-11-24 10:33
好像没有,在Shell namespace extension 中捕获到
clarence
驱动牛犊
驱动牛犊
  • 注册日期2006-05-08
  • 最后登录2009-09-30
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望97点
  • 贡献值0点
  • 好评度76点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-11-24 14:35
用一下StreamCtx,当FileObject销毁的时候会去释放这个Context,这个当作文件的关闭应该是合适的。
hhyDriver
驱动小牛
驱动小牛
  • 注册日期2007-06-06
  • 最后登录2009-01-19
  • 粉丝0
  • 关注0
  • 积分154分
  • 威望150点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-11-26 10:11
谢谢两位的回答,我将试一试。
hhyDriver
驱动小牛
驱动小牛
  • 注册日期2007-06-06
  • 最后登录2009-01-19
  • 粉丝0
  • 关注0
  • 积分154分
  • 威望150点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-11-27 11:43
引用第2楼clarence于2007-11-24 14:35发表的  :
用一下StreamCtx,当FileObject销毁的时候会去释放这个Context,这个当作文件的关闭应该是合适的。

试了一下你说的方法。
步骤如下:(1)调用FsRtlInitPerStreamContext()初始化(2)调用FsRtlInsertPerStreamContext()保存StreamContext,当然先调用FsRtlLookupPerStreamContext()判断是否存在。
问题是:关闭文件时,好像没有执行步骤(1)中设置的回调函数(用输出检查)。
请教:能否指点一下使用StreamContext的方法。
clarence
驱动牛犊
驱动牛犊
  • 注册日期2006-05-08
  • 最后登录2009-09-30
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望97点
  • 贡献值0点
  • 好评度76点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-11-27 13:28
我用的是Minifilter Driver,
       { FLT_STREAM_CONTEXT,
       0,
       CleanupStreamContext,
       sizeof(STREAM_CONTEXT),
       CONTEXT_TAG },

Fileobject销毁的时候会去回调CleanupStreamContext。

原理应该是一样的。
我具体跟过,文件被close之后不一定会立刻去Free的,具体free的时刻不知道Ms是怎么确定的,可能和file reference有关吧。

注意,file reference 一定在自己driver里面reference一次就deference一次,否则的话就不会进你的free回调了。
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2007-11-27 15:52
先顶到最上面,期待LZ的总结,
驱网无线,快乐无限
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2007-11-28 15:16
放个代码,回调并没被调用,
VOID Per_StreamContext(PFILE_OBJECT FileObject)
{
    PFSRTL_ADVANCED_FCB_HEADER fsadvfcb;
    PFSRTL_PER_STREAM_CONTEXT  fsprectx;
    NTSTATUS RC;
    //1, 分配Per-Stream Context
    PVOID pCtx;

    //1,由FileObject 得到PFSRTL_ADVANCED_FCB_HEADER结构
    fsadvfcb = FsRtlGetPerStreamContextPointer ( FileObject );
    
    fsprectx = FsRtlLookupPerStreamContext(fsadvfcb , &co, &ci);
    if ( fsprectx == NULL )
    {
        DbgPrint("%s\n", "look up null");
    }
    else
    {    
       return;
    }

    pCtx = ExAllocatePool(NonPagedPool, 512);

    if ( pCtx  == NULL){
        return ;
    }

    //预置Per-Stream Context
    FsRtlInitPerStreamContext(
        (PFSRTL_PER_STREAM_CONTEXT)pCtx,  
        &co,                            
        &ci,                            
        freefunc);

    //关连Per-Stream Context 到一个File Stream
        
            
      RC = FsRtlInsertPerStreamContext(
                    fsadvfcb,                    
                    pCtx    );                    
    
      if ( !NT_SUCCESS( RC ))
      {
          DbgPrint("%s\n", "Insert failed");
          ExFreePool(pCtx);
      }


   //   FsRtlTeardownPerStreamContexts( fsadvfcb ); 此句真的会被自动调用?
    
}
驱网无线,快乐无限
clarence
驱动牛犊
驱动牛犊
  • 注册日期2006-05-08
  • 最后登录2009-09-30
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望97点
  • 贡献值0点
  • 好评度76点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-11-28 16:20
typedef struct _FSRTL_PER_STREAM_CONTEXT {
  LIST_ENTRY  Links;
  PVOID  OwnerId;
  PVOID  InstanceId;
  PFREE_FUNCTION  FreeCallback; --  添上你的FreeCallback
} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT;

PFREE_FUNCTION  FreeCallback

这个函数去回调~~

lagacy filter 没试过,试下应该是没问题的
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2007-11-28 17:11
VOID  freefunc(
          IN PVOID Buffer
          )
{
    if (Buffer == NULL)
    {}
    else
    {
        DbgPrint("%s\n", "FileObject be Closed");
        ExFreePool(Buffer);
    }
}
这是我的freeFunc
如果手工调用FsRtlTeardownPerStreamContexts( fsadvfcb );这么函数会被调用,
但资料上说,不用手工调用
Remove,
与Teardown, 。。。
驱网无线,快乐无限
clarence
驱动牛犊
驱动牛犊
  • 注册日期2006-05-08
  • 最后登录2009-09-30
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望97点
  • 贡献值0点
  • 好评度76点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-11-28 18:39
对,耐心多等下,就应该能看见。不行你就shutdown,看看会不会进~
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2007-11-29 08:53
FsRtlInitPerStreamContext  的参数 co, ci 我定义为全局的 CHAR 没问题吧?
原来的参数类型为 PVOID
驱网无线,快乐无限
游客

返回顶部