weiwei0510
驱动牛犊
驱动牛犊
  • 注册日期2006-07-07
  • 最后登录2008-08-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1364回复:0

遇到bulkusb无法卸载的问题

楼主#
更多 发布于:2007-09-17 17:29
最近公司开发一个USB设备,因为传输要求简单,就直接使用了WDK中的bulkusb驱动。使用了一段事件,发现了一个比较郁闷的BUG,就是将设备突然拔出后,“有可能”导致整个USB总线无法使用(就是不管插什么USB设备上去,都认不出了),机器也没办法关机了。看了下系统加载的驱动列表,发现bulkusb驱动没有卸载掉。这个问题出现的几率不高,但是后果很严重。下面是通过DebugView抓取的调试信息,由于小弟才疏学浅,没有分析出什么名堂来。希望大牛们帮帮忙。




00006464    123.30419922    DpcRoutine - begins            DpcRoutine()
00006465    123.30420685    CanDeviceSuspend            |
00006466    123.30420685    Device is Idle                |
00006467    123.30421448    DpcRoutine - ends            DpcRoutine()

00006468    123.32209778    IdleRequestWorkerRoutine - begins    IdleRequestWorkerRoutine()    DpcRoutine()中建立的工作线程
00006469    123.32210541    CanDeviceSuspend            |
00006470    123.32211304    Device is idle                |
00006471    123.32211304    SubmitIdleRequest - begins        |------>SubmitIdleRequest()    这个例程中建立了一个IDLE IRP
00006472    123.32212067    CanDeviceSuspend            |    |            这里IRP的完成例程为IdleNotificationRequestComplete
00006473    123.32212830    Cancel the timers            |    |
00006474    123.32215118    SubmitIdleRequest - ends        |<------SubmitIdleRequest()
00006475    123.32215118    IdleRequestsWorkerRoutine - ends    IdleRequestWorkerRoutine()
    
00006476    124.20249176    IdleNotificationCallback - begins    IdleNotificationCallback()    USB hub调用了我们的回调例程    
00006477    124.20249939    IssueWaitWake - begins            |------>IssueWaitWake()        发送WAIT/WAKE IRP
00006478    124.20251465    BulkUsb_DispatchPower::            |    |---+    触发BulkUsb_DispatchPower()
00006479    124.20252228    BulkUsb_IoIncrement::2            |    |        1 ---> 2
00006480    124.20252991    IRP_MN_WAIT_WAKE::            |    |    
00006481    124.20252991    BulkUsb_IoDecrement::1            |    |        2 ---> 1
00006482    124.20253754    IssueWaitWake - ends            |<------IssueWaitWake()
00006483    124.20253754    IdleNotificationCallback::        |
00006484    124.20253754    BulkUsb_IoIncrement::2            |            1 ---> 2
00006485    124.20254517    BulkUsb_DispatchPower::            |---+    触发BulkUsb_DispatchPower()    完成例程是PoIrpCompletionFunc
00006486    124.20254517    BulkUsb_IoIncrement::3            |            2 ---> 3
00006487    124.20255280    HandleDeviceSetPower - begins        |    HandleDeviceSetPower()
00006488    124.20255280    Set request for device power state D2    |    |        D0 ---> D2
00006489    124.20256805    Current device power state D0        |    |
00006490    124.20256805    Removing power from the device        |    |
00006491    124.20256805    HoldIoRequests - begins            |    |------>HoldIoRequests()    建立了一个工作线程HoldIoRequestsWorkerRoutine()
00006492    124.20257568    HoldIoRequests - ends            |    |<------HoldIoRequests()
00006493    124.20257568    HandleDeviceSetPower - ends        |    HandleDeviceSetPower()
00006494    124.20258331    IdleNotificationCallback::waiting for the power irp to complete        线程暂停,等待set_power IRP的完成
00006495    124.20870972    HoldIoRequestsWorkerRoutine - begins    |    HoldIoRequestsWorkerRoutine()工作线程启动    
00006496    124.20871735    HoldIoRequestsWorkerRoutine::        |    |
00006497    124.20872498    BulkUsb_IoDecrement::2            |    |    3 ---> 2
00006498    124.20872498    HoldIoRequestsWorkerRoutine::        |    |
00006499    124.20873260    BulkUsb_IoDecrement::1            |    |    2 ---> 1  stopEvent触发
00006500    124.20873260    HoldIoRequestsWorkerRoutine::        |    |
00006501    124.20874023    BulkUsb_IoIncrement::2            |    |    1 ---> 2
00006502    124.20874023    HoldIoRequestsWorkerRoutine::        |    |    
00006503    124.20874786    BulkUsb_IoIncrement::3            |    |    2 ---> 3
                                        |    这里SET_POWER IRP继续向下传递 完成例程是FinishDevPoDnIrp()
00006504    124.28000641    FinishDevPoDnIrp - begins        |    |    完成例程FinishDevPoDnIrp()触发
00006505    124.28002167    updating cache..            |    |    |
00006506    124.28002930    FinishDevPoDnIrp::            |    |    |
00006507    124.28003693    BulkUsb_IoDecrement::2            |    |    |    3 ---> 2
00006508    124.28003693    FinishDevPoDnIrp - ends            |    |    FinishDevPoDnIrp()
                                    |    |
00006509    124.28004456    IdleNotificationCallback - ends        IdleNotificationCallback()
00006510    124.28007507    PoIrpCompletionFunc::                |    完成例程PoIrpCompletionFunc()触发
00006511    124.28007507    BulkUsb_IoDecrement::1                |    |    2 ---> 1
00006512    124.28008270    HoldIoRequestsWorkerRoutine - ends        HoldIoRequestsWorkerRoutine()
00006513    124.52498627    ///////////////////////////////////////////    
00006514    124.52499390    BulkUsb_DispatchPnP::    
00006515    124.52500153    BulkUsb_IoIncrement::2                1 ---> 2
00006516    124.52500916    CancelSelectSuspend - begins    
00006517    124.52500916    CanDeviceSuspend                CanDeviceSuspend()返回了false,所以OpenHandleCount不为0或者OutStandingIO不为1    
00006518    124.52500916    Device is not idle    
00006519    124.52501678    IdleNotificationRequestCompete - begins        SubmitIdleRequestIrp的完成例程触发,因为上面准备取消这个IRP
00006520    124.52503204    Idle irp completes with error::    
00006521    124.52503204    STATUS_CANCELLED    
00006522    124.52503204    IdleNotificationRequestComplete::        
00006523    124.52503967    BulkUsb_IoIncrement::3                2 ---> 3    这里再次送出一个SET_POWER的IRP,用于将电源状态恢复为D0
00006524    124.52503967    BulkUsb_DispatchPower::                这里转入了BulkUsb_DispatchPower()处理例程,用于将电源提升到D0
00006525    124.52504730    BulkUsb_IoIncrement::4                3 ---> 4
00006526    124.52504730    HandleDeviceSetPower - begins    
00006527    124.52505493    Set request for device power state D0    
00006528    124.52505493    Current device power state D2    
00006529    124.52505493    Adding power to the device    
00006530    124.52506256    HandleDeviceSetPower - ends    
00006531    124.52507019    Set the timer to fire DPCs    
00006532    124.52507019    IdleNotificationRequestCompete - ends    
00006533    124.52507019    IoCancelIrp returns TRUE    
00006534    124.52508545    CancelSelectSuspend frees the irp    
00006535    124.52508545    CancelSelectSuspend - ends    
00006536    124.52509308    IRP_MN_QUERY_DEVICE_RELATIONS    
00006537    124.52510071    BulkUsb_DispatchPnP::default::    
00006538    124.52510071    BulkUsb_IoDecrement::3                4 ---> 3
00006539    124.52510834    ///////////////////////////////////////////    
00006540    124.52510834    BulkUsb_DispatchPnP::    
00006541    124.52510834    BulkUsb_IoIncrement::4    
00006542    124.52511597    CancelSelectSuspend - begins    
00006543    124.52511597    CanDeviceSuspend    
00006544    124.52511597    Device is not idle    
00006545    124.52512360    CancelSelectSuspend - ends    
00006546    124.52512360    IRP_MN_QUERY_DEVICE_RELATIONS    
00006547    124.52513885    BulkUsb_DispatchPnP::default::    
00006548    124.52513885    BulkUsb_IoDecrement::3    
00006549    124.52515411    ///////////////////////////////////////////    
00006550    124.52515411    BulkUsb_DispatchPnP::    
00006551    124.52515411    BulkUsb_IoIncrement::4                    //这里的计数应该为2
00006552    124.52516174    CancelSelectSuspend - begins    
00006553    124.52516174    CanDeviceSuspend    
00006554    124.52516174    Device is not idle    
00006555    124.52516937    CancelSelectSuspend - ends    
00006556    124.52516937    IRP_MN_SURPRISE_REMOVAL    
00006557    124.52516937    HandleSurpriseRemoval - begins    
00006558    124.52517700    CancelWaitWake - begins    
00006559    124.52517700    WaitWakeCompletionRoutine - begins    
00006560    124.52519226    WaitWakeCompletionRoutine - ends    
00006561    124.52519226    WaitWakeCallback - begins    
00006562    124.52519989    CancelWaitWake - ends    
00006563    124.52519989    ProcessQueuedRequests - begins    
00006564    124.52520752    ProcessQueuedRequests - ends    
00006565    124.52592468    BulkUsb_AbortPipes - begins    
00006566    124.52592468    BulkUsb_AbortPipes - ends    
00006567    124.52622986    HandleSurpriseRemoval - ends    
00006568    124.52623749    BulkUsb_DispatchPnP::IRP_MN_SURPRISE_REMOVAL::    
00006569    124.52623749    BulkUsb_IoDecrement::3    
00006570    124.57241821    ///////////////////////////////////////////    
00006571    124.57242584    BulkUsb_DispatchPnP::    
00006572    124.57242584    BulkUsb_IoIncrement::4                    //这里的计数应该为2
00006573    124.57243347    IRP_MN_REMOVE_DEVICE    
00006574    124.57243347    HandleRemoveDevice - begins    
00006575    124.57244110    HandleRemoveDevice::    
00006576    124.57244110    BulkUsb_IoDecrement::3    
00006577    124.57245636    HandleRemoveDevice::    
00006578    124.57245636    BulkUsb_IoDecrement::2    

游客

返回顶部