Compartilhar via


Macro IoReleaseRemoveLockAndWait (wdm.h)

O IoReleaseRemoveLockAndWait libera um bloqueio de remoção que o driver adquiriu em uma chamada anterior para IoAcquireRemoveLock e aguarda até que todas as aquisições do bloqueio sejam liberadas.

Sintaxe

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

Parâmetros

[in] RemoveLock

Ponteiro para uma estrutura IO_REMOVE_LOCK que o chamador passou em uma chamada anterior para IoAcquireRemoveLock .

[in] Tag

Ponteiro para uma marca fornecida pelo chamador que foi passada em uma chamada anterior para IoAcquireRemoveLock.

Se um driver especificou uma marca quando adquiriu o bloqueio, o driver deverá especificar o mesmo Marca ao liberar o bloqueio.

Se a chamada para IoAcquireRemoveLock não especificou umde marca de , esse parâmetro será NULL.

Valor de retorno

Nenhum

Observações

Um driver normalmente chama essa rotina em seu código de expedição para uma solicitação de IRP_MN_REMOVE_DEVICE. Para permitir que as solicitações de E/S enfileiradas sejam concluídas, cada driver deve chamar IoReleaseRemoveLockAndWaitdepois de passar o IRP de remoção para o driver mais baixo e antes de liberar memória, chamar IoDetachDeviceou chamar IoDeleteDevice. O IoReleaseRemoveLockAndWait espera que o motorista do ônibus cancele todos os IRPs que possam estar pendentes (por exemplo, um IRP IRP_MN_WAIT_WAKE).

Um driver deve adquirir o bloqueio de remoção antes de chamar IoReleaseRemoveLockAndWait. Normalmente, um driver chama IoAcquireRemoveLock no início de sua rotina de DispatchPnp, antes da instrução switch. Como resultado, o bloqueio é adquirido para cada operação PnP, incluindo a aquisição necessária antes de chamar IoReleaseRemoveLockAndWait no código que manipula IRP_MN_REMOVE_DEVICE.

Para liberar um bloqueio do código diferente do código de expedição IRP_MN_REMOVE_DEVICE, use IoReleaseRemoveLock.

Depois que IoReleaseRemoveLockAndWait tiver sido chamado para um bloqueio de remoção específico, as chamadas subsequentes para IoAcquireRemoveLock para o mesmo bloqueio de remoção falharão. IoReleaseRemoveLockAndWait não retornará até que todas as aquisições pendentes do bloqueio de remoção tenham sido liberadas.

Depois que IoReleaseRemoveLockAndWait retorna, o driver deve considerar que o dispositivo está em um estado no qual ele está pronto para ser removido e não pode executar operações de E/S. Portanto, o driver não deve chamar a rotina IoInitializeRemoveLock para inicializar novamente o bloqueio de remoção. A violação dessa regra enquanto o driver está sendo verificado pelo Driver Verifier resultará em uma verificação de bug.

Para obter mais informações, consulte Usando Remover Bloqueios.

Requisitos

Requisito Valor
de cliente com suporte mínimo Disponível a partir do Windows 2000.
da Plataforma de Destino Área de trabalho
cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca NtosKrnl.lib
de DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
regras de conformidade 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 também

DispatchPnp

IRP_MN_WAIT_WAKE

IoAcquireRemoveLock

IoDeleteDevice

IoDetachDevice

IoInitializeRemoveLock

IoReleaseRemoveLock