使用IO_REMOVE_LOCK刪除鎖(一)
阿新 • • 發佈:2019-02-08
刪除鎖例程提供了追蹤一個裝置上未解決的IO操作的數目,決定安全解除安裝驅動裝置物件時機的方法。
驅動可以以以下兩個目的使用刪除鎖:
1.保持刪除鎖,令驅動的DispatchPNP例程不能完成IRP_MN_REMOVE_DEVICE。
2.獲取驅動不能刪除裝置物件的原因數量,並在此數量變為0時,設定事件
使用方法:
1. 在裝置物件的Device_Extension中分配IO_REMOVE_LOCK結構成員,並呼叫IoInitializeRemoveLock.
一般在AddDevice例程中初始化Device_Extension呼叫IoInitializeRemoveLock.
2.在每次開始I/O操作前呼叫 IoAcquireRemoveLock,結束I/O操作後呼叫IoReleaseRemoveLock,驅動 可以多次獲取IO_REMOVE_LOCK,呼叫IoAcquireRemoveLock增加使用計數,呼叫IoReleaseRemoveLock減少使用計數。3.當處理一個裝置刪除請求 (IRP_MN_REMOVE_DEVICE) 時,驅動程式呼叫 IoReleaseRemoveLockAndWait
來釋放在其 DispatchPnP 例程中獲取的刪除鎖。這個呼叫直到與刪除鎖關聯的引用計數達到零時才返回,
表示刪除鎖的所有其他持有者都已經被釋放。為了完成排隊的I/O操作,應在向下層裝置遞IRP_MN_REMOV E_DEVICE前呼叫IoReleaseRemoveLockAndWait。 4.由於IO_REMOVE_LOCK在Device_Extension,在處理IRP_MN_REMOVE_DEVICE時刪除Device_Extension 的同 時,就刪除了IO_REMOVE_LOCK。 相關函式:IoInitializeRemoveLock IoAcquireRemoveLock IoReleaseRemoveLock IoReleaseRemoveLockAndWait