Compartir a través de


Macro IoReleaseRemoveLockAndWait (wdm.h)

La rutina IoReleaseRemoveLockAndWait libera un bloqueo de eliminación que el controlador adquirió en una llamada anterior a IoAcquireRemoveLock y 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 la misma etiqueta al liberar el bloqueo.

Si la llamada a IoAcquireRemoveLock no especificó una etiqueta, este parámetro es NULL.

Valor devuelto

None

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 pasar el IRP al controlador inferior siguiente y antes de liberar memoria, llama a IoDetachDevice o 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 remove antes de llamar a IoReleaseRemoveLockAndWait. Normalmente, un controlador llama a IoAcquireRemoveLock al principio de su rutina DispatchPnp , antes de la instrucción switch. Como resultado, el bloqueo se adquiere para cada operación 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 envío de IRP_MN_REMOVE_DEVICE , use IoReleaseRemoveLock.

Después de llamar a IoReleaseRemoveLockAndWait para un bloqueo de eliminación determinado, se producirá un error 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 que IoReleaseRemoveLockAndWait vuelva, 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 el comprobador de controladores comprueba el controlador producirá una comprobación de errores.

Para obtener más información, consulte Uso de bloqueos de eliminación.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible a partir de Windows 2000.
Plataforma de destino Escritorio
Encabezado wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
Archivo DLL 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