Macro IoReleaseRemoveLockAndWait (wdm.h)

La rutina IoReleaseRemoveLockAndWa it libera un bloqueo de eliminación que el controlador adquirió en una llamada anterior a IoAcquireRemoveLocky espera hasta que se hayan liberado todas las adquisiciones del bloqueo.

Sintaxis

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

Parámetros

[in] RemoveLock

Puntero a una estructura de IO_REMOVE_LOCK que el autor de la llamada pasó en una llamada anterior a IoAcquireRemoveLock.

[in] Tag

Puntero a una etiqueta proporcionada por el autor de la llamada que se pasó en una llamada anterior a IoAcquireRemoveLock.

Si un controlador especificó una etiqueta cuando adquirió el bloqueo, el controlador debe especificar el mismo etiqueta al liberar el bloqueo.

Si la llamada a ioAcquireRemoveLock no especificó un Tag, este parámetro es NULL.

Valor devuelto

Ninguno

Observaciones

Normalmente, un controlador llama a esta rutina en su código de envío para una solicitud de IRP_MN_REMOVE_DEVICE. Para permitir que se completen las solicitudes de E/S en cola, cada controlador debe llamar a IoReleaseRemoveLockAndWaitdespués de pasa el IRP de eliminación al controlador inferior siguiente y antes de libera memoria, llama a IoDetachDeviceo llama a IoDeleteDevice. La rutina IoReleaseRemoveLockAndWait espera a que el controlador de autobús cancele los IRP que puedan estar pendientes (por ejemplo, un IRP de IRP_MN_WAIT_WAKE).

Un controlador debe adquirir el bloqueo de eliminación antes de llamar a IoReleaseRemoveLockAndWait. Normalmente, un controlador llama a ioAcquireRemoveLock temprano en su rutina de DispatchPnp, antes de la instrucción switch. Como resultado, el bloqueo se adquiere para cada operación de PnP, incluida la adquisición necesaria antes de llamar a IoReleaseRemoveLockAndWait en el código que controla IRP_MN_REMOVE_DEVICE.

Para liberar un bloqueo del código distinto del código de distribución de IRP_MN_REMOVE_DEVICE, use IoReleaseRemoveLock.

Después de llamar a ioReleaseRemoveLockAndWait para un bloqueo de eliminación determinado, se producirán errores en las llamadas posteriores a IoAcquireRemoveLock para el mismo bloqueo de eliminación. ioReleaseRemoveLockAndWait no devuelve hasta que se hayan liberado todas las adquisiciones pendientes del bloqueo de eliminación.

Después de ioReleaseRemoveLockAndWait devuelve, el controlador debe considerar que el dispositivo está en un estado en el que está listo para quitarse y no puede realizar operaciones de E/S. Por lo tanto, el controlador no debe llamar a la rutina IoInitializeRemoveLock para volver a inicializar el bloqueo de eliminación. La infracción de esta regla mientras comprobador del controlador producirá una comprobación de errores.

Para obtener más información, vea Using Remove Locks.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 2000.
de la plataforma de destino de Escritorio
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL PASSIVE_LEVEL
reglas de cumplimiento de 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)

Consulte también

DispatchPnp

IRP_MN_WAIT_WAKE

ioAcquireRemoveLock

IoDeleteDevice

ioDetachDevice

ioInitializeRemoveLock

ioReleaseRemoveLock