Noções básicas sobre quando remover IRPs são emitidos
A figura a seguir mostra a sequência típica de IRPs envolvidos na remoção dos drivers de um dispositivo.
As seguintes anotações correspondem aos números circulados na figura anterior:
Remoção de consulta
O gerenciador PnP emite um IRP_MN_QUERY_REMOVE_DEVICE para perguntar se um dispositivo pode ser removido sem interromper o computador. Ele também envia esse IRP quando um usuário solicita a atualização do driver para o dispositivo e (no Windows 2000 e posterior) quando Gerenciador de Dispositivos desabilita o dispositivo. (No Windows 98/Me, o gerenciador de PnP envia irPs de parada nessa situação; consulte Parando um dispositivo para obter detalhes.)
Se todos os drivers na pilha de dispositivos retornarem STATUS_SUCCESS, os drivers colocarão o dispositivo no estado de remoção pendente. Nesse estado, os drivers não devem iniciar nenhuma operação que impeça que o dispositivo seja removido.
Neste caso de remoção "limpo", o gerenciador PnP envia um IRP de remoção de consulta antes de enviar um IRP de remoção. Consulte a etapa 5 para obter uma descrição da remoção "surpresa".
Embora não seja mostrado no diagrama acima, um motorista de ônibus pode receber uma IRP_MN_QUERY_REMOVE_DEVICE para um dispositivo que não foi iniciado. Isso pode acontecer se um usuário solicitar a remoção dinâmica de um dispositivo que esteja fisicamente presente no computador, mas que esteja desabilitado.
Remover após a consulta bem-sucedida
O gerenciador PnP emite um IRP_MN_REMOVE_DEVICE para remover os drivers de um dispositivo.
Os drivers devem ter êxito nessa solicitação. Os drivers do dispositivo executam qualquer limpo necessário, desanexam da pilha do dispositivo e excluem o FDO e quaisquer DOs de filtro. O motorista do barramento pai retém o PDO até que o usuário remova fisicamente o dispositivo do computador.
Observe que os drivers podem receber uma IRP_MN_STOP_DEVICE antes de remover o IRP, mas isso não é necessário. No Windows 2000 e posterior, IRP_MN_STOP_DEVICE é usado apenas para pausar um dispositivo para rebalanceamento de recursos; não é um passo para a remoção. Se um usuário remover o hardware do dispositivo enquanto o dispositivo for interrompido, o gerenciador PnP enviará um IRP de remoção em algum momento após a parada do IRP, mas uma parada não será um pré-requisito para uma remoção.
Reenumerar o dispositivo
Se o dispositivo for reenumerado depois que os drivers tiverem excluído seus objetos de dispositivo, o gerenciador PnP chamará as rotinas addDevice dos drivers e emitirá um IRP_MN_START_DEVICE para restabelecer o dispositivo. (Consulte também os Estados do Dispositivo da figura perspectiva PnP .)
Cancelar uma remoção de consulta
O gerenciador PnP emite um IRP_MN_CANCEL_REMOVE_DEVICE para cancelar uma solicitação de remoção de consulta.
Em resposta a um IRP_MN_CANCEL_REMOVE_DEVICE, os drivers retornam o dispositivo ao estado iniciado.
Remoção surpresa (Windows 2000 e versões posteriores do Windows)
No Windows 2000 e em sistemas posteriores, se um usuário desconectar um dispositivo do computador sem usar o programa Desconectar ou Ejetar Hardware, o gerenciador PnP enviará uma IRP_MN_SURPRISE_REMOVAL IRP.
Esse caso é chamado de remoção "surpresa" porque os motoristas não recebem aviso prévio.
Em resposta a um IRP IRP_MN_SURPRISE_REMOVAL , os drivers do dispositivo falham em qualquer E/S pendente e liberam os recursos de hardware usados pelo dispositivo. Os drivers devem garantir que nenhum componente tente acessar o dispositivo porque ele não está mais presente.
Todos os drivers devem lidar com um IRP IRP_MN_SURPRISE_REMOVAL e devem definir status como STATUS_SUCCESS.
Um IRP_MN_SURPRISE_REMOVAL não pode ser cancelado.
Remover após a remoção surpresa (Windows 2000 e versões posteriores do Windows)
Quando todas as alças abertas para o dispositivo são fechadas, o gerenciador PnP envia uma solicitação IRP_MN_REMOVE_DEVICE para os drivers do dispositivo. Cada driver desanexa da pilha do dispositivo e exclui seu objeto de dispositivo.
Remoção surpresa (Windows 98/Me)
No Windows 98/Me, um driver não recebe uma IRP_MN_SURPRISE_REMOVAL quando um dispositivo é removido sem aviso. O gerenciador PnP envia apenas uma IRP_MN_REMOVE_DEVICE. Os drivers WDM devem ter código para lidar com um IRP_MN_SURPRISE_REMOVAL seguido de um IRP_MN_REMOVE_DEVICE (o comportamento do Windows 2000 e posterior para remoção surpresa) e um IRP_MN_REMOVE_DEVICE sem um IRP de remoção surpresa anterior (o comportamento do Windows 98/Me).
Remover após um início com falha (Windows 2000 e posterior)
Se um dos drivers de um dispositivo falhar um IRP_MN_START_DEVICE, o gerenciador PnP enviará uma solicitação IRP_MN_REMOVE_DEVICE para a pilha de dispositivos. Essa remoção do IRP garante que todos os drivers do dispositivo sejam notificados de que o dispositivo não foi iniciado com êxito. Em resposta ao IRP IRP_MN_REMOVE_DEVICE , os drivers do dispositivo desfazem suas operações de início (se tiverem êxito no IRP inicial) e desfaçam suas operações addDevice . O gerenciador PnP marca um dispositivo como "início com falha".
Esse comportamento se aplica somente às plataformas Windows 2000 e posteriores. No Windows 98/Me, o gerenciador de PnP envia uma IRP_MN_STOP_DEVICE em resposta a um início com falha.
Um driver para um dispositivo PnP pode receber uma IRP_MN_SURPRISE_REMOVAL em mais situações do que as mostradas na figura que ilustra as transições típicas de REMOVER IRP. Por exemplo, um usuário pode inserir um cartão de computador no computador e removê-lo antes que o dispositivo seja iniciado. Nesse caso, o gerenciador PnP emite um IRP de remoção surpresa depois que as rotinas AddDevice dos drivers são chamadas, mas antes de emitir a solicitação de IRP_MN_START_DEVICE . Um driver para um dispositivo PnP deve estar preparado para lidar com a remoção de IRPs a qualquer momento após a chamada da rotina AddDevice do driver.