Cancel 一個 pending 中的 Synchronous IRP
其實這個問題一直沒有發現,因為我的 Device 都會很快就回應這個 IRP 了啊,哪裡知道別人家的會跑到一半就死掉,然後這個 IRP 就不會被 Cancel 掉,接著系統就藍底白字....。
解決方法很簡單:
在 SendAndWaitUrb() 裡面,先設定 IRP 的 CompleteRoutine,然後在這個 CompleteRoutine 內,觸發 Event,並回傳 STATUS_MORE_PROCESSING_REQUIRED。接著只要在 KeWaitForSingleObject(Irp) 時 Timeout,就呼叫 IoCancelIrp(),然後再 KeWaitForSingleObject(Irp),IRP 就會被 Cancel 啦。
因為 Synchronous IRP 都是系統會回收,所以也不用呼叫 IoFreeIrp。
No comments:
Post a Comment