阅读:5023回复:6
关于如何清缓存的疑问?
刚开始写过滤驱动,对于如何清缓存有很多疑问,请大家支招,也欢迎大家一起讨论。
1.为什么要清缓存? 因为我想做的是针对进程和文件类型进行过滤的驱动(需求很普遍,:-)),所以在授权进程读取文件时要给明文,非授权进程读取时要给密文。由于有缓存的存在,这就带来一些问题,假如授权进程先读文件,那么缓存中保存了明文。这样,非授权进程打开时也是得到的明文,相反,如果非授权进程先打开文件,那么授权进程得到的就是密文。 刚开始我这样想,干脆不如非授权进程就打不开文件算了。但是始终觉得还是不太妥当。一个原因是像一些常用程序也必须纳入授权进程的范围内,如Explorer.exe,这个不但危险,而且还会增加维护上的成本,还与设计初衷不符。 如何解决?找了很多贴子,说清缓存。据说还有不少方法,如双缓存。不过这个不明白,先弄清如何清缓存。 2.如何清缓存? 这个倒是在论坛中有贴子介绍。 3.什么时候清缓存? 这个是我最头疼的问题.有幸找到别人写的一个例子(具体是哪位还真不知道),上面主要在三个地方清缓存。一个是IRP_MJ_CREATE,IRP_MJ_CLEAN, IRP_MJ_CLOSE. 在IRP_MJ_CLEAN, IRP_MJ_CLOSE清缓存,比较明显,就是用户态APP不再使用该文件. 在IRP_MJ_CREATE的时候会清一次缓存。这个我觉得非常有必要,因为同一个文件在多次打开时,会生成不同的FILE_OBJECT,而这些个FILE_OBJECT却使用着共享的文件缓存。所以在打开的时候清一次缓存就能够解决一部分问题。但是考虑一种比较特殊的情况: a.首先授权进程打开文件,并不读取数据 b.非授权进程打开相同文件,也不读取数据 c.授权进程读取数据(这时缓存中是明文) d.非授权进程读取数据(这时读到的就是明文) 所以这就有问题了。那一个很明显的想法就是,在读完之后立马就清缓存。仔细一想,立马否决掉这个想法。单纯基于minifilter似乎办不到这一点。在PostRead中清缓存?这时候数据都还没有写入到缓存,清缓存没有意义。除了这个似乎就找不到一个好的时机。 针对这个问题,我还想了其它的方法,请大家指正。 a. 能不能想办法不用缓存? 查了一下,如果不是采用映射文件,还是有办法的。那就是在创建文件的时候,在flag中加入FILE_NO_INTERMEDIATE_BUFFERING.这样就不会使用缓存。但是映射文件,我还没找到办法。 b.既然不能阻止Cache Manager的使用,那就让它挂羊头卖狗肉。Hook cache manager的api让它对特殊的文件不做缓存。但是在论坛里面找了一圈,发现没人这么干。个人估计是因为与安全软件的冲突导致。 上面这些个尝试很辛酸,请大家指条明路。谢谢。 |
|
沙发#
发布于:2009-12-15 17:53
楼主研究的很透彻啊,我也在做这方面的,希望可以交流
|
|
板凳#
发布于:2009-12-15 23:00
花一分钟写清缓存的代码 搞定问题。
结果是得再花10年的时间来搞定由此带来的恶果。 自己衡量吧 |
|
地板#
发布于:2009-12-16 13:49
|
|
地下室#
发布于:2009-12-16 13:51
|
|
5楼#
发布于:2009-12-17 19:08
我也在苦恼中。。。。。。。。
|
|
6楼#
发布于:2010-05-21 07:49
能不能开一块属于授权进程的私有缓存.
|
|