xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3387回复:26

高手请帮忙:看看是不是IRP_MJ_CREATE重入问题,总是死机,谢谢,急!!!!!!!!!!!

楼主#
更多 发布于:2004-06-02 23:25
我写了个文件系统过滤驱动,想要在文件被修改前将文件的内容读出复制到其他地方,我拦截了IRP_MJ_WRITE,然后在一个系统线程中用ZwCreateFile打开拦截到的文件,然后用ZwCreateFile,ZwWriteFile将拦截的文件备份为新文件,但是再某些情况下总是死机,比如安装某些软件,我用论坛以前讨论过的对比线程ID的方法解决重入问题也不行,请问各位高手这是不是和重如有关?改如何解决?很急很急啊,已经折腾乐好久了
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-18 12:55
周六
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-16 10:11
高手都那去了
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-14 13:38
又来了:)
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-13 13:08
顶起来
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-12 11:53
我顶
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-10 16:05
aethercat:
能否告知大致的制作步骤?
在自己构造的IRP中,如何保证一些必要的参数与源IRP相同,例如填充源IRP所获取的数据?

非常感谢
king_y
驱动牛犊
驱动牛犊
  • 注册日期2004-10-21
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分53分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-10 15:32
aethercat
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2005-06-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-10 15:14
可以自行构造IRP直接向下层读数据,不必使用ZwReadFile
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-09 14:18
我也来顶一把
Hero2004
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-06 22:25
我好象是有同样的问题
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-06-11 11:10
===========================================================
1,能否根据IRP中FileObject等信息直接通过ZwReadFile读出文件
中的数据?还是必须先用ZwCreateFile打开这个文件?
===========================================================
据我所知好象不能根据FileObject直接用ZwReadFile读出文件数据,因为ZwReadFile需要句柄,不知如何根据PFILE_OBJECT获得文件句柄

============================================================
2,IRP中有关Write.Length和Write.BytesOffset里面的数据是否可以拿来直接用,以便确定需要读取的文件数据范围,尤其是Offset是否可以直接传递到ZwReadFile中?
============================================================
IRP的Buffer中是你的新的数据,Length和Offset也是你新数据要写入的地方,你要取旧数据,就我所知道的就是你在IRP向下传之前用ZwCreateFile打开文件读,就如我现在做法一样,要不你创建一系列新的IRP去打开文件读取文件和关闭文件,不过好象很难,不会,但这些都有可能存在文件共享冲突,所以不一定总能成功
zhangc98
驱动牛犊
驱动牛犊
  • 注册日期2002-03-30
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-06-10 22:54
关注中,另外借光提个问题,
如果我拦截到IRP_MJ_WRITE之后,
将要写入文件的新的数据应该在当前的这个IRP的缓冲区里吧?
我希望能够在数据被写入文件之前,
先把文件中的一段数据读出来,
将新旧数据进行一定的处理之后,
在修改当前IRP缓冲区中写入的数据,
把修改后的数据写入文件。

我的问题是如下:
拦截到IRP_MJ_WRITE后挂起,
1,能否根据IRP中FileObject等信息直接通过ZwReadFile读出文件
中的数据?还是必须先用ZwCreateFile打开这个文件?
2,IRP中有关Write.Length和Write.BytesOffset里面的数据是否可以拿来直接用,以便确定需要读取的文件数据范围,尤其是Offset是否可以直接传递到ZwReadFile中?

感觉问题与楼主有相关的地方,多谢大家了:)
目前:新手上路; 目标:高级站友; 理想:开国大佬; 方法:自己的努力+大家的关照!
sinfors
驱动牛犊
驱动牛犊
  • 注册日期2003-03-18
  • 最后登录2005-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-06-10 11:32
是否可以在IRP_MJ_WRITE的时候,先把数据复制到你的buffer里,且告诉系统NTSTATUS_SUCCESS,然后再在另一个线程里完成备份,再把你的buffer里的数据写回?
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-06-10 11:04
共享冲突是会有的,不过此时也就返回错误而忽略过去不在备份,同步代码是没问题的,只是在打开某些文件时ZwCreateFile就不在再响应了,我自己也在怀疑这种方式,因为我在备份时DISPATCH处是被阻塞的,但此时我又进行IO操作产生IRP包想要往下传,按道理不应该成功的,但大部分都可以,不知为什么,也许是我对文件系统的过滤驱动还不是很熟悉,有谁能指点一条明路,也不知哪位研究过GoBack的实现原理,我要做的就是这样一个东西,而GoBack也是用的FsFilter
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-06-10 09:01
死机的现象类似于死锁一样,而且机器不能正常关机,其实在用ZwCreateFile打开被拦截的文件时ZwCreateFile就不再有反应了(是不是你的create例程重入问题导致的),  

而在Dispatch与备份文件的线程之间是用Event同步的,所以就死锁了,其实我的目的很简单,就是创建一个文件系统过滤程序来监视文件的改变,在文件改变之前将拦截到的文件先做备份,不知哪位高人有什么好主意,可以和我QQ交流啊,1411010,很急很急,谢谢各位了
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-06-10 08:53
死机的现象类似于死锁一样,而且机器不能正常关机,其实在用ZwCreateFile打开被拦截的文件时ZwCreateFile就不再有反应了,而[!!!!在Dispatch与备份文件的线程之间是用Event同步的,所以就死锁了!!!!],其实我的目的很简单,就是创建一个文件系统过滤程序来监视文件的改变,在文件改变之前将拦截到的文件先做备份,不知哪位高人有什么好主意,可以和我QQ交流啊,1411010,很急很急,谢谢各位了
==============================================================

这种备份方式不会有问题吗,在写数据时再打开源文件,不会共享冲突吗?

另外知道死锁的地方了,把同步的那段代码好好分析一下,问题应该比较容易解决吧
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-06-09 23:27
死机的现象类似于死锁一样,而且机器不能正常关机,其实在用ZwCreateFile打开被拦截的文件时ZwCreateFile就不再有反应了,而在Dispatch与备份文件的线程之间是用Event同步的,所以就死锁了,其实我的目的很简单,就是创建一个文件系统过滤程序来监视文件的改变,在文件改变之前将拦截到的文件先做备份,不知哪位高人有什么好主意,可以和我QQ交流啊,1411010,很急很急,谢谢各位了
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-06-09 17:46
你如何确信你创建的备份文件是文件而不是目录,
不需要指定FILE_NON_DIRECTORY_FILE???
另外你说的死机是什么意思?蓝屏吗?
错误信息是什么?
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-06-09 11:06
打开拦截到的文件
status = ZwCreateFile(&hSrcHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, &ObjectAttributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OPEN, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0)
创建备份的文件
status = ZwCreateFile(&hDesHandle, FILE_WRITE_DATA | SYNCHRONIZE, &ObjectAttributes, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_CREATE, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0)
读写文件就是普通的ZwReadFile,ZwWriteFile,
我现在拦截IRP_MJ_WRITE,其中通过GetCurrentThreadId != hThreadId来判断是不是自己的线程发出的包,但在拦截IE6安装时到11%左右就不在继续安装,但没死机,此时我如果打开NotePad不停地保存文件,则IE6.0会继续安装,直到100%,此时机器也彻底死机,想请各位高手帮我分析看看是什么原因
上一页
游客

返回顶部