IoReleaseRemoveLockAndWait 宏 (wdm.h)

IoReleaseRemoveLockAndWait 例程释放了在之前调用 IoAcquireRemoveLock中获取的驱动程序获取的删除锁,并等待所有获取锁。

语法

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

参数

[in] RemoveLock

指向调用方在上一次调用中传递给 IoAcquireRemoveLockIO_REMOVE_LOCK 结构的指针。

[in] Tag

指向在上一次调用中传递给 IoAcquireRemoveLock的调用方提供的标记的指针。

如果驱动程序在获取锁时指定了 标记,则驱动程序在释放锁时必须指定相同的 标记

如果调用 IoAcquireRemoveLock 未指定 标记,则此参数 NULL

返回值

没有

言论

驱动程序通常在其调度代码中为 IRP_MN_REMOVE_DEVICE 请求调用此例程。 若要允许排队的 I/O 请求完成,每个驱动程序应在 将删除 IRP 传递给下一个较低驱动程序后调用 IoReleaseRemoveLockAndWait,并在 它释放内存、调用 IoDetachDevice或调用 IoDeleteDevice之前 IoReleaseRemoveLockAndWait 例程等待总线驱动程序取消可能未完成的任何 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)
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)Remove RemoveLockReleaseInternalDeviceControl(wdm)RemoveLockReleasePower(wdm)RemoveLockReleaseRead(wdm)RemoveLockReleaseShutdown(wdm)RemoveLockReleaseSystemControl(wdm)RemoveLockReleaseWrite(wdm)

另请参阅

DispatchPnp

IRP_MN_WAIT_WAKE

IoAcquireRemoveLock

IoDeleteDevice

IoDetachDevice

IoInitializeRemoveLock

IoReleaseRemoveLock