Power IRPs para o sistema
Um IRP de energia do sistema especifica o código IRP principal IRP_MJ_POWER, um dos códigos IRP de energia secundária listados abaixo e o valor SystemPowerState no membro Power.Type da pilha IRP. Somente o power manager pode enviar esse IRP; um driver não pode enviar um IRP de energia do sistema.
O power manager envia um IRP de energia do sistema por um dos seguintes motivos:
Para alterar o estado de energia do sistema em resposta a um tempo limite ocioso, uma alteração na atividade do sistema, uma solicitação de usuário ou uma bateria expirada (IRP_MN_SET_POWER)
Para consultar dispositivos para determinar se o sistema pode entrar em suspensão (IRP_MN_QUERY_POWER)
Para reafirmar o estado de energia do sistema atual após uma consulta (IRP_MN_SET_POWER)
O power manager envia solicitações de IRP_MN_QUERY_POWER e IRP_MN_SET_POWER em nome do sistema. Um driver pode falhar em uma solicitação de IRP_MN_QUERY_POWER , mas não pode falhar IRP_MN_SET_POWER.
Por exemplo, para alterar o estado de energia do sistema, o power manager envia um IRP de energia do sistema para o driver superior na pilha em cada nó de dispositivo da árvore de dispositivos. A figura a seguir mostra como os drivers em uma única pilha de dispositivos lidam com um IRP de energia do sistema.
Como mostra a figura anterior:
O power manager chama o gerenciador de E/S para enviar um IRP de energia do sistema para cada nó folha na árvore do dispositivo.
Os drivers lidam com o IRP, se possível, definem rotinas de IoCompletion , se necessário, e chamam IoCallDriver (Windows 7 e Windows Vista) ou PoCallDriver (Windows Server 2003, Windows XP e Windows 2000) para encaminhar o IRP para baixo na pilha. Se um driver precisar falhar no IRP, o driver o fará imediatamente e concluirá o IRP. Os drivers podem falhar IRP_MN_QUERY_POWER IRPs, mas não devem falhar IRP_MN_SET_POWER IRPs que definem o estado de energia do sistema.
Quando o driver que possui a política de energia para o dispositivo recebe o IRP, esse driver define uma rotina IoCompletion para o IRP do sistema e encaminha o IRP.
Todos os outros drivers na pilha manipulam o IRP, se possível, definem rotinas IoCompletion , se necessário, e encaminham o IRP para o driver mais baixo, como na etapa 2.
Eventualmente, o motorista do ônibus recebe e conclui o IRP do sistema.
O gerente de E/S chama todas as rotinas de IoCompletion que foram definidas como drivers passados pelo IRP do sistema para baixo na pilha do dispositivo.
Em sua rotina de IoCompletion , o proprietário da política de energia do dispositivo chama PoRequestPowerIrp para enviar um IRP de energia do dispositivo, especificando um estado de energia do dispositivo válido para o estado de energia do sistema no IRP do sistema. O driver define uma rotina de retorno de chamada a ser invocada quando o IRP de energia do dispositivo for concluído.
Se necessário, o driver consulta o membro DeviceState em sua cópia armazenada em cache da estrutura DEVICE_CAPABILITIES (consulte Reporting Device Power Capabilities) para determinar quais estados de energia do dispositivo correspondem ao estado de energia do sistema no IRP.
Depois que o IRP do dispositivo for concluído e todas as rotinas de conclusão do IRP do dispositivo forem executadas, a rotina de retorno de chamada do proprietário da política de energia será invocada. Na rotina de retorno de chamada, o driver copia seu status retornado para o IRP do sistema. No Windows Server 2003, No Windows XP e no Windows 2000, o retorno de chamada chama PoStartNextPowerIrp para iniciar o irp de energia seguinte. No entanto, no Windows 7 e no Windows Vista, chamar PoStartNextPowerIrp não é necessário e essa chamada não executa nenhuma operação de gerenciamento de energia. Por fim, o retorno de chamada chama IoCompleteRequest para concluir o IRP do sistema.
Para obter mais informações, consulte Manipulando solicitações de estado de energia do sistema.
Como alguns dispositivos exigem um inrush de atual quando eles ligarem, os IRPs de energia inrush do sistema são tratados de forma síncrona e serial em todo o sistema. Somente um desses IRP pode estar ativo por vez. Para obter mais informações, consulte Chamando IoCallDriver vs. Chamando PoCallDriver.