quicmous
驱动牛犊
驱动牛犊
  • 注册日期2007-02-09
  • 最后登录2009-08-14
  • 粉丝0
  • 关注0
  • 积分115分
  • 威望44点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:2017回复:4

斑竹devia请出手,为何IRP_MJ_WRITE拦截不到写文件操作,百思不得其解呀?

楼主#
更多 发布于:2008-01-17 15:01
我的理解是在 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的。

最新喜欢:

linshierlinshi...
quicmous
驱动牛犊
驱动牛犊
  • 注册日期2007-02-09
  • 最后登录2009-08-14
  • 粉丝0
  • 关注0
  • 积分115分
  • 威望44点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-01-18 15:08
 
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
板凳#
发布于:2008-01-18 15:19
Re:斑竹devia请出手,为何IRP_MJ_WRITE拦截不到写文件操作,百思不得其解呀
问题可能出在FileObject的跟踪上面,应该跟踪FCB,因为系统会用
Stream FileObject对象来处理缓存,而在IRP_MJ_CREATE中是
永远收不到Stream FileObject的Create请求的,相反的,
你第一个收到的是IRP_MJ_CLEANUP请求.
人总在矛盾中徘徊。。。
quicmous
驱动牛犊
驱动牛犊
  • 注册日期2007-02-09
  • 最后登录2009-08-14
  • 粉丝0
  • 关注0
  • 积分115分
  • 威望44点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-01-18 15:49
先谢过斑竹 ,回复内容现在还看不懂,等我县消化消化,有问题在继续提问!
quicmous
驱动牛犊
驱动牛犊
  • 注册日期2007-02-09
  • 最后登录2009-08-14
  • 粉丝0
  • 关注0
  • 积分115分
  • 威望44点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-01-18 16:23
斑竹大人明鉴,改成跟踪fcb后问题解决,再次表示感谢     !!!

接下来俺还的加倍努力学习,争取早日掌握开发过滤驱动的基本技术!
游客

返回顶部