hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2602回复:17

程序死在DeviceIoControl!!--50分

楼主#
更多 发布于:2004-01-05 23:00
各位站友:现有个难题我不知道该怎么解决。
我用DriverWorks写了一个PCI卡的驱动,运行了很久一段时间都没有问题。现在有个现象难以解释。
驱动程序中有3个端口写函数,都是通过DeviceIoControl来完成的,其中一个端口用的非常频繁,基本上每20毫秒写一次。应用程序单线程对该端口进行操作,没有问题。但是如果多个线程同时操作,就发现程序会死在DeviceIoControl这个函数上,该函数是给驱动发送写端口命令的。该函数没有返回引起应用程序死掉,但是它也没有给驱动程序发送IOCtrl。如果将应用程序退出,在进入,驱动仍然是运行的很好的。也就是说这个问题放映在应用程序上,不知道是否会是驱动程序的问题?
有没有站友遇到过类似问题,不吝赐教!一定给分!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-01-05 23:08
可能没处理好同步的问题,建议SOFTICE调试看看。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
板凳#
发布于:2004-01-06 08:13
各位站友:现有个难题我不知道该怎么解决。
我用DriverWorks写了一个PCI卡的驱动,运行了很久一段时间都没有问题。现在有个现象难以解释。
驱动程序中有3个端口写函数,都是通过DeviceIoControl来完成的,其中一个端口用的非常频繁,基本上每20毫秒写一次。应用程序单线程对该端口进行操作,没有问题。但是如果多个线程同时操作,就发现程序会死在DeviceIoControl这个函数上,该函数是给驱动发送写端口命令的。该函数没有返回引起应用程序死掉,但是它也没有给驱动程序发送IOCtrl。如果将应用程序退出,在进入,驱动仍然是运行的很好的。也就是说这个问题放映在应用程序上,不知道是否会是驱动程序的问题?
有没有站友遇到过类似问题,不吝赐教!一定给分!
 


你的DeviceIoControl发送的是同步请求吧?多线程的时候最好试试异步请求。.
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-01-06 08:27
用户被禁言,该主题自动屏蔽!
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-01-06 08:28
IoCtrl的同步应该没有什么问题,所有的端口访问的IRQ都序列化的。如果这个出错,我想应该是蓝屏而不是应用程序关闭后再次运行又可以进行操作了。
我的DeviceIoControl是同步的,我想问问这样的现象是什么问题引起的呢?
多谢!
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-01-06 15:11
谁能给我一个解释!真的迷糊啊
mycookie
驱动小牛
驱动小牛
  • 注册日期2002-12-09
  • 最后登录2010-08-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-01-06 17:51
加mutex
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-01-07 16:29
我加了CCriticalSection 进行保护,仍然不行,不知道为什么。Mutex的原理应该是相同的。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-01-07 19:23
你发下去的IOCTL是什么命令?通知设备读端口数据?看看是不是总线太忙导致请求不能及时同步返回
根据地的兄弟们,团结就是力量
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-01-08 14:58
我的IOCTRL是去写端口的,这个端口操作非常频繁。有可能总线会太忙,但是DeviceIoControl函数都没有返回,驱动也没有接收到相应的IRP。应用程序死在执行DeviceIoControl这个函数上。这样应该怎么解决?
AthlonXP
驱动小牛
驱动小牛
  • 注册日期2003-05-11
  • 最后登录2010-01-20
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-01-09 09:01
你试试将请求发下去后直接完成irp返回,也就是不读写端口。如果还死那就是应用程序的原因了,反之就是驱动。不过应用程序的可能性大些,比如同步,多线程的同步马虎不得
AthlonXP是个好人,他一生没有欺压过同侪,没有背叛过朋友。从小到大,他都是个好孩子,没有出过什么差错,没有让家人师长担过心。虽然用一句时髦的话,他不善于"推销"自己,但是做学问扎扎实实,不会投机取巧;做工作也是一步一个脚印,不会敷衍塞责。他虽然是个大烟枪,偶尔也喝喝酒,但是没有什么见不得人的恶习。他花钱虽然不特别大方,可是也不吝啬。许多不如他的人,或幸或不幸,一般的也都成了家。可是为什么MM不喜欢他呢??
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-01-09 11:29
我现在将DeviceIoControl改成异步之后,程序就不死了,请问这是什么问题?不得其解。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-01-09 11:34
你说IRP没有发到驱动,你怎么判断出来的?如果下层不IOCOMPLETEREQUEST的话DEVICEIOCONTROL确实是阻塞的,即使你的OVERLAPPED给的是NULL,你看看下层执行情况,为什么没有返回到上层。
根据地的兄弟们,团结就是力量
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-01-09 12:14
当DeviceIoControl用同步的时候,我用DriverMonitor看我的驱动trace的信息,没有进入IOCTRL执行函数,上层DeviceIoControl也没有返回。IOCTRL函数中对IRP都是Complete的。我猜测是根本没有发IRP到驱动。因为结束应用程序后再执行应用程序,驱动一点问题都没有。但是为什么同步的IOCTRL会引起这样的问题?
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-01-09 20:56
我提一个问题,你说的DEVICEIOCONTROL同步异步分别指的是什么?
根据地的兄弟们,团结就是力量
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-01-13 08:30
同步的IOCTRL:DeviceIoControl函数执行后要等待驱动相应的IoCtrl函数执行完毕后才可以返回。异步IOCTRL:DeviceIoControl函数执行后,不管驱动的IoCtrl有没有返回,都直接返回Pending。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-01-13 21:36
你指的是在驱动的IOCTRL的处理例程里面的动作?
根据地的兄弟们,团结就是力量
hapi
驱动小牛
驱动小牛
  • 注册日期2002-03-08
  • 最后登录2007-09-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-01-13 21:52
不是,指的应用程序发起的DeviceIoControl函数
游客

返回顶部