neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
阅读:2071回复:6

文件引用计数,判断文件关闭的疑问

楼主#
更多 发布于:2009-08-21 15:20
我的代码是用的DDK中MINIFILTER CTX框架中修改的,我想判断一个文件正真被关闭,但是不知道如何判断,找了很多文章,还是不得其解,希望大虾们给予指点
以下是我的部分代码:
FLT_POSTOP_CALLBACK_STATUS 
CryptPostCreate ( 
__inout PFLT_CALLBACK_DATA Cbd, 
__in PCFLT_RELATED_OBJECTS FltObjects, 
__inout_opt PVOID CbdContext, 
__in FLT_POST_OPERATION_FLAGS Flags 
) 
{ 
........... 
..... 
//新建CONTEXT 
status = CtxFindOrCreateStreamContext(Cbd, 
TRUE, 
&streamContext, 
&streamContextCreated); 

....... 
// 
// 增加文件引用计数 
// 
if (streamContextCreated) 
streamContext->Refcount = 1; 
else 
streamContext->Refcount ++; 

........ 
.... 

} 

FLT_PREOP_CALLBACK_STATUS 
CryptPreClose ( 
__inout PFLT_CALLBACK_DATA Cbd, 
__in PCFLT_RELATED_OBJECTS FltObjects, 
__deref_out_opt PVOID *CompletionContext 
) 
{ 
....... 
.... 
// 
// Get the stream context 
// 
status = CtxFindOrCreateStreamContext(Cbd, 
FALSE, // do not create if one does not exist 
&streamContext, 
&streamContextCreated); 
............... 
......... 
//减少引用 
if (streamContext->Refcount > 0) 
{ 
streamContext->Refcount --; 
} 
//引用减到零时删除context 
if (0 == streamContext->Refcount) 
{ 

//删除Streamcontext 
FltDeleteContext(streamContext); 
} 


..................... 

}


怎样在CryptPreClose 回调中判断一个文件真正被关闭呢?3x
JeTus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-22
  • 最后登录2010-01-17
  • 粉丝3
  • 关注0
  • 积分84分
  • 威望781点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-08-21 15:26
IRP_MJ_CLOSE 完成例程返回后可以追尾,不过我测试我的过不了nod32 3.0。
还有IRP_MJ_CLEANUP里面可以追尾……
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2009-08-21 15:31
我调试发现,操作一个文件系统会发给你多个IRP_MJ_CLEANUP如何判断是哪一次需要加尾呢..?
bravery36
驱动牛犊
驱动牛犊
  • 注册日期2008-03-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分46分
  • 威望376点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-08-21 16:06
通常的做法好像是在文件create的时候计数,cleanup到计数清零的时候加尾
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
地下室#
发布于:2009-08-21 16:28
引用第3楼bravery36于2009-08-21 16:06发表的  :
通常的做法好像是在文件create的时候计数,cleanup到计数清零的时候加尾

谢谢..提醒,我试试
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
5楼#
发布于:2009-08-28 11:46
   
lhuay
驱动牛犊
驱动牛犊
  • 注册日期2001-11-21
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望129点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-08-28 17:15
记得好象StreamFileObject也可能产生cleanup.
游客

返回顶部