事實上, 我們可能沒辦法盡快完成那個要求(如果執行緒正在 wait 的狀態), 只能等它被處理完, 但我們要怎麼確保在它被處理完之前, device object 不會先被移除, device extension 不會被釋放呢? WDK 針對這種情況, 提供了 Remove Lock, 只要幾個步驟就搞定:
- 在 EvtDeviceAdd 中初始化 Remove Lock (IoInitializeRemoveLock)
- 在 EvtIoDeviceControl 的開始處取得 Remove Lock (IoAcquireRemoveLock)
- 在 EvtIoDeviceControl 的最後釋放 Remove Lock (IoReleaseRemoveLock)
- 在 remove device 的要求中取得 RemoveLock (IoAcquireRemoveLock), 接著釋放並等待 lock count 為 0 (IoReleaseRemoveLockAndWait).
- 在 WDF driver 中, 可在 EvtDeviceSelfManagedIoFlush 中做步驟 4, 就不需要用到 great escape (EvtDeviceWdmIrpPreprocess) 了.
更多資訊:
沒有留言:
張貼留言