Partilhar via


Removendo um dispositivo no driver de função

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 :

  1. 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.

  2. 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.

  3. Se o driver ativou anteriormente o dispositivo para despertar, cancele o pedido IRP_MN_WAIT_WAKE.

  4. 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.

  5. 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.

  6. Desative todas as interfaces de dispositivo chamando IoSetDeviceInterfaceState.

  7. 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.

  8. 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.

  9. 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.

  10. Limpe todas as alocações específicas do dispositivo, memória, eventos e assim por diante.

  11. Liberte o FDO com IoDeleteDevice.

  12. 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.