Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
As rotinas de bloqueio de remoção fornecem uma forma de rastrear o número de operações de entrada/saída pendentes num dispositivo e determinar quando é seguro desanexar e excluir o objeto de dispositivo de um driver. O sistema fornece estas rotinas aos programadores de drivers como alternativa à implementação do seu próprio mecanismo de rastreio.
Um driver pode usar esse mecanismo para duas finalidades:
Para garantir que a rotina DispatchPnP do controlador não conclua um pedido IRP_MN_REMOVE_DEVICE enquanto o bloqueio é mantido (por exemplo, enquanto outra rotina do controlador está a aceder ao dispositivo).
Para contar o número de razões pelas quais o driver não deve excluir seu objeto de dispositivo e para definir um evento quando essa contagem for zero.
Para inicializar um bloqueio de remoção, um driver deve alocar uma estrutura IO_REMOVE_LOCK em sua extensão de dispositivo e, em seguida, chamar IoInitializeRemoveLock. Um driver normalmente chama IoInitializeRemoveLock em sua rotina AddDevice , quando o driver inicializa o restante da extensão de dispositivo para um objeto de dispositivo.
Seu driver deve chamar IoAcquireRemoveLock cada vez que inicia uma operação de E/S. O driver deve chamar IoReleaseRemoveLock cada vez que terminar uma operação de E/S. Um motorista pode adquirir o bloqueio mais de uma vez. As rotinas de remoção de bloqueio mantêm uma contagem das aquisições pendentes da fechadura. Cada chamada para IoAcquireRemoveLock incrementa a contagem e IoReleaseRemoveLock diminui a contagem.
Seu driver também deve chamar IoAcquireRemoveLock quando ele passar uma referência ao seu código (para temporizadores, DPCs, retornos de chamada e assim por diante). O driver deve chamar IoReleaseRemoveLock quando o evento retornar.
Em seu código de despacho para IRP_MN_REMOVE_DEVICE, o driver deve adquirir o bloqueio mais uma vez e, em seguida, chamar IoReleaseRemoveLockAndWait. Essa rotina não retorna até que todas as aquisições pendentes do bloqueio tenham sido liberadas. Para permitir que as operações de E/S em fila sejam concluídas, cada driver deve chamar IoReleaseRemoveLockAndWaitdepois de passar a solicitação de IRP_MN_REMOVE_DEVICE para o próximo driver inferior e, antes de liberar memória, chamar IoDetachDevice ou chamar IoDeleteDevice. Depois que IoReleaseRemoveLockAndWait tiver sido chamado para um bloqueio de remoção específico, todas as chamadas subsequentes para IoAcquireRemoveLock para o mesmo bloqueio de remoção falharão.
Depois que IoReleaseRemoveLockAndWait retorna, o driver deve considerar que o dispositivo está num estado em que esteja pronto para remoção e não possa realizar operações de E/S. Portanto, o driver não deve chamar IoInitializeRemoveLock para reinicializar o bloqueio de remoção. A violação desta regra enquanto o driver está a ser verificado pelo Verificador de Controlador resultará em uma verificação de erro.
Como um driver armazena uma estrutura IO_REMOVE_LOCK na extensão de dispositivo de um objeto de dispositivo, o remove lock é excluído quando o driver exclui a extensão de dispositivo durante o processamento de uma solicitação IRP_MN_REMOVE_DEVICE.