1. 程式人生 > >使用IO_REMOVE_LOCK刪除鎖(一)

使用IO_REMOVE_LOCK刪除鎖(一)

    刪除鎖例程提供了追蹤一個裝置上未解決的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