Interrompendo um dispositivo para reequilibrar recursos

A figura a seguir mostra a sequência de IRPs envolvidos na interrupção e reinicialização de um dispositivo para reequilibrar recursos.

diagrama ilustrando a interrupção de um dispositivo para reequilibrar recursos.

As anotações a seguir correspondem aos números circulados na figura anterior:

  1. O gerenciador PnP emite uma IRP_MN_QUERY_STOP_DEVICE para perguntar se os drivers de um dispositivo podem parar o dispositivo e liberar seus recursos de hardware.

    Se todos os drivers na pilha de dispositivos retornarem STATUS_SUCCESS, os drivers colocaram o dispositivo em um estado (stop-pending) do qual o dispositivo pode ser interrompido rapidamente.

    Se uma pilha de dispositivos retornar algo diferente de STATUS_SUCCESS, ela não participará do processo de rebalanceamento. Como o rebalanceamento de recursos é uma operação de melhor esforço, nesse caso, o sistema ainda tenta uma operação de rebalanceamento para atender aos requisitos de recursos dos dispositivos no sistema. No entanto, se os dispositivos falharem na parada de consulta, talvez não seja possível obter os resultados desejados (por exemplo, se um novo dispositivo for enumerado e disparar um rebalanceamento, ele poderá não receber os recursos necessários e, portanto, não conseguir iniciar).

    Um dispositivo que falha em uma operação de parada de consulta continua em um estado operacional, mesmo se a parada de consulta falhar.

    O gerenciador de PnP consulta quantas pilhas de dispositivo forem necessárias para reequilibrar os recursos necessários.

  2. O gerenciador PnP emite uma IRP_MN_STOP_DEVICE para interromper o dispositivo.

    No Windows 2000 e versões posteriores do Windows, o gerenciador PnP envia um IRP de parada somente se um IRP de parada de consulta anterior para o dispositivo for concluído com êxito. Em resposta a um IRP de parada, os drivers liberam os recursos de hardware do dispositivo (como suas portas de E/S) e mantêm todos os IRPs que exigem acesso ao dispositivo.

  3. Depois de reequilibrar com êxito os recursos, o gerenciador de PnP emite IRP_MN_START_DEVICE solicitações para reiniciar todos os dispositivos que ele parou durante o rebalanceamento.

  4. Caso contrário, o gerenciador PnP cancelará um IRP de parada de consulta enviando um IRP_MN_CANCEL_STOP_DEVICE.

    Em resposta a um IRP_MN_CANCEL_STOP_DEVICE, os drivers de um dispositivo retornam o dispositivo para o estado iniciado e retomam o processamento de solicitações de E/S para o dispositivo.

    O gerenciador PnP cancela a parada de consulta de uma pilha de dispositivos se um driver na pilha falhou na solicitação ou se a operação de rebalanceamento geral falhou e está cancelando todas as solicitações de parada de consulta. Quando o gerenciador PnP cancela a parada de consulta em apenas uma pilha de dispositivos, ele envia a solicitação de IRP_MN_CANCEL_STOP_DEVICE porque todos os drivers anexados acima do driver que falharam na consulta têm o dispositivo no estado de parada pendente. Quando o IRP_MN_CANCEL_STOP_DEVICE for bem-sucedido, os drivers retornaram o dispositivo para o estado iniciado.

  5. Se um driver não conseguir reiniciar o dispositivo depois de reequilibrar recursos, o gerenciador PnP enviará IRPs de remoção para a pilha de dispositivos (no Windows 2000 e versões posteriores do Windows).

    O gerenciador PnP primeiro envia uma solicitação de IRP_MN_SURPRISE_REMOVAL . Em seguida, ele envia uma solicitação de IRP_MN_REMOVE_DEVICE , mas somente depois que todos os identificadores abertos para o dispositivo forem fechados.

O rebalanceamento dos recursos de hardware de um dispositivo PnP deve ser transparente para aplicativos e usuários finais. Os usuários podem sofrer um atraso temporário na operação, mas os dados não devem ser perdidos. Você deve levar isso em consideração ao lidar com a parada de IRPs.