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 之前获取删除锁。 通常,驱动程序在 Switch 语句之前在其 DispatchPnp 例程中提前调用 IoAcquireRemoveLock。 因此,会为每个 PnP 操作获取锁,包括在处理IRP_MN_REMOVE_DEVICE的代码中调用 IoReleaseRemoveLockAndWait 之前所需的 获取

若要从 IRP_MN_REMOVE_DEVICE 调度代码以外的代码中释放锁,请使用 IoReleaseRemoveLock

为特定的删除锁调用 IoReleaseRemoveLockAndWait 后,对同一删除锁的 IoAcquireRemoveLock 的后续调用将失败。 IoReleaseRemoveLockAndWait 在释放所有未完成的删除锁购置之前不会返回。

IoReleaseRemoveLockAndWait 返回后,驱动程序应将设备视为处于可以删除且无法执行 I/O 操作的状态。 因此,驱动程序不得调用 IoInitializeRemoveLock 例程来重新初始化删除锁。 驱动程序验证程序验证驱动程序时违反此规则将导致 bug 检查。

有关详细信息,请参阅 使用删除锁

要求

要求
最低受支持的客户端 从 Windows 2000 开始可用。
目标平台 桌面
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library 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