阅读:2016回复:4
斑竹devia请出手,为何IRP_MJ_WRITE拦截不到写文件操作,百思不得其解呀?
我的理解是在 IRP_MJ_WRITE 例程中,利用条件
if ( 0 == ( Irp->Flags & ( IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { return SfPassThrough( DeviceObject, Irp ); } 可以最终得到写入磁盘的操作。(看了各位大牛们的帖子,好像也都是这么说) 但是我试了一下,却遗憾地发现,如果用记事本打开sfilter.c这份文件,然后直接另存为其他文件,符合上面要求的 Irp 却从未受到。(这个实验可以收到一个带IRP_DEFER_IO_COMPLETION标志的写入Irp。) 我怀疑数据在缓存中保存,需要等待时机再写入磁盘。我想,如果是这样的话,这段例程应该还是能捕获到写盘操作的。于是我在后面的代码中,把可能捕获到的数据全部都变成字母'A'。如果真的有机会捕获的话,总会把俺的修改结果存盘的。在记事本存盘后,重新启动计算机(这一下缓存应该都存盘了吧,我应该有机会捕获这个操作了吧!),结果发现,存盘后的文件仍然没有经过我的过滤。 我又用 FileMon 看了一些这个过程,同样发现拦截不到任何符合上面条件的写盘操作。 后来的实验表明,如果存盘后,再用记事本的“另存为”功能覆盖这个新文件,上面的代码就可以收到期望的 Irp 了。 难道除了 IRP_MJ_WRIRE 之外,还有其它途径把数据写入磁盘? ------------------------------- 补充说明: 开发工具IFS DDK-2600-1106,Windows XP的DDK,环境:windows xp + sp2, ntfs. 我是在SfCreate例程里记录了FileObject,然后再SfWrite里跟踪该FileObject的。 |
|
最新喜欢:![]() |
沙发#
发布于:2008-01-18 15:08
![]() ![]() |
|
板凳#
发布于:2008-01-18 15:19
Re:斑竹devia请出手,为何IRP_MJ_WRITE拦截不到写文件操作,百思不得其解呀
问题可能出在FileObject的跟踪上面,应该跟踪FCB,因为系统会用Stream FileObject对象来处理缓存,而在IRP_MJ_CREATE中是 永远收不到Stream FileObject的Create请求的,相反的, 你第一个收到的是IRP_MJ_CLEANUP请求. |
|
|
地板#
发布于:2008-01-18 15:49
先谢过斑竹
![]() ![]() |
|
地下室#
发布于:2008-01-18 16:23
斑竹大人明鉴,改成跟踪fcb后问题解决,再次表示感谢
![]() ![]() ![]() 接下来俺还的加倍努力学习,争取早日掌握开发过滤驱动的基本技术! |
|