dasanlang
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-03-01
  • 粉丝1
  • 关注1
  • 积分15分
  • 威望141点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4911回复:6

关于如何清缓存的疑问?

楼主#
更多 发布于:2009-12-15 17:24
刚开始写过滤驱动,对于如何清缓存有很多疑问,请大家支招,也欢迎大家一起讨论。

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让它对特殊的文件不做缓存。但是在论坛里面找了一圈,发现没人这么干。个人估计是因为与安全软件的冲突导致。

上面这些个尝试很辛酸,请大家指条明路。谢谢。
neak47
驱动小牛
驱动小牛
  • 注册日期2009-05-25
  • 最后登录2016-01-09
  • 粉丝4
  • 关注0
  • 积分140分
  • 威望1221点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2009-12-15 17:53
楼主研究的很透彻啊,我也在做这方面的,希望可以交流
bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2009-12-15 23:00
花一分钟写清缓存的代码 搞定问题。

结果是得再花10年的时间来搞定由此带来的恶果。

自己衡量吧
dasanlang
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-03-01
  • 粉丝1
  • 关注1
  • 积分15分
  • 威望141点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-12-16 13:49
引用第1楼neak47于2009-12-15 17:53发表的  :
楼主研究的很透彻啊,我也在做这方面的,希望可以交流


欢迎多交流,目前真的头都大了。
dasanlang
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-03-01
  • 粉丝1
  • 关注1
  • 积分15分
  • 威望141点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-12-16 13:51
引用第2楼bluacat于2009-12-15 23:00发表的  :
花一分钟写清缓存的代码 搞定问题。

结果是得再花10年的时间来搞定由此带来的恶果。

自己衡量吧


我也想过缓存中放密文,但是这样就不知道怎么解密了。能不能指定下思路。
wakinanna
驱动牛犊
驱动牛犊
  • 注册日期2009-12-17
  • 最后登录2009-12-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望91点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-12-17 19:08
我也在苦恼中。。。。。。。。
xxagri
驱动牛犊
驱动牛犊
  • 注册日期2009-07-13
  • 最后登录2010-06-30
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2010-05-21 07:49
能不能开一块属于授权进程的私有缓存.
游客

返回顶部