阅读:1365回复:0
遇到bulkusb无法卸载的问题
最近公司开发一个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 |
|