阅读:1753回复:3
再次求助内存映射读操作的捕获对txt等内存映射方式的读操作,应该使用什么方法才能捕获呢? 我观察到在有的时候,读取txt文件前可能会询问一下IRP_MJ_QUERY_INFORMATION的FileAllInformation,但并不是每次都这么做。 而且对txt等文件的读操作,使用在Create时保存文件名的方式无法获得正确的文件名,在fileObject中的FileName域也无法获取到正确的文件名。 上次发贴求助时,有兄弟说需要清缓存,但我觉得这样不是得每读一次就清一次缓存?而且我程序需要过滤掉那些非人为的读操作,这样每次建立缓存的时候可能会出现种种问题吧? 各位高手帮帮忙啊! |
|
沙发#
发布于:2009-11-09 15:56
这么快就沉了。。。大伙请帮忙出出点子啊!
|
|
板凳#
发布于:2009-12-11 14:55
等待中
|
|
地板#
发布于:2009-12-15 17:48
我也正在为类似事情头疼,在这里说些体会共勉。
1. "读取txt文件前可能会询问一下IRP_MJ_QUERY_INFORMATION的FileAllInformation,但并不是每次都这么做". 这个没注意,所以不清楚。 2. "使用在Create时保存文件名的方式无法获得正确的文件名,在fileObject中的FileName域也无法获取到正确的文件名。" 不清楚你是采用的什么架构, sfilter or minifilter? 但是有一点可以确定的就是,不管是什么架构,文件名是可以一定可以正确获得的。关键是时机. 对于sfilter,楚狂人的文章中有介绍,必须是在Create的完成例程被调用之后再去获取,因为只有这时候文件才算是真正打开。如果是minifilter,似乎不太会出现这样的情况。实在不行,你贴点代码出来,这样大牛们才好分析。 3. "有兄弟说需要清缓存,但我觉得这样不是得每读一次就清一次缓存?而且我程序需要过滤掉那些非人为的读操作,这样每次建立缓存的时候可能会出现种种问题吧?" 要清缓存。所谓文件映射,个人体会主要有两点,一是采用pageIO,二是会缓存文件。我们这里主要关注缓存。在有缓存存在的情况下,文件是从缓存中读取,这样就不会有IRP_MJ_READ。这样就算是人为的读操作,你都没法过滤。至于非人为的读操作,范围太大,我无能为力,建议看看per-file context,或者对目标进程过滤。 |
|