共用方式為


IoReleaseRemoveLockAndWait 宏 (wdm.h)

IoReleaseRemoveLockAndWait 例程會釋放驅動程式在先前呼叫 IoAcquireRemoveLock 中取得的移除鎖定,並等到所有取得的鎖定都釋放為止。

語法

void IoReleaseRemoveLockAndWait(
  [in]  RemoveLock,
  [in]  Tag
);

參數

[in] RemoveLock

呼叫者在先前呼叫IoAcquireRemoveLock中傳遞之IO_REMOVE_LOCK結構的指標。

[in] Tag

在先前呼叫 IoAcquireRemoveLock 中傳遞之呼叫端提供的標籤指標。

如果驅動程式在取得鎖定時指定 Tag ,則驅動程式必須在釋放鎖定時指定相同的 Tag

如果 對 IoAcquireRemoveLock 的呼叫未指定 Tag,則此參數為 NULL

傳回值

備註

驅動程式通常會在其分派程式代碼中呼叫此例程,以取得 IRP_MN_REMOVE_DEVICE 要求。 若要允許佇列 I/O 要求完成,每個驅動程式都應該在將移除 IRP 傳遞至下一個較低的驅動程序之後呼叫 IoReleaseRemoveLockAndWait,並在釋放記憶體之前呼叫 IoDetachDevice 或呼叫 IoDeleteDeviceIoReleaseRemoveLockAndWait 例程會等候總線驅動程式取消任何可能未完成 (的 IRP,例如IRP_MN_WAIT_WAKE IRP) 。

驅動程式必須先取得移除鎖定,才能呼叫 IoReleaseRemoveLockAndWait。 一般而言,驅動程式會在其 DispatchPnp 例程中早期呼叫 IoAcquireRemoveLock,再呼叫 switch 語句。 因此,系統會針對每個 PnP 作業取得鎖定,包括在處理IRP_MN_REMOVE_DEVICE的程式代碼中呼叫 IoReleaseRemoveLockAndWait 之前所需的擷取。

若要從 IRP_MN_REMOVE_DEVICE 分派程序代碼以外的程式代碼釋放鎖定,請使用 IoReleaseRemoveLock

針對特定移除鎖定呼叫 IoReleaseRemoveLockAndWait 之後,相同移除鎖定的 IoAcquireRemoveLock 後續呼叫將會失敗。 IoReleaseRemoveLockAndWait 在解除移除鎖定的所有未完成取得之前不會傳回。

IoReleaseRemoveLockAndWait 傳回之後,驅動程式應該將裝置視為處於已準備好移除的狀態,且無法執行 I/O 作業。 因此,驅動程式不得呼叫 IoInitializeRemoveLock 例程來重新初始化移除鎖定。 驅動程式 驗證器 正在驗證驅動程式時違反此規則,將會導致錯誤檢查。

如需詳細資訊,請參閱 使用移除鎖定

規格需求

需求
最低支援的用戶端 從 Windows 2000 開始提供。
目標平台 桌面
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 IoReleaseRemoveLockAndWaitOutsideRemoveDevice (wdm) RemoveLock (wdm) RemoveLockCheck (wdm) RemoveLockMnRemove (wdm) RemoveLockMnRemove2 (wdm) RemoveLockReleaseCleanup (wdm) RemoveLockReleaseClose (wdm) RemoveLockReleaseCreate (wdm) RemoveLockReleaseDeviceControl (wdm) RemoveLockReleaseInternalDeviceControl (wdm) RemoveLockReleasePower (wdm) RemoveLockReleaseRead (wdm) RemoveLockReleaseShutdown (wdm) RemoveLockReleaseSystemControl (wdm) RemoveLockReleaseWrite (wdm)

另請參閱

DispatchPnp

IRP_MN_WAIT_WAKE

IoAcquireRemoveLock

IoDeleteDevice

IoDetachDevice

IoInitializeRemoveLock

IoReleaseRemoveLock