shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1386回复:14

为什么我的驱动跑一会儿就死了?请指教!

楼主#
更多 发布于:2004-02-16 10:12
我现在的程序是在2000下用2000ddk+DirverStudio开发的usb驱动,在2000下跑没有问题,在大多数98下也没问题,但有一台98出了问题(运行一会儿没有反映了),跟了一下,是调的DeviceIoControl函数一直没有返回,应该是驱动里的问题。但为什么刚开始运行没有问题,跑一会儿就不行了?谁指点一下啊!
pengenwen
禁止发言
禁止发言
  • 注册日期2003-03-07
  • 最后登录2016-04-11
  • 粉丝0
  • 关注0
  • 积分1586分
  • 威望8380点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-16 10:21
用户被禁言,该主题自动屏蔽!
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-16 10:34
固件有反映,缓冲区里的数据发完就停下了,但由于DeviceIoControl函数一直不返回,新的数据发不过去。
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-02-16 10:50
奇怪的是同一台机器,98下跑一会儿就死了,我装上2000在上面跑就没事(跑了10多天都一切正常),我怎么也没搞明白,用softice调,里面的好多汇编又不懂,哎
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-02-16 11:17
奇怪的是同一台机器,98下跑一会儿就死了,我装上2000在上面跑就没事(跑了10多天都一切正常),我怎么也没搞明白,用softice调,里面的好多汇编又不懂,哎


softice可以进行源代码调试,使用debug版本的驱动,然后把驱动load后打开softice,用file [文件名]就可以打开你的源文件。
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-02-16 11:51
我是用的check版本调的,用softice open了sys文件,translate再load,可以调试,主要是我比较菜,汇编不怎么懂,跟进去就发懵了。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-02-16 12:20
你不要跟汇编呀,用file命令打开源文件,在源文件需要调试的地方用f9设置端点,用f8和单步执行来调试,如果想跳过函数用f10.
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-02-16 13:10
好的,谢谢,我再调调看
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-02-16 13:46
调了一下,还是调不出来。

请问驱动程序里面哪些地方会影响到api函数DeviceIoControl的执行啊?为什么刚开始好好的(DeviceIoControl马上就能返回),过一段时间DeviceIoControl这个函数就不返回了?

谢过大家了
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-02-16 19:57
估计原因是设备边没有数据传上来!
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-02-17 08:55
没有数据传上来该怎么办呢?
各位大虾救命啊,这个问题困扰我好久了。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-02-17 17:06
看看你设备边的数据源是怎么回事呀!
例如ad采集的数,看过一阵子是否数据就没有了
如果是其他期间传过来的数看你的时序控制是不是对
你的判断条件是不是对。
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-02-18 17:01
我知道了
98下最好应该异步调用,
那除了在应用层改变同步调用到异步调用,驱动程序中是不是也要做改动?

以下是Walter Oney 在大作中提到的:


********************************************************
Windows 98兼容问题

--------------------------------------------------------------------------------

Windows 98从不发出IRP_MN_SURPRISE_REMOVAL请求。因此,WDM驱动程序需要把非正常的IRP_MN_REMOVE_DEVICE请求当做意外删除设备。本章介绍的代码例子考虑到了这一点,如果遇到这样的IRP它将调用AbortRequests和StopDevice。

Windows 98在调用IoReportTargetDeviceChange函数时会失败并返回STATUS_NOT_IMPLEMENTED。并且它根本就没有输出IoReportTargetDeviceChangeAsynchronous函数;因此调用该函数的驱动程序不能装到Windows 98中。参考附录A,查看如何解决这个问题以及其它不支持函数的问题。

**(关键!)Windows 98的结构不允许以内核模式阻塞方式来等待用户模式程序完成任务**。这个事实使我难于把我的USB例子驱动程序(USBINT)连接起来。该例子驱动程序的test程序打开一个句柄并发出一个异步DeviceIoControl调用。如果你现在拔掉设备,你想会发生什么:驱动程序将收到一个IRP_MN_SURPRISE_REMOVAL,而它将取消未处理的DeviceIoControl。test程序然后关闭其句柄。这时,我们再回到驱动程序这边看看,REMOVE_DEVICE处理程序将被阻塞在IoReleaseRemoveLockAndWait调用上。当IRP_MJ_CLOSE到来时,驱动程序将释放最后获得的自旋锁并允许设备删除处理。这个过程在Windos 2000上进行得很好,但在Windows 98中会挂起,因为test程序没有运行的机会,因此也就不会关闭其句柄。(Windows 98没有SURPRISE_REMOVAL,但我们得到的REMOVE_DEVICE可以起到同样的作用) 利用QUERY_REMOVE的代码将不会挂起系统。所以,如果你的设备可以被用户热拔插,那么在Windows 98中,如果你有一个打开的句柄,就不要再获取删除自旋锁。
 
gmmxrr
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-02-19 09:03
我在WIN2000下也发现调的DeviceIoControl函数一直没有返回的现象。此时我强行把USB设备拔下后,USB操作的线程怎么也终止不了,必须重新启动计算机才行。
shuzhibuaa
驱动牛犊
驱动牛犊
  • 注册日期2004-02-16
  • 最后登录2004-05-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-02-19 13:15
2000下应该都能返回吧?那可能是驱动里有问题
游客

返回顶部