Compartilhar via


Mantendo os IRPs de entrada quando um dispositivo é pausado

Os drivers de um dispositivo devem pausar o dispositivo quando seus recursos estiverem sendo rebalanceados. Durante o rebalanceamento de recursos, alguns drivers pausam o dispositivo em resposta a uma solicitação IRP_MN_QUERY_STOP_DEVICE e outros drivers atrasam a pausa do dispositivo até receberem a solicitação de IRP_MN_STOP_DEVICE . Em ambos os casos, o dispositivo deve ser pausado quando o IRP_MN_STOP_DEVICE for bem-sucedido.

Os drivers devem concluir todos os IRPs em andamento no dispositivo e evitar iniciar novos IRPs que exijam acesso ao dispositivo.

Para manter os IRPs enquanto um dispositivo está em pausa, um driver implementa um procedimento como o seguinte:

  1. Em sua rotina AddDevice , defina um sinalizador na extensão do dispositivo com um nome como HOLD_NEW_REQUESTS. Limpe o sinalizador.

  2. Crie uma fila FIFO para manter IRPs.

    Se o driver já enfileirar IRPs, ele poderá reutilizar a mesma fila porque o driver é necessário para concluir quaisquer solicitações pendentes antes de pausar o dispositivo.

    Se o driver ainda não tiver uma fila IRP, ele deverá criar uma em sua rotina AddDevice . O tipo de fila que ele cria depende de como o driver libera a fila. Um driver pode usar uma lista interligada e duplamente vinculada e as rotinas da ListaXxxExInterlocked .

  3. Em seu código DispatchPnP para IRP_MN_QUERY_STOP_DEVICE (ou IRP_MN_STOP_DEVICE), conclua as solicitações pendentes e defina o sinalizador HOLD_NEW_REQUESTS.

  4. Em uma rotina de expedição que acessa o dispositivo, como DispatchWrite ou DispatchRead, marcar se o sinalizador de HOLD_NEW_REQUESTS está definido. Nesse caso, o driver deve marcar o IRP pendente e enfileira-lo.

    A rotina dispatchPnP do driver deve continuar a processar IRPs PnP em vez de mantê-los e a rotina DispatchPower deve continuar a processar IRPs de energia.

  5. No DispatchPnP, em resposta a um IRP inicial ou de cancelamento, desmarque o sinalizador HOLD_NEW_REQUESTS e inicie os IRPs na fila de retenção de IRP.

    Essas ações provavelmente são as últimas etapas para processar esses IRPs PnP. Por exemplo, em resposta a um IRP inicial, o driver deve primeiro executar todas as operações para iniciar o dispositivo e, em seguida, pode iniciar os IRPs na fila de retenção de IRP.

    Erros no processamento de IRPs da fila de retenção de IRP não afetam os status retornados para os IRPs iniciais ou de cancelamento.