Partilhar via


Power IRPs para dispositivos individuais

Um IRP de energia de dispositivo especifica o código IRP principal IRP_MJ_POWER, um dos códigos IRP de energia secundária listados abaixo e o valor DevicePowerState no membro Power.Type .

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

IRP_MN_WAIT_WAKE

IRP_MN_POWER_SEQUENCE

Todos os drivers em uma pilha de dispositivos recebem esses IRPs; normalmente, somente o gerenciador de políticas de energia do dispositivo pode enviar esses IRPs. No entanto, o power manager pode enviar um IRP de energia do dispositivo ao executar a detecção ociosa em nome de um dispositivo, conforme explicado em Usando rotinas do Power Manager para detecção ociosa.

Um driver envia um IRP de energia do dispositivo por qualquer um dos seguintes motivos:

  • Para consultar ou alterar o estado de energia do dispositivo em resposta a um IRP de energia do sistema

  • Para colocar o dispositivo em um estado de suspensão para economizar energia

  • Para retornar o dispositivo ao estado de trabalho depois que ele estiver dormindo

  • Para permitir que o dispositivo desperte em resposta a um sinal externo

  • Para obter um valor de sequência de energia ao ligar um dispositivo

A figura a seguir mostra a sequência de etapas que ocorrem para enviar, encaminhar e concluir um IRP de energia do dispositivo.

diagrama ilustrando o caminho de um irp de energia do dispositivo.

Como mostra a figura anterior, um IRP de energia do dispositivo é enviado, encaminhado e concluído nas seguintes etapas:

  1. O proprietário da política de energia do dispositivo chama PoRequestPowerIrp para alocar um IRP de energia do dispositivo, especificando o PDO que é o destino do IRP e uma rotina de retorno de chamada a ser invocada quando o IRP for concluído.

  2. O power manager aloca um IRP de energia do dispositivo e o envia para o driver superior na pilha de dispositivos para o PDO de destino.

  3. O driver executa as seguintes ações:

    • Define uma rotina IoCompletion se for necessário.

    • Chama PoStartNextPowerIrp (Windows Server 2003, Windows XP e Windows 2000) se uma rotina de conclusão não for usada. A partir do Windows Vista, essa chamada não é necessária e essa chamada não executa nenhuma operação de gerenciamento de energia.

    • Chama IoCallDriver (Windows 7 e Windows Vista) ou chama PoCallDriver (Windows Server 2003, Windows XP e Windows 2000) para passar o IRP para o driver mais baixo.

    Cada driver na pilha faz isso até que o IRP atinja o motorista do ônibus. Se um driver precisar falhar no IRP, ele deverá fazer isso imediatamente e chamar IoCompleteRequest.

  4. O driver de barramento, que mantém o PDO do dispositivo, executa a ação solicitada e chama IoCompleteRequest para concluir o IRP. Um motorista de barramento poderá falhar ao ligar o IRP de um dispositivo se um dispositivo for removido ou estiver sendo removido.

  5. O gerente de E/S chama rotinas de IoCompletion que foram definidas por drivers conforme passavam o IRP para baixo na pilha. Depois que todas as rotinas IoCompletion tiverem sido chamadas, a rotina de retorno de chamada será executada.

Para obter mais informações sobre IRPs de energia do dispositivo, consulte Gerenciando a energia para dispositivos individuais e dispositivos de suporte que têm recursos de Wake-Up. Para obter detalhes sobre a sequência de energia IRP, consulte IRP_MN_POWER_SEQUENCE.