dreamsity
驱动小牛
驱动小牛
  • 注册日期2006-09-01
  • 最后登录2013-07-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望821点
  • 贡献值1点
  • 好评度68点
  • 原创分1分
  • 专家分0分
阅读:1821回复:4

怎么在IRP_MJ_CLOSE中知道一个磁盘文件被关闭的信息?

楼主#
更多 发布于:2007-12-11 10:24
        问题描述:
        现在已经实现了文件头加标志的透明加密的功能,但在明文文件自动转换为密文文件的时候遇到一个问题:怎么在IRP_MJ_CLOSE中知道一个磁盘文件被关闭。
    由于一个磁盘文件可以被打开多次,每次关闭时都会收到一个IRP_MJ_CLOSE的消息。在这个IRP_MJ_CLOSE的消息内,我怎么判断出这个IRP_MJ_CLOSE是最后一个IRP_MJ_CLOSE。

    可能的解决方法:
    方法一:在对FileObjec->FsContext建立一个表,收到IRP_MJ_CREATE消息,就先查询这个FsContext对应的条目是否存在,如果不存在,则增加条目,并设置引用计数为1,如果存在,则增加引用计数;在IRP_MJ_CLOSE中减少这个引用计数,如果引用计数为0,则删除条目。在IRP_MJ_CLOSE中根据引用计数就可以判断出这个IRP_MJ_CLOSE是否是最后一个IRP_MJ_CLOSE。
    方法二:根据WINDOW的内部结构直接判断。由于在网络上可以找到WIN2K WINXP WIN2003的NTOS部分的代码,直接根据SECTION的内部结构来判断出是否一个IRP_MJ_CLOSE是最后一个IRP_MJ_CLOSE。
    方法三:直接使用文件系统提供的结构。在IFS的FAT32的源代码中,可以看到这个引用计数是放在_FCB的OpenCount字段中的,也就是在FsContext指向的内存中。如果是NTFS,可能需要使用WINDBG追踪出这个字段。
    方法四:在IRP_MJ_CLOSE之后,在一个WORK_ITEM中,采用独占方式打开文件,如果打开成功,则表示没有没有其他人访问这个文件。

    不好的地方:
    方法一:需要对所有文件的IRP_MJ_CREATE和IRP_MJ_CLOSE做记录,对内存消耗比较大,也降低了系统性能。
    方法二:WINDOW内部未公开的结构,可能会随WINDOW版本的变化而变化,也许一个补丁升级后,就出问题了。
    方法三:必须对FAT32和NTFS的各个版本都做追踪,不同的版本也有可能不同,而且如果不是NTFS和FAT32的第三方文件系统,就有可能会出问题。
    方法四:需要获得IRP_MJ_CLSOE的文件的文件名,这个文件名会在WORK_TEIM中使用。

    在如果设定只支持WIN2K WINXP WIN2003,那么这些就都是可行办法。
    如果不考虑性能,第一种方式是一个通用的方式。
    相比较而言,第四种方式是最简单的。
    不过是否有其他的解决方法?如果可以直接使用系统的函数就好了。
一切都是时间问题!
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2009-08-25 10:45
好好
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2009-08-25 11:25
楼主的方法一,我试了一下,发现在文件被彻底删除的时候(shift + del)引用计数才会变为0
lhuay
驱动牛犊
驱动牛犊
  • 注册日期2001-11-21
  • 最后登录2011-10-14
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望129点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-08-28 17:43
不能跟踪close,需要跟踪cleanup.
系统在一般情况下,不发出最后一个close.
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
地下室#
发布于:2009-08-28 18:04
引用第3楼lhuay于2009-08-28 17:43发表的  :
不能跟踪close,需要跟踪cleanup.
系统在一般情况下,不发出最后一个close.

能否给个详细联系方式啊..我有问题向大虾请教
我QQ:42883733
游客

返回顶部