liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1750回复:7

高手请帮忙:总是死机,看看是何问题,谢谢,急!!!!!!!!!!!

楼主#
更多 发布于:2009-10-27 15:56
我写了个文件系统过滤驱动,想要在文件被修改前将文件的内容读出复制到其他地方,我拦截了IRP_MJ_WRITE,然后用ZwCreateFile,ZwWriteFile将拦截的内容备份为新文件.但是在频繁写文件的时候总是死机,表现为ZwWriteFile调用无返回。我该如何解决?很急很急啊,已经折腾好久了!
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
沙发#
发布于:2009-10-28 00:55
Your design is flawed. Don't think it can be solved easily. One reason is that ZwCreateFile and ZwWriteFile can only be called at PASSIVE_LEVEL, while paging WRITE is at APC_LEVEL. You may need to create this backup file somewhere else and construct your own WRITE IRP to be passed down.
liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2009-10-28 11:47
我创建了一个专门用来读写的线程,该线程运行在PASSIVE_LEVEL上,拦截了IRP_MJ_WRITE后把内容放在内存里,在读写线程中把内存中的内容写入文件,同样会有此现象。两个线程用event同步。请各位高手分析下是何原因导致。
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
地板#
发布于:2009-10-29 02:06
Then you need to use WinDbg breaking into the system and check all locks held by each thread and all pending IRPs to figure out where is the deadlock.
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-10-29 23:34
貌似和我的软件里面的实时备份的功能类似啊! 恩在线程里面做搞不好的肯定是要死锁的!不过也比较容易分析。不过我的在thread里面 实时备份的 死锁是出现在create 或者 setfileinformation里面 好像!具体的忘记了!因为后来把这个种在thread里面备份的方式 取消了!改为直接在 IRP—WRITE的时候 备份的!也是用的 ZwWriteFile 写的备份文件!貌似没有遇到过死锁!
不过 你要注意一点的可能是 你的 备份的 fileobject 在write的时候 又被备份了!检查一下看看!
liangyufei
驱动小牛
驱动小牛
  • 注册日期2006-01-16
  • 最后登录2021-10-12
  • 粉丝0
  • 关注0
  • 积分1019分
  • 威望588点
  • 贡献值2点
  • 好评度95点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2009-10-30 09:35
我是把所有IRP—WRITE的时候的内容都写在一个文件里,ZwCreateFile只运行了一次,后面全是ZwWriteFile,我试了不管是在IRP—WRITE的时候直接写,还是在线程里面写,都会有问题。当然,首先我已经保证了IRP—WRITE不是由于我的ZwWriteFile导致的。
qianjunhua
驱动小牛
驱动小牛
  • 注册日期2003-12-08
  • 最后登录2013-02-27
  • 粉丝11
  • 关注0
  • 积分712分
  • 威望1052点
  • 贡献值1点
  • 好评度57点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-10-30 11:29
把你的 死锁的堆栈贴出来!文件系统里面涉及到的同步太多了,简单的推理不可能解决你的这个问题!因为你的问题 仅仅是一个现象 连起码的,样例都没有!  比如 你是在 那种情况 做备份的?NOCACHE?PAGEIO? 这个irp 是同步的?还是异步? 你备份使用的文件打开的时候 是同步的?还是异步的? 你Zwwritefile 的时候 又没有考虑这个情况? 还有你又没有分析 这个写的请求是不是会对文件的size发生改变?比如是文件变大?还是对文件的已经有的数据的覆盖情况下死锁的??还有像michaelgz 说的 在ZwWritefile时候 如果要求某个中断得到满足,但在 当前 的level 是APC的情况下 那么这个 ZwWriteFile 不能得到满足自然会死锁。所有这些 你都没有在帖子里面提到,让别人怎么给你分析呢?
CyberQiQi
驱动牛犊
驱动牛犊
  • 注册日期2004-06-03
  • 最后登录2021-02-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望54点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2009-11-03 15:40
我也遇到了和楼主类似的问题。我写了个scsi驱动模拟了一个分区,我拦截了SCSIOP_WRITE,然后用ZwCreateFile,ZwWriteFile将拦截的内容备份为新文件.我在频繁往模拟的分区写文件,拦截了SCSIOP_WRITE后,往另外的实体硬盘分区写文件,也同样出现死机。请教大虾该如何解决! 大家群策群力呀!
游客

返回顶部