阅读:1953回复:4
怎么在IRP_MJ_CLOSE中知道一个磁盘文件被关闭的信息?
问题描述:
现在已经实现了文件头加标志的透明加密的功能,但在明文文件自动转换为密文文件的时候遇到一个问题:怎么在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,那么这些就都是可行办法。 如果不考虑性能,第一种方式是一个通用的方式。 相比较而言,第四种方式是最简单的。 不过是否有其他的解决方法?如果可以直接使用系统的函数就好了。 |
|
|
沙发#
发布于:2009-08-28 18:04
|
|
板凳#
发布于:2009-08-28 17:43
不能跟踪close,需要跟踪cleanup.
系统在一般情况下,不发出最后一个close. |
|
地板#
发布于:2009-08-25 11:25
楼主的方法一,我试了一下,发现在文件被彻底删除的时候(shift + del)引用计数才会变为0
|
|
地下室#
发布于:2009-08-25 10:45
好好
![]() |
|