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。

Sunday, May 27, 2007

C# 越來越鳥了 (2)

http://dotnetjunkies.com/WebLog/johnwood/archive/2005/08/31/132267.aspx Thread 不能存取 Component 的原因竟然是:Windows Forms 的元件不是 Thread-Safe。我被打敗了,微軟是越混越回去了嗎?我記得 MFC 沒有這限制啊(還是它有但是我沒遇到....)。可是你搞出一套 GUI component 卻因為它不是 Thread-Safe,然後只好在別的 Thread 存取它時丟出一個 Exception,說不能這樣作,這...這....會不會太不負責任了點?

Friday, May 25, 2007

C# 越來越鳥了

我知道我不想看那麼多文件,但是它的限制好多啊....。連 Control 產生的 Thread 都沒辦法使用這個 Control 內的任何元件,這....這....我記得 Java 沒這個限制啊。根據 MS 的說法,它是怕這樣會有兩個 Thread 去存取這個元件,導致該元件的狀態不一致,可是我沒差啊,又不會死,結果 C# 就說這樣不行,去你的。結果要達成目的的話,得多寫好多 code,這樣不是本末倒置嗎? 好吧,Thread 不能存取 Control 內的元件,那我在 Control 內用 Timer 總可以了吧?結果要搞定一個 Timer 還真是麻煩,這又牽涉到 Delegate 的方式,偏偏我對 Delegate 不熟,這樣又不能馬上用,真是自己找麻煩...。 看來得找個時間好好把 C# 的 Delegate 架構給搞清楚了。

codeblock