Compartilhar via


Removendo um dispositivo em um driver de barramento

Ao remover um dispositivo filho (PDO filho), o motorista do barramento pai deve desfazer todas as operações executadas para adicionar e iniciar o dispositivo.

Um motorista de ônibus remove um dispositivo filho com um procedimento como o seguinte em sua rotina DispatchPnP :

  1. O driver lidou com uma solicitação de IRP_MN_SURPRISE_REMOVAL anterior para esse PDO?

    Nesse caso, execute qualquer limpo restante e pule para a etapa 4.

    Um driver normalmente mantém um sinalizador na extensão do dispositivo que indica se o driver lidou com uma solicitação de IRP_MN_SURPRISE_REMOVAL para o dispositivo.

  2. Conclua todas as solicitações enfileiradas no driver.

  3. Remova a energia do dispositivo, se o motorista do barramento for capaz de fazer isso, e notifique o power manager chamando PoSetPowerState.

    O motorista do barramento liga o dispositivo filho, se possível, e notifica o gerenciador de energia sobre a alteração no estado de energia do dispositivo. O motorista do ônibus faz isso em resposta à solicitação de IRP_MN_REMOVE_DEVICE ; O proprietário da política de energia do dispositivo não envia uma solicitação de IRP_MN_SET_POWER quando o dispositivo está sendo removido. Para obter informações adicionais, consulte Gerenciamento de Energia.

  4. Se o motorista do ônibus relatou esse dispositivo em sua resposta mais recente a uma solicitação de IRP_MN_QUERY_DEVICE_RELATIONS para BusRelations, o dispositivo ainda estará fisicamente presente no computador. Nesse caso, o motorista do ônibus:

    • Retém o PDO para o dispositivo até que o dispositivo tenha sido fisicamente removido.

    • Define Irp-IoStatus.Status> como STATUS_SUCCESS.

    • Conclui o IRP com IoCompleteRequest.

    • Retorna da rotina DispatchPnP .

    O motorista do barramento deve continuar relatando esse dispositivo em enumerações subsequentes (IRP_MN_QUERY_DEVICE_RELATIONS para BusRelations) até que o dispositivo seja fisicamente removido. O gerenciador PnP controla se um dispositivo enumerado foi adicionado e iniciado.

  5. Se o dispositivo não foi incluído na resposta mais recente do motorista do ônibus a uma solicitação de IRP_MN_QUERY_DEVICE_RELATIONS para BusRelations, o motorista do ônibus considera que o dispositivo será fisicamente removido do computador. Nesse caso, o motorista do ônibus faz o seguinte:

    • Limpa alocações, memória, eventos e assim por diante específicos do dispositivo.

    • Define Irp-IoStatus.Status> como STATUS_SUCCESS.

    • Conclui o IRP com IoCompleteRequest.

    • Libera o PDO com IoDeleteDevice.

      O motorista do barramento deverá excluir o PDO se o driver omitir o dispositivo de sua lista BusRelations mais recente. Se um usuário conectar o dispositivo ao computador novamente, o driver de barramento deverá criar um novo PDO em resposta à próxima consulta BusRelations . Se um motorista de barramento reutilizar o mesmo PDO para uma nova instância de um dispositivo, o computador não funcionará corretamente.

    • Retorna da rotina DispatchPnP .

Se o dispositivo ainda estiver presente quando o gerenciador PnP enviar a solicitação de IRP_MN_REMOVE_DEVICE , o motorista do barramento manterá o PDO. Se, posteriormente, o dispositivo for removido fisicamente do barramento, o gerenciador PnP enviará outra IRP_MN_REMOVE_DEVICE. Após o recebimento do IRP de remoção subsequente, o motorista do barramento exclui o PDO do dispositivo.

Um motorista de ônibus deve ser capaz de lidar com um IRP_MN_REMOVE_DEVICE para um dispositivo que ele já removeu e cujo PDO está marcado para exclusão. Em resposta a esse IRP, o motorista do ônibus pode ter sucesso no IRP ou retornar STATUS_NO_SUCH_DEVICE. O PDO para o dispositivo ainda não foi excluído nesse caso, apesar da chamada anterior do motorista do barramento para IoDeleteDevice, porque algum componente ainda tem uma referência ao objeto . Portanto, o motorista do barramento pode acessar o PDO durante a manipulação do segundo IRP de remoção. O motorista do ônibus não deve chamar IoDeleteDevice uma segunda vez para o PDO; o sistema de E/S exclui o PDO quando sua contagem de referência atinge zero.

Um motorista de ônibus não remove suas estruturas de dados para um dispositivo filho até receber uma solicitação de IRP_MN_REMOVE_DEVICE para o dispositivo. Um driver de barramento pode detectar que um dispositivo foi removido e chamar IoInvalidateDeviceRelations, mas não deve excluir o PDO do dispositivo até que o gerenciador de PnP envie uma solicitação de IRP_MN_REMOVE_DEVICE .