Manipulando uma solicitação de IRP_MN_STOP_DEVICE (Windows 2000 e posterior)
Uma solicitação de IRP_MN_STOP_DEVICE é manipulada primeiro pelo driver superior na pilha do dispositivo e, em seguida, por cada próximo driver inferior. Um driver lida com a parada de IRPs em sua rotina DispatchPnP .
Um driver lida com uma solicitação de IRP_MN_STOP_DEVICE com um procedimento como o seguinte:
Verifique se o dispositivo está em pausa.
Se um driver não pausar completamente o dispositivo em resposta à solicitação de IRP_MN_QUERY_STOP_DEVICE , ele deverá fazê-lo agora. Defina um sinalizador HOLD_NEW_REQUESTS na extensão do dispositivo e execute todas as outras operações necessárias para pausar o dispositivo.
O dispositivo pode perder energia durante a operação de rebalanceamento de recursos e, portanto, pode perder o estado do dispositivo. Os drivers do dispositivo devem salvar qualquer informação de estado do dispositivo e restaurá-la quando receberem a solicitação de IRP_MN_START_DEVICE subsequente.
Libere os recursos de hardware para o dispositivo.
Em um driver de função, as operações exatas dependem do dispositivo e do driver, mas podem incluir a desconexão de uma interrupção com IoDisconnectInterrupt, a liberação de intervalos de endereços físicos com MmUnmapIoSpace e a liberação de portas de E/S.
Se um motorista de filtro ou barramento adquiriu recursos de hardware para o dispositivo, esse driver deve liberar os recursos em resposta a uma solicitação de IRP_MN_STOP_DEVICE .
Defina Irp-IoStatus.Status> como STATUS_SUCCESS.
Passe o IRP para o próximo driver inferior ou conclua o IRP.
Em um driver de função ou filtro, configure o próximo local de pilha com IoSkipCurrentIrpStackLocation, passe o IRP para o próximo driver inferior com IoCallDriver e retorne o status do IoCallDriver como o retorno status da rotina DispatchPnP. Não conclua o IRP.
Em um driver de ônibus, conclua o IRP usando IoCompleteRequest com IO_NO_INCREMENT e retorne da rotina DispatchPnP .
Embora o dispositivo seja interrompido para reequilibrar recursos, um driver não pode iniciar nenhum IRPs que acesse o dispositivo. Um driver deve enfileirar esses IRPs, conforme descrito em Mantendo irps de entrada quando um dispositivo está em pausa ou falhar se o driver não implementar uma fila de retenção de IRP e não deve descartar solicitações de E/S.