阅读:2602回复:17
程序死在DeviceIoControl!!--50分
各位站友:现有个难题我不知道该怎么解决。
我用DriverWorks写了一个PCI卡的驱动,运行了很久一段时间都没有问题。现在有个现象难以解释。 驱动程序中有3个端口写函数,都是通过DeviceIoControl来完成的,其中一个端口用的非常频繁,基本上每20毫秒写一次。应用程序单线程对该端口进行操作,没有问题。但是如果多个线程同时操作,就发现程序会死在DeviceIoControl这个函数上,该函数是给驱动发送写端口命令的。该函数没有返回引起应用程序死掉,但是它也没有给驱动程序发送IOCtrl。如果将应用程序退出,在进入,驱动仍然是运行的很好的。也就是说这个问题放映在应用程序上,不知道是否会是驱动程序的问题? 有没有站友遇到过类似问题,不吝赐教!一定给分! |
|
沙发#
发布于:2004-01-05 23:08
可能没处理好同步的问题,建议SOFTICE调试看看。。。。。
|
|
|
板凳#
发布于:2004-01-06 08:13
各位站友:现有个难题我不知道该怎么解决。 你的DeviceIoControl发送的是同步请求吧?多线程的时候最好试试异步请求。. |
|
|
地板#
发布于:2004-01-06 08:27
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2004-01-06 08:28
IoCtrl的同步应该没有什么问题,所有的端口访问的IRQ都序列化的。如果这个出错,我想应该是蓝屏而不是应用程序关闭后再次运行又可以进行操作了。
我的DeviceIoControl是同步的,我想问问这样的现象是什么问题引起的呢? 多谢! |
|
5楼#
发布于:2004-01-06 15:11
谁能给我一个解释!真的迷糊啊
|
|
6楼#
发布于:2004-01-06 17:51
加mutex
|
|
7楼#
发布于:2004-01-07 16:29
我加了CCriticalSection 进行保护,仍然不行,不知道为什么。Mutex的原理应该是相同的。
|
|
论坛版主
|
8楼#
发布于:2004-01-07 19:23
你发下去的IOCTL是什么命令?通知设备读端口数据?看看是不是总线太忙导致请求不能及时同步返回
|
|
9楼#
发布于:2004-01-08 14:58
我的IOCTRL是去写端口的,这个端口操作非常频繁。有可能总线会太忙,但是DeviceIoControl函数都没有返回,驱动也没有接收到相应的IRP。应用程序死在执行DeviceIoControl这个函数上。这样应该怎么解决?
|
|
10楼#
发布于:2004-01-09 09:01
你试试将请求发下去后直接完成irp返回,也就是不读写端口。如果还死那就是应用程序的原因了,反之就是驱动。不过应用程序的可能性大些,比如同步,多线程的同步马虎不得
|
|
|
11楼#
发布于:2004-01-09 11:29
我现在将DeviceIoControl改成异步之后,程序就不死了,请问这是什么问题?不得其解。
|
|
论坛版主
|
12楼#
发布于:2004-01-09 11:34
你说IRP没有发到驱动,你怎么判断出来的?如果下层不IOCOMPLETEREQUEST的话DEVICEIOCONTROL确实是阻塞的,即使你的OVERLAPPED给的是NULL,你看看下层执行情况,为什么没有返回到上层。
|
|
13楼#
发布于:2004-01-09 12:14
当DeviceIoControl用同步的时候,我用DriverMonitor看我的驱动trace的信息,没有进入IOCTRL执行函数,上层DeviceIoControl也没有返回。IOCTRL函数中对IRP都是Complete的。我猜测是根本没有发IRP到驱动。因为结束应用程序后再执行应用程序,驱动一点问题都没有。但是为什么同步的IOCTRL会引起这样的问题?
|
|
论坛版主
|
14楼#
发布于:2004-01-09 20:56
我提一个问题,你说的DEVICEIOCONTROL同步异步分别指的是什么?
|
|
15楼#
发布于:2004-01-13 08:30
同步的IOCTRL:DeviceIoControl函数执行后要等待驱动相应的IoCtrl函数执行完毕后才可以返回。异步IOCTRL:DeviceIoControl函数执行后,不管驱动的IoCtrl有没有返回,都直接返回Pending。
|
|
论坛版主
|
16楼#
发布于:2004-01-13 21:36
你指的是在驱动的IOCTRL的处理例程里面的动作?
|
|
17楼#
发布于:2004-01-13 21:52
不是,指的应用程序发起的DeviceIoControl函数
|
|