Partilhar via


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:

  1. 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.

  2. 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 .

  3. Defina Irp-IoStatus.Status> como STATUS_SUCCESS.

  4. 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.