阅读:1583回复:7
IRP_MJ_CLOSE中使用线程技术无法避免重入??
我使用楚狂人教程中的线程技术避免重入,在CREATE中工作良好,但是在CLOSE中,当我自己线程中的代码执行到ZwClose时,系统就没有下文了,好像是ZwClose从来没有返回一样。
查了一下微软官方的文档,有一篇上面说:Unlike IRP_MJ_CREATE and IRP_MJ_CLEANUP requests, an IRP_MJ_CLOSE request does not arrive in the context of the caller. 那也就是说我不能仅用PsGetCurrentThreadId() == Mythread->ThreadId的判断来避免重入了?? 好郁闷啊,搞了几天了,各位大侠帮帮忙啊! |
|
|
驱动小牛
|
沙发#
发布于:2007-12-06 11:23
首先,你要明确IRP_MJ_CLOSE并是和ZwClose是相对应的.ZwClose和IRP_MJ_CLEANUP相对应.当FileObject的引用计数减为一的时候会自动触发IRP_MJ_CLOSE.
对于重入的处理,还是要根据的实际情况进行分析,重入本身不会导致死锁,导致死锁的根本是资源互锁,只有你找到什么资源互锁,才能解决问题. |
|
驱动小牛
|
板凳#
发布于:2007-12-06 11:32
说错了,减为0时才发IRP_MJ_CLOSE
|
|
地板#
发布于:2007-12-06 11:42
但是我如果直接在我的CLOSE派遣函数中直接执行ZwClose(),确实会使系统堆栈溢出然后宕机;我调试了以后发现确实还是因为重入。但是当我把我的ZwClose()相关操作放入自己的线程中去做以后,系统没有宕,但是可能出现了你所说的资源互锁。
对了,想知道,ZwClose一定是需要一个对应的IRP_MJ_CLEANUP或一个对应的IRP_MJ_CLOSE被完成以后才会返回吗? 谢谢楼上大侠的指教! |
|
|
地下室#
发布于:2007-12-06 11:44
我之所以放在close的派遣函数里面,是因为我在跟踪写字板的读写文件时,似乎没有发现IRP_MJ_CLEANUP的irp啊,只有close。。。
|
|
|
驱动小牛
|
5楼#
发布于:2007-12-06 15:05
一个ZwClose会引起一个IRP_MJ_CLEANUP,如果是正常关闭就肯定有IRP_MJ_CLEANUP,IRP_CLOSE有可能是系统进程自动发起的.
|
|
驱动小牛
|
6楼#
发布于:2007-12-06 15:08
按你说的如果是当机,那就要分析DUMP文件
|
|
7楼#
发布于:2007-12-07 09:17
o(∩_∩)o...3ks Very much!!
|
|
|