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.
Ao remover um dispositivo, um driver de função deve desfazer todas as operações que executou para adicionar e iniciar o dispositivo. Esta discussão inclui drivers de função para dispositivos periféricos e drivers de função para dispositivos de barramento.
Um driver de função remove um dispositivo usando um procedimento como o seguinte em sua rotina DispatchPnP :
Este é um controlador de função para um dispositivo de barramento?
Em caso afirmativo, possivelmente exclua todos os PDOs filhos pendentes para dispositivos no barramento.
Se o controlador do barramento lidou com uma solicitação anterior de IRP_MN_SURPRISE_REMOVAL para o dispositivo filho, mas ainda não recebeu a solicitação subsequente de IRP_MN_REMOVE_DEVICE, o controlador do barramento deixa o PDO do filho intacto. Em algum momento posterior, quando todas as referências ao dispositivo filho forem fechadas, o gestor PnP enviará o IRP de remoção para o dispositivo filho e o driver de barramento irá apagar o PDO filho naquele momento.
Se o controlador de barramento lidou com uma solicitação anterior de IRP_MN_REMOVE_DEVICE para o dispositivo e não houve nenhuma solicitação subsequente de IRP_MN_SURPRISE_REMOVAL, o controlador do barramento exclui o PDO do filho. Nesse caso, o gestor PnP garante que todos os drivers de função e de filtro foram removidos do dispositivo filho (FDO e DOs de filtro foram excluídos) antes de enviar um IRP de remoção para o dispositivo de barramento pai. O PDO criança ainda pode estar presente, pelo que o motorista de barramento deve excluir o PDO criança antes de remover o dispositivo de barramento.
O driver já processou um pedido anterior de IRP_MN_SURPRISE_REMOVAL para este FDO?
Em caso afirmativo, execute qualquer limpeza restante e pule para a etapa 8, IoCallDriver.
Um driver normalmente mantém um sinalizador na extensão do dispositivo que indica se o driver tiver manipulado uma solicitação IRP_MN_SURPRISE_REMOVAL para o dispositivo.
Se o driver ativou anteriormente o dispositivo para despertar, cancele o pedido IRP_MN_WAIT_WAKE.
Certifique-se de que o dispositivo está inativo.
Se o dispositivo ainda não estiver inativo em resposta a um IRP_MN_QUERY_REMOVE_DEVICE anterior, o driver deve marcar o dispositivo como não aceitando novas solicitações e deve processar todas as solicitações enfileiradas nesse driver. O driver deve rejeitar todas as solicitações pendentes que exijam acesso ao dispositivo.
Um driver pode usar as rotinas IoXxxRemoveLockXxx para contar E/S pendentes e definir um evento indicando que o processamento de remoção pode continuar.
Execute todas as operações de desligamento.
Cada driver para o dispositivo executa as suas operações de desligamento, se houver, quando recebe o pedido de IRP_MN_REMOVE_DEVICE. O responsável pela política de energia do dispositivo, geralmente o driver de função, não envia uma solicitação separada IRP_MN_SET_POWER para ajustar o estado de potência do dispositivo para D3. O controlador de barramento principal normalmente desliga o slot e notifica o gestor de energia com PoSetPowerState quando o controlador de barramento recebe o IRP de remoção. Para obter informações adicionais, consulte Gestão de Energia.
Desative todas as interfaces de dispositivo chamando IoSetDeviceInterfaceState.
Liberte quaisquer recursos de hardware para o dispositivo em uso pelo driver.
As operações exatas dependem do dispositivo e do driver, mas podem incluir desconectar uma interrupção com IoDisconnectInterrupt, liberar intervalos de endereços físicos com MmUnmapIoSpace e liberar portas de E/S.
Passe a solicitação de IRP_MN_REMOVE_DEVICE para o próximo driver.
Configure o posicionamento da pilha IRP para o próximo driver mais baixo com IoSkipCurrentIrpStackLocation e passe o IRP para o próximo driver com IoCallDriver.
Um driver não é obrigado a esperar que os drivers subjacentes terminem as suas operações de remoção antes de continuar com as suas próprias atividades de remoção.
Remova o objeto de dispositivo da pilha de dispositivos utilizando IoDetachDevice.
Especifique um ponteiro para o próximo objeto de dispositivo inferior como o parâmetro TargetDevice . O driver recebe esse ponteiro da chamada para IoAttachDeviceToDeviceStack na rotina AddDevice do driver.
Limpe todas as alocações específicas do dispositivo, memória, eventos e assim por diante.
Liberte o FDO com IoDeleteDevice.
Retorno da rotina DispatchPnP, propagando o status de retorno de IoCallDriver.
Um driver de função não especifica uma rotina IoCompletion para um IRP de remoção, nem completa o IRP. As remoções de IRPs são concluídas pelo controlador do barramento principal.