阅读:1890回复:7
高手请帮忙:总是死机,看看是何问题,谢谢,急!!!!!!!!!!!
我写了个文件系统过滤驱动,想要在文件被修改前将文件的内容读出复制到其他地方,我拦截了IRP_MJ_WRITE,然后用ZwCreateFile,ZwWriteFile将拦截的内容备份为新文件.但是在频繁写文件的时候总是死机,表现为ZwWriteFile调用无返回。我该如何解决?很急很急啊,已经折腾好久了!
|
|
沙发#
发布于: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.
|
|
板凳#
发布于:2009-10-28 11:47
我创建了一个专门用来读写的线程,该线程运行在PASSIVE_LEVEL上,拦截了IRP_MJ_WRITE后把内容放在内存里,在读写线程中把内存中的内容写入文件,同样会有此现象。两个线程用event同步。请各位高手分析下是何原因导致。
|
|
地板#
发布于: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.
|
|
地下室#
发布于:2009-10-29 23:34
貌似和我的软件里面的实时备份的功能类似啊! 恩在线程里面做搞不好的肯定是要死锁的!不过也比较容易分析。不过我的在thread里面 实时备份的 死锁是出现在create 或者 setfileinformation里面 好像!具体的忘记了!因为后来把这个种在thread里面备份的方式 取消了!改为直接在 IRP—WRITE的时候 备份的!也是用的 ZwWriteFile 写的备份文件!貌似没有遇到过死锁!
不过 你要注意一点的可能是 你的 备份的 fileobject 在write的时候 又被备份了!检查一下看看! |
|
5楼#
发布于:2009-10-30 09:35
我是把所有IRP—WRITE的时候的内容都写在一个文件里,ZwCreateFile只运行了一次,后面全是ZwWriteFile,我试了不管是在IRP—WRITE的时候直接写,还是在线程里面写,都会有问题。当然,首先我已经保证了IRP—WRITE不是由于我的ZwWriteFile导致的。
|
|
6楼#
发布于:2009-10-30 11:29
把你的 死锁的堆栈贴出来!文件系统里面涉及到的同步太多了,简单的推理不可能解决你的这个问题!因为你的问题 仅仅是一个现象 连起码的,样例都没有! 比如 你是在 那种情况 做备份的?NOCACHE?PAGEIO? 这个irp 是同步的?还是异步? 你备份使用的文件打开的时候 是同步的?还是异步的? 你Zwwritefile 的时候 又没有考虑这个情况? 还有你又没有分析 这个写的请求是不是会对文件的size发生改变?比如是文件变大?还是对文件的已经有的数据的覆盖情况下死锁的??还有像michaelgz 说的 在ZwWritefile时候 如果要求某个中断得到满足,但在 当前 的level 是APC的情况下 那么这个 ZwWriteFile 不能得到满足自然会死锁。所有这些 你都没有在帖子里面提到,让别人怎么给你分析呢?
|
|
7楼#
发布于:2009-11-03 15:40
我也遇到了和楼主类似的问题。我写了个scsi驱动模拟了一个分区,我拦截了SCSIOP_WRITE,然后用ZwCreateFile,ZwWriteFile将拦截的内容备份为新文件.我在频繁往模拟的分区写文件,拦截了SCSIOP_WRITE后,往另外的实体硬盘分区写文件,也同样出现死机。请教大虾该如何解决! 大家群策群力呀!
|
|