lver0929
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望40点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
阅读:1927回复:11

我该怎么办,调试USB时操作系统挂起

楼主#
更多 发布于:2007-10-09 10:08
我的应用程序和USB硬件传输数据的时候,每当传输不成功的时候(DeviceIoControl没有返回,而不是返回失败),一将USB线拔掉或者reset USB设备,操作系统就会挂起,鼠标、键盘都不响应,这时就只能通过断电来重启机子。
请问有没有谁碰到过这种问题?该如何解决?谢谢
oushengfen
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分747分
  • 威望124点
  • 贡献值1点
  • 好评度82点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-10-09 14:38
你写的驱动有问题吧
Apocalypse
驱动牛犊
驱动牛犊
  • 注册日期2003-04-28
  • 最后登录2007-10-24
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-10-09 15:12
好像你没有说系统除了键鼠以外是否正常运作,大概你的键盘和鼠标也是USB口的,换ps/2口的键鼠试试
还有可能是因为共用一个usb root hub,你的设备把状态搞乱了?分开用不同的usb root hub 试试?
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-10-09 20:50
驱动里对cancel irp进行处理呢,好像要写个回调函数吧
张帆的内核学习论坛 http://bbs.kerneldev.com
lver0929
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望40点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-10 11:40
驱动我去年用了一年,一直没有这个现象。以前应用程序如果从USB硬件读不到数,拔掉USB线DeviceIoControl就返回FALSE,而现在一拔线PC就挂起了,DeviceIoControl没有返回;
我的鼠标是USB的,键盘是ps2的,机子挂起之后所有硬件都没有响应,但是softice可以打开;
请问各位,有没有可能是硬件的问题?
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
5楼#
发布于:2007-10-10 11:49
用户被禁言,该主题自动屏蔽!
lver0929
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望40点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-10-10 12:09
谢谢楼上的同学
确实,在DeviceIoControl pending的时候,我没有取消这个请求。但我觉得如果USB线拔掉了,那么此时的USB设备就不存在,DeviceIoControl 便会返回FALSE,系统不应该会挂起啊
欢迎讨论
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-10 12:16
设置一个定时器,如果timout,就如下

    Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
    Irp->IoStatus.Information = info;
    IoCompleteRequest(Irp,IO_NO_INCREMENT);
张帆的内核学习论坛 http://bbs.kerneldev.com
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
8楼#
发布于:2007-10-10 12:40
用户被禁言,该主题自动屏蔽!
lver0929
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望40点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-10-10 15:52
多谢楼上的几位朋友
我的想法是看能不能不修改驱动,因为同样的程序操作两个不同的硬件,一个运行正常,一个就出现了上述的现象
当然,驱动还是存在一些问题,比如在传输的时候没有timeout处理等;但是,由于驱动不是我写的,虽然有源码,贸然修改怕出现意想不到的结果,所以我想在硬件和应用程序方面修改,尽量避免上述问题的现象,不知弟兄们有没有好的建议?
fanzi
驱动小牛
驱动小牛
  • 注册日期2004-12-09
  • 最后登录2013-12-19
  • 粉丝1
  • 关注0
  • 积分1004分
  • 威望754点
  • 贡献值0点
  • 好评度93点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-10-10 16:18
用overlap操作这个设备,但我怀疑你的驱动没有支持,呵呵。
如果支持,可以在应用程序做个定时器,超时就
CancelIo(yourhandle);
张帆的内核学习论坛 http://bbs.kerneldev.com
lver0929
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2008-07-21
  • 粉丝0
  • 关注0
  • 积分355分
  • 威望40点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-10-10 17:36
呵呵,确实,驱动里面没有做Cancel IRP,所以CancelIo()可能会不起作用
顺便问下:softice内有没将硬件重枚举或类似于强制CancelIo()的命令?
游客

返回顶部