Wednesday, May 30, 2007

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:

codeblock