Partilhar via


IRP_MN_SET_POWER

Este IRP notifica um driver de uma alteração no estado de energia do sistema ou define o estado de energia do dispositivo para um dispositivo.

Código principal

IRP_MJ_POWER

Quando enviado

O gerenciador de energia do sistema ou o proprietário de uma política de energia do dispositivo pode enviar esse IRP.

O gestor de energia envia este IRP para notificar os controladores de uma alteração ao estado de energia do sistema. Se um driver registrar seu dispositivo para deteção de ociosidade, o gerenciador de energia envia este IRP para alterar o estado de energia de um dispositivo ocioso.

Um driver que possui a política de energia envia esse IRP para definir o estado de energia do dispositivo para seu dispositivo. Um driver deve chamar PoRequestPowerIrp para enviar este IRP.

O gerenciador de energia envia esse IRP em IRQL = PASSIVE_LEVEL para pilhas de dispositivos que definem o sinalizador de DO_POWER_PAGABLE no DOP. Os drivers em tais pilhas podem tocar em código paginado ou dados para concluir a solicitação.

O gerenciador de energia pode enviar o IRP em IRQL = DISPATCH_LEVEL se o sinalizador de DO_POWER_INRUSH estiver definido. Esses drivers não podem acessar direta ou indiretamente qualquer código paginado ou dados.

Parâmetros de entrada

O membro Parameters.Power.Type especifica o tipo de estado de energia que está sendo definido, SystemPowerState ou DevicePowerState.

O membro Parameters.Power.State especifica o próprio estado de energia, da seguinte maneira:

  • Se Parameters.Power.Type for SystemPowerState, o valor será um enumerador do tipo SYSTEM_POWER_STATE .
  • Se Parameters.Power.Type for DevicePowerState, o valor será um enumerador do tipo DEVICE_POWER_STATE .

O membro Parameters.Power.ShutdownType especifica informações adicionais sobre a transição solicitada. Os valores possíveis para esse membro são POWER_ACTION valores de enumeração. Para obter mais informações, consulte Ações de energia do sistema.

O membro Parameters.Power.SystemPowerStateContext é uma estrutura de SYSTEM_POWER_STATE_CONTEXT somente leitura, parcialmente opaca que contém informações sobre os estados de energia anteriores do sistema de um computador. Se Parameters.Power.Type for SystemPowerState e Parameters.Power.State for PowerSystemWorking, dois bits de sinalizador nessa estrutura indicam se uma inicialização rápida ou uma ativação da hibernação fez com que o computador entrasse no estado do sistema S0 (em funcionamento). Para obter mais informações, consulte Distinguishing Fast Startup from Wake-from-Hibernation.

Contexto de transição de energia do sistema para IRP_MN_SET_POWER

A tabela a seguir mostra o conteúdo de IRP_MN_SET_POWER. Parâmetros.Potência. {Estado|ShutdownType} e os campos de bits CurrentSystemState, TargetSystemState e EffectiveSystemState na estrutura SYSTEM_POWER_STATE_CONTEXT para cada transição de energia do sistema. Cada linha representa um IRP_MN_SET_POWER.

Transição Estado Tipo de desligamento Estado atual do sistema Estado-sistema de destino SystemState eficaz Observações
Durma para... S3 Dormir S0 S3 S3
... Velório S0 Dormir S3 S0 S0
Suspensão híbrida para... S4 Hibernação S0 S3 S4 Suspensão com arquivo de hibernação (Fast S4)
... Velório S0 Dormir S3 S0 S0
... Despertar/PwrLost S0 Dormir S4 S0 S0
Hibernar para... S4 Hibernação S0 S4 S4
... Velório S0 Dormir S4 S0 S0
Desligamento híbrido para... S4 Hibernação S0 S5 S4 Aplicativos fechados, usuário desconectado como se estivesse desligando (inicialização de hibernação)
... Arranque Rápido S0 Dormir S4 S0 S0
Desligamento para... S5 Desligamento/Reinicialização/Desligamento S0 S5 S5
... Arranque do sistema Sem S-IRP para inicialização

Parâmetros de saída

Parameters.Power.SystemContext é reservado para uso do sistema.

Bloco de status de E/S

Um driver define Irp-IoStatus.Status> como STATUS_SUCCESS para indicar que o dispositivo entrou no estado solicitado.

Um driver não deve falhar uma solicitação para definir o estado de energia do sistema.

Os drivers de função e filtro localizados acima de um driver de barramento não devem falhar em uma solicitação para definir um estado de energia do dispositivo. O driver de barramento pode falhar uma solicitação de ativação do dispositivo se o dispositivo for removido ou estiver em processo de remoção.

Funcionamento

O gestor de energia ou um condutor pode solicitar um IRP IRP_MN_SET_POWER . O gestor de energia envia este IRP por uma das seguintes razões:

  • Para notificar os drivers de uma alteração no estado de energia do sistema

  • Para alterar o estado de energia de um dispositivo para o qual o gerenciador de energia está executando a deteção de ociosidade

  • Para reafirmar o estado atual do sistema depois que um driver falhar uma solicitação de IRP_MN_QUERY_POWER para um estado de energia do sistema. Para obter mais informações, consulte IRP_MN_QUERY_POWER.

Um driver que possui a política de energia do dispositivo envia IRP_MN_SET_POWER para alterar o estado de energia do dispositivo.

A qualquer momento, o sistema permite que apenas um desses IRP esteja ativo para cada objeto do dispositivo.

Cada driver deve passar cada IRP de energia para o próximo driver inferior chamando IoCallDriver (começando com o Windows Vista) ou PoCallDriver (Windows Server 2003, Windows XP e Windows 2000). A interface PoCallDriver é semelhante à do IoCallDriver, exceto que o subsistema de gerenciamento de energia pode atrasar o IRP antes de passá-lo para o próximo driver. Por exemplo, podem ocorrer atrasos em uma solicitação PowerDeviceD0 se o dispositivo exigir corrente de irrupção e, portanto, deve ser ligado em série com outro dispositivo desse tipo.

Depois que um driver recebe uma solicitação de IRP_MN_SET_POWER no Windows Server 2003, Windows XP ou Windows 2000, um driver deve chamar PoStartNextPowerIrp, conforme descrito em Chamando PoStartNextPowerIrp. A partir do Windows Vista, chamar PoStartNextPowerIrp não é necessário, e essa chamada não executa nenhuma operação de gerenciamento de energia.

IRP_MN_SET_POWER para Estados de Energia do Sistema

Somente o gerenciador de energia do sistema pode enviar um IRP de potência definida do sistema.

Um driver não deve falhar uma solicitação para definir o estado de energia do sistema.

Sempre que possível, o gestor de energia envia IRP_MN_QUERY_POWER antes de enviar IRP_MN_SET_POWER para solicitar um estado de suspensão do sistema. No entanto, sob algumas condições (como o usuário pressionando o botão de desligamento ou uma bateria expirando), o gerenciador de energia pode emitir IRP_MN_SET_POWER sem primeiro consultar. O gestor de energia consulta apenas os estados de suspensão; ele nunca consulta antes de ligar.

A solicitação de IRP_MN_SET_POWER é enviada para o driver superior na pilha de dispositivos de um dispositivo. O motorista superior passa o IRP para o próximo motorista inferior, e assim por diante, até que o IRP chegue ao motorista do ônibus, que deve completar o IRP.

Um driver de filtro normalmente não precisa agir em um IRP de potência definida do sistema, além de passá-lo adiante.

O proprietário da política de energia do dispositivo, no entanto, define uma rotina IoCompletion antes de passar o IRP. Na rotina IoComplete , ele envia uma solicitação de IRP_MN_SET_POWER para um IRP de alimentação do dispositivo. Para obter mais informações, consulte Manipulando um sistema Set-Power IRP em um proprietário de política de energia de dispositivo.

Um IRP de potência definida do sistema informa os drivers que uma mudança no estado de energia do sistema é iminente e os drivers devem se preparar para isso. No entanto, um driver não deve alterar o estado de energia de seu dispositivo até receber uma IRP_MN_SET_POWER para um estado de energia do dispositivo .

O valor em Parameters.Power.ShutdownType fornece informações adicionais sobre as ações pendentes. Quando o IRP especifica PowerSystemShutdown (S5), um driver pode determinar se o sistema está redefinindo (PowerActionShutdownReset) ou desligando indefinidamente para reinicializar mais tarde (PowerActionShutdownOff). Para os drivers da maioria dos dispositivos, a diferença é inconsequente. No entanto, para determinados dispositivos, como dispositivos de streaming de vídeo, um driver pode desligar o dispositivo para parar a E/S quando o sistema estiver sendo redefinido.

O valor em ShutdownType também pode ser PowerActionShutdown. Neste caso, o motorista não pode dizer que tipo de desligamento é solicitado e, portanto, deve proceder como para uma reinicialização.

Estados de energia do dispositivo

Os drivers de função e filtro localizados acima de um driver de barramento não devem falhar em uma solicitação para definir um estado de energia do dispositivo. O driver de barramento pode falhar uma solicitação de ativação do dispositivo se o dispositivo for removido ou estiver em processo de remoção.

Um driver deve definir o dispositivo no estado solicitado antes de concluir o IRP.

Quando o IRP solicita uma transição para um estado de energia mais baixo, os drivers devem manipular o IRP enquanto ele percorre a pilha de dispositivos, salvando qualquer contexto que o driver precise para restaurar o dispositivo para o estado de trabalho. Depois que um motorista de ônibus recebe um IRP, o motorista:

  • Salva qualquer contexto que o driver precisa para restaurar o dispositivo para o estado de trabalho.

  • Define o dispositivo para o estado de energia solicitado.

  • Chama PoSetPowerState para notificar o gerenciador de energia.

  • Chama PoStartNextPowerIrp para iniciar o próximo IRP de alimentação (somente Windows Server 2003, Windows XP e Windows 2000).

  • Completa o IRP de alimentação do dispositivo.

O motorista deve completar este IRP em tempo hábil. Em geral, os motoristas devem evitar qualquer atraso que um usuário típico acharia visivelmente lento. Por exemplo, um driver pode atrasar uma alteração de estado do sistema para liberar o disco armazenado em cache ou os dados de rede, mas não deve manter uma conexão de rede ativa ou formatar uma fita. Para obter mais informações, consulte Passando IRPs de energia.

No Windows 2000 e versões posteriores do sistema operacional, se o IRP especificar PowerDeviceD1, PowerDeviceD2 ou PowerDeviceD3 e um IRP de potência definida do sistema estiver ativo, o valor em Parameters.Power.ShutdownType fornecerá informações sobre o IRP do sistema.

Os drivers de dispositivos no caminho de hibernação devem inspecionar esse valor. Se o IRP solicita PowerDeviceD3 e ShutdownType é PowerActionHibernate, esse driver deve salvar qualquer contexto necessário para restaurar o dispositivo, mas não deve desligar o dispositivo; o dispositivo entra no estado D3 quando a máquina perde energia.

No Windows 2000 e versões posteriores do sistema operacional, os drivers não devem confiar no valor em ShutdownType se o estado de energia solicitado for PowerDeviceD0.

No Windows 98/Me, se o IRP solicitar um estado de energia do dispositivo, o ShutdownType é sempre PowerActionNone.

O driver que determina quando desligar um dispositivo varia dependendo da classe do dispositivo.

O driver que determina quando ligar um dispositivo é quase sempre um driver que acessa os registros do dispositivo. O driver deve verificar se o dispositivo está no estado D0 antes de acessar os registros de hardware do dispositivo. Se o dispositivo não estiver no estado D0, o driver deve chamar PoRequestPowerIrp para enviar um IRP para ligar o dispositivo. Um driver não pode acessar seu dispositivo a menos que o dispositivo esteja no estado D0.

Quando um driver recebe um IRP de potência definida para o estado do dispositivo D0, ele define uma rotina IoCompletion e passa o IRP para o próximo driver inferior.

Quando o IRP atinge o driver de barramento, esse driver aplica (ou reinicia) energia ao dispositivo, chama PoStartNextPowerIrp (somente Windows Server 2003, Windows XP e Windows 2000) e chama PoSetPowerState para informar o gerenciador de energia do novo estado de energia do dispositivo.

Depois que o driver de barramento conclui o IRP de ativação, os drivers de função e filtro manipulam o IRP em suas rotinas IoCompletion enquanto ele viaja de volta para cima da pilha de dispositivos. Na rotina IoComplete , cada driver restaura ou reinicializa o contexto do dispositivo e executa quaisquer outras tarefas de inicialização necessárias.

Para obter mais informações, consulte Manipulando IRP_MN_SET_POWER para estados de energia do dispositivo.

Requerimentos

Cabeçalho: Wdm.h (inclui Wdm.h, Ntddk.h ou Ntifs.h)

Ver também

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT