Manipulando uma solicitação de IRP_MN_CANCEL_STOP_DEVICE (Windows 2000 e posterior)
Uma solicitação IRP_MN_CANCEL_STOP_DEVICE deve ser tratada primeiro pelo motorista do barramento pai para um dispositivo e, em seguida, por cada próximo driver mais alto na pilha do dispositivo. Um driver lida com a parada de IRPs em sua rotina DispatchPnP .
Em resposta a uma solicitação de IRP_MN_CANCEL_STOP_DEVICE , um driver deve retornar o dispositivo ao estado iniciado e retomar a operação normal. Os drivers devem ter êxito em um IRP de parada de cancelamento.
Um driver manipula uma solicitação IRP_MN_CANCEL_STOP_DEVICE com um procedimento como o seguinte:
Adie a reinicialização do dispositivo até que os drivers inferiores tenham concluído suas operações de reinicialização. (Consulte Adiando o processamento de PnP IRP até que os drivers inferiores sejam concluídos.)
Após a conclusão dos drivers inferiores, retorne o dispositivo ao estado iniciado.
As operações exatas dependem do dispositivo e do driver.
Inicie IRPs na fila de retenção de IRP.
Se o driver estava segurando solicitações enquanto o dispositivo estava no estado de parada pendente, desmarque o sinalizador HOLD_NEW_REQUESTS e inicie os IRPs na fila de retenção de IRP. Consulte Segurando IRPs de entrada quando um dispositivo está em pausa para obter mais informações.
Conclua o IRP com IoCompleteRequest.
Em uma função ou driver de filtro:
A rotina de IoCompletion do driver retornou STATUS_MORE_PROCESSING_REQUIRED, conforme descrito em Adiando o processamento de PnP IRP até que drivers inferiores sejam concluídos, de modo que a rotina dispatchPnP do driver deve chamar IoCompleteRequest para retomar o processamento de conclusão de E/S.
O driver define Irp-IoStatus.Status> como STATUS_SUCCESS, chama IoCompleteRequest com um aumento de prioridade de IO_NO_INCREMENT e retorna STATUS_SUCCESS de sua rotina DispatchPnP.
Os drivers não devem falhar nesta operação. Se um driver falhar na reinicialização do IRP, o dispositivo estará em um estado inconsistente e não funcionará corretamente.
Em um motorista de ônibus pai:
O driver define Irp-IoStatus.Status> como STATUS_SUCCESS e chama IoCompleteRequest especificando um aumento de prioridade de IO_NO_INCREMENT. O motorista do ônibus retorna STATUS_SUCCESS de sua rotina DispatchPnP .
Um motorista de ônibus não deve falhar nesta operação. Se um driver falhar na reinicialização do IRP, o dispositivo estará em um estado inconsistente e não funcionará corretamente.
Um driver pode receber uma solicitação de parada de cancelamento espúria quando o dispositivo for iniciado e ativo. Isso pode ocorrer, por exemplo, se o driver (ou um driver mais alto na pilha do dispositivo) falhou em uma solicitação IRP_MN_QUERY_STOP_DEVICE . Quando um dispositivo é iniciado e ativo, os drivers podem ter êxito com segurança nas solicitações de parada de cancelamento espúrias para o dispositivo.