阅读:1386回复:14
为什么我的驱动跑一会儿就死了?请指教!
我现在的程序是在2000下用2000ddk+DirverStudio开发的usb驱动,在2000下跑没有问题,在大多数98下也没问题,但有一台98出了问题(运行一会儿没有反映了),跟了一下,是调的DeviceIoControl函数一直没有返回,应该是驱动里的问题。但为什么刚开始运行没有问题,跑一会儿就不行了?谁指点一下啊!
|
|
沙发#
发布于:2004-02-16 10:21
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2004-02-16 10:34
固件有反映,缓冲区里的数据发完就停下了,但由于DeviceIoControl函数一直不返回,新的数据发不过去。
|
|
地板#
发布于:2004-02-16 10:50
奇怪的是同一台机器,98下跑一会儿就死了,我装上2000在上面跑就没事(跑了10多天都一切正常),我怎么也没搞明白,用softice调,里面的好多汇编又不懂,哎
|
|
地下室#
发布于:2004-02-16 11:17
奇怪的是同一台机器,98下跑一会儿就死了,我装上2000在上面跑就没事(跑了10多天都一切正常),我怎么也没搞明白,用softice调,里面的好多汇编又不懂,哎 softice可以进行源代码调试,使用debug版本的驱动,然后把驱动load后打开softice,用file [文件名]就可以打开你的源文件。 |
|
5楼#
发布于:2004-02-16 11:51
我是用的check版本调的,用softice open了sys文件,translate再load,可以调试,主要是我比较菜,汇编不怎么懂,跟进去就发懵了。
|
|
6楼#
发布于:2004-02-16 12:20
你不要跟汇编呀,用file命令打开源文件,在源文件需要调试的地方用f9设置端点,用f8和单步执行来调试,如果想跳过函数用f10.
|
|
7楼#
发布于:2004-02-16 13:10
好的,谢谢,我再调调看
|
|
8楼#
发布于:2004-02-16 13:46
调了一下,还是调不出来。
请问驱动程序里面哪些地方会影响到api函数DeviceIoControl的执行啊?为什么刚开始好好的(DeviceIoControl马上就能返回),过一段时间DeviceIoControl这个函数就不返回了? 谢过大家了 |
|
9楼#
发布于:2004-02-16 19:57
估计原因是设备边没有数据传上来!
|
|
10楼#
发布于:2004-02-17 08:55
没有数据传上来该怎么办呢?
各位大虾救命啊,这个问题困扰我好久了。 |
|
11楼#
发布于:2004-02-17 17:06
看看你设备边的数据源是怎么回事呀!
例如ad采集的数,看过一阵子是否数据就没有了 如果是其他期间传过来的数看你的时序控制是不是对 你的判断条件是不是对。 |
|
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中,如果你有一个打开的句柄,就不要再获取删除自旋锁。 |
|
13楼#
发布于:2004-02-19 09:03
我在WIN2000下也发现调的DeviceIoControl函数一直没有返回的现象。此时我强行把USB设备拔下后,USB操作的线程怎么也终止不了,必须重新启动计算机才行。
|
|
14楼#
发布于:2004-02-19 13:15
2000下应该都能返回吧?那可能是驱动里有问题
|
|