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

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

楼主#
更多 发布于:2004-06-02 23:25
我写了个文件系统过滤驱动,想要在文件被修改前将文件的内容读出复制到其他地方,我拦截了IRP_MJ_WRITE,然后在一个系统线程中用ZwCreateFile打开拦截到的文件,然后用ZwCreateFile,ZwWriteFile将拦截的文件备份为新文件,但是再某些情况下总是死机,比如安装某些软件,我用论坛以前讨论过的对比线程ID的方法解决重入问题也不行,请问各位高手这是不是和重如有关?改如何解决?很急很急啊,已经折腾乐好久了
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-03 09:21
你在截获write后世挂起当前线程吗?还是把数据直接转存到新的话冲区?
你一点相关的信息不提供,怎么回答你?
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-03 10:59
是挂起的,在Dispatch和创建文件的线程用KEVENT进行的同步,等到我把文件中的数据全部读出转存后将IRP_MJ_WRITE传下去。我安装PHOTOSHOP7.0试验的,安装到80%的时候安装程序就停止了,但此时我的Filter可以继续拦截其他进程的操作,简直faint
farwalk
驱动牛犊
驱动牛犊
  • 注册日期2002-04-27
  • 最后登录2004-09-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-06-03 21:34
提供一个想法给你:
 在write irp的thread context里,不要用KEVENT同步,直接回复pending,在完成文件备份以后再完成IRP.可以试试,成功了告诉我。:-)
好运。
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-03 22:59
谢谢,我明天就试试
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-03 23:05
不过我今天发现是在读写文件时死机,和打开与创建文件无关,我已经对线程ID做了区分了,并且死机的位置好象比较固定,如dllcache文件夹,过滤后就不会死机,大家快帮忙啊
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-04 20:18
哎,自各儿先顶了
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-07 12:01
你是怎么打开和读写该文件的?能否把代码贴出来??
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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%,此时机器也彻底死机,想请各位高手帮我分析看看是什么原因
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-06-09 17:46
你如何确信你创建的备份文件是文件而不是目录,
不需要指定FILE_NON_DIRECTORY_FILE???
另外你说的死机是什么意思?蓝屏吗?
错误信息是什么?
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于: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分
11楼#
发布于:2004-06-10 08:53
死机的现象类似于死锁一样,而且机器不能正常关机,其实在用ZwCreateFile打开被拦截的文件时ZwCreateFile就不再有反应了,而[!!!!在Dispatch与备份文件的线程之间是用Event同步的,所以就死锁了!!!!],其实我的目的很简单,就是创建一个文件系统过滤程序来监视文件的改变,在文件改变之前将拦截到的文件先做备份,不知哪位高人有什么好主意,可以和我QQ交流啊,1411010,很急很急,谢谢各位了
==============================================================

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

另外知道死锁的地方了,把同步的那段代码好好分析一下,问题应该比较容易解决吧
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-06-10 09:01
死机的现象类似于死锁一样,而且机器不能正常关机,其实在用ZwCreateFile打开被拦截的文件时ZwCreateFile就不再有反应了(是不是你的create例程重入问题导致的),  

而在Dispatch与备份文件的线程之间是用Event同步的,所以就死锁了,其实我的目的很简单,就是创建一个文件系统过滤程序来监视文件的改变,在文件改变之前将拦截到的文件先做备份,不知哪位高人有什么好主意,可以和我QQ交流啊,1411010,很急很急,谢谢各位了
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-06-10 11:04
共享冲突是会有的,不过此时也就返回错误而忽略过去不在备份,同步代码是没问题的,只是在打开某些文件时ZwCreateFile就不在再响应了,我自己也在怀疑这种方式,因为我在备份时DISPATCH处是被阻塞的,但此时我又进行IO操作产生IRP包想要往下传,按道理不应该成功的,但大部分都可以,不知为什么,也许是我对文件系统的过滤驱动还不是很熟悉,有谁能指点一条明路,也不知哪位研究过GoBack的实现原理,我要做的就是这样一个东西,而GoBack也是用的FsFilter
sinfors
驱动牛犊
驱动牛犊
  • 注册日期2003-03-18
  • 最后登录2005-01-08
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-06-10 11:32
是否可以在IRP_MJ_WRITE的时候,先把数据复制到你的buffer里,且告诉系统NTSTATUS_SUCCESS,然后再在另一个线程里完成备份,再把你的buffer里的数据写回?
zhangc98
驱动牛犊
驱动牛犊
  • 注册日期2002-03-30
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于: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中?

感觉问题与楼主有相关的地方,多谢大家了:)
目前:新手上路; 目标:高级站友; 理想:开国大佬; 方法:自己的努力+大家的关照!
xxcat1220
驱动牛犊
驱动牛犊
  • 注册日期2004-01-19
  • 最后登录2010-12-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于: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去打开文件读取文件和关闭文件,不过好象很难,不会,但这些都有可能存在文件共享冲突,所以不一定总能成功
Hero2004
驱动牛犊
驱动牛犊
  • 注册日期2004-08-06
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-08-06 22:25
我好象是有同样的问题
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-12-09 14:18
我也来顶一把
aethercat
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2005-06-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-12-10 15:14
可以自行构造IRP直接向下层读数据,不必使用ZwReadFile
上一页
游客

返回顶部