共用方式為


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 要求完成,每個驅動程式都應該呼叫 IoReleaseRemoveLockAndWait之後, 將移除 IRP 傳遞給下一個較低的驅動程式 ,並在 釋放記憶體之前,先呼叫 IoDetachDevice,或呼叫 IoDeleteDeviceIoReleaseRemoveLockAndWait 例程會等候公交車司機取消可能未完成的任何 IRP(例如,IRP_MN_WAIT_WAKE IRP)。

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

若要從 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