Макрос IoReleaseRemoveLockAndWait (wdm.h)

Подпрограмма IoReleaseRemoveLockAndWait снимает блокировку, полученную драйвером при предыдущем вызове IoAcquireRemoveLock, и ожидает, пока не будут освобождены все приобретения блокировки.

Синтаксис

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

Параметры

[in] RemoveLock

Указатель на структуру IO_REMOVE_LOCK , которую вызывающий объект передал в предыдущем вызове IoAcquireRemoveLock.

[in] Tag

Указатель на тег, предоставленный вызывающим, который был передан в предыдущем вызове IoAcquireRemoveLock.

Если драйвер указал тег при получении блокировки, драйвер должен указать тот же тег при освобождении блокировки.

Если при вызове IoAcquireRemoveLock не был указан тег, этот параметр имеет значение NULL.

Возвращаемое значение

None

Remarks

Драйвер обычно вызывает эту подпрограмму в коде диспетчеризации для запроса IRP_MN_REMOVE_DEVICE . Чтобы разрешить выполнение запросов ввода-вывода в очереди, каждый драйвер должен вызывать IoReleaseRemoveLockAndWaitпосле передачи IRP удаления в драйвер следующего уровня ниже и перед освобождением памяти вызывает IoDetachDevice или вызывает IoDeleteDevice. Процедура IoReleaseRemoveLockAndWait ожидает, пока водитель автобуса отменит все невыполненные irp (например, IRP_MN_WAIT_WAKE IRP).

Драйвер должен получить блокировку удаления перед вызовом IoReleaseRemoveLockAndWait. Как правило, драйвер вызывает IoAcquireRemoveLock в начале своей подпрограммы DispatchPnp перед инструкцией switch. В результате блокировка получается для каждой операции PnP, включая приобретение, необходимое перед вызовом IoReleaseRemoveLockAndWait в коде , обрабатывающем IRP_MN_REMOVE_DEVICE.

Чтобы освободить блокировку из кода, отличного от кода отправки IRP_MN_REMOVE_DEVICE , используйте IoReleaseRemoveLock.

После вызова IoReleaseRemoveLockAndWait для определенной блокировки удаления последующие вызовы IoAcquireRemoveLock для той же блокировки удаления завершатся ошибкой. IoReleaseRemoveLockAndWait не возвращается до тех пор, пока не будут освобождены все непогашенные приобретения блокировки удаления.

После возврата IoReleaseRemoveLockAndWait драйвер должен считать, что устройство находится в состоянии, в котором оно готово к удалению и не может выполнять операции ввода-вывода. Поэтому драйвер не должен вызывать подпрограмму 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