2011年7月19日 星期二

Remove Lock

假設應用程式正在對我們的 driver 進行 I/O 要求, 有一個要求已經被分發處理, 還有許多要求正在佇列中等著, 此時 driver 也收到了 PnP manager 傳來的 surprise remove 或是 remove device 的要求, 準備移除 device object. 針對這樣的情況, 我們一定會想到要將佇列中的要求清除, 並且暫停接受任合要求(WdfIoQueuePurge), 我們也一定會想到要盡快完成那個正在處理中的要求, 但怎麼做呢?

事實上, 我們可能沒辦法盡快完成那個要求(如果執行緒正在 wait 的狀態), 只能等它被處理完, 但我們要怎麼確保在它被處理完之前, device object 不會先被移除, device extension 不會被釋放呢? WDK 針對這種情況, 提供了 Remove Lock, 只要幾個步驟就搞定:

  1. 在 EvtDeviceAdd 中初始化 Remove Lock (IoInitializeRemoveLock)
  2. 在 EvtIoDeviceControl 的開始處取得 Remove Lock (IoAcquireRemoveLock)
  3. 在 EvtIoDeviceControl 的最後釋放 Remove Lock (IoReleaseRemoveLock)
  4. 在 remove device 的要求中取得 RemoveLock (IoAcquireRemoveLock), 接著釋放並等待 lock count 為 0 (IoReleaseRemoveLockAndWait).
  5. 在 WDF driver 中, 可在 EvtDeviceSelfManagedIoFlush 中做步驟 4, 就不需要用到 great escape (EvtDeviceWdmIrpPreprocess) 了.


更多資訊:

沒有留言:

張貼留言