Compartilhar via


IRP_MN_SET_POWER

Esse 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 um proprietário da política de energia do dispositivo pode enviar esse IRP.

O power manager envia esse IRP para notificar os drivers de uma alteração no estado de energia do sistema. Se um driver tiver registrado seu dispositivo para detecção ociosa, o power manager enviará esse 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 esse IRP.

O power manager envia esse IRP em IRQL = PASSIVE_LEVEL para pilhas de dispositivos que definem o sinalizador DO_POWER_PAGABLE no PDO. Os drivers nessas pilhas podem tocar no código ou nos dados paginado para concluir a solicitação.

O power manager poderá 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 nenhum código ou dados paginados.

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 System Power Actions.

A partir do Windows Vista, o membro Parameters.Power.SystemPowerStateContext é uma estrutura de SYSTEM_POWER_STATE_CONTEXT parcialmente opaca e somente leitura que contém informações sobre os estados de energia do sistema anteriores de um computador. Se Parameters.Power.Type for SystemPowerState e Parameters.Power.State for PowerSystemWorking, dois bits de sinalizador nessa estrutura indicarão se uma inicialização rápida ou uma ativação da hibernação fez com que o computador entrasse no estado do sistema S0 (funcionando). Para obter mais informações, consulte Distinguindo a inicialização rápida da ativação da hibernação.

A tabela a seguir mostra o conteúdo de IRP_MN_SET_POWER. Parameters.Power. {State| ShutdownType} e os campos de bit 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 SystemState atual SystemState de destino SystemState efetivo Comentários
Durma para... S3 Modo de suspensão S0 S3 S3
... Acordar S0 Modo de suspensão S3 S0 S0
Suspensão híbrida para... S4 Hibernar S0 S3 S4 Suspensão com arquivo de hibernação (Fast S4)
... Acordar S0 Modo de suspensão S3 S0 S0
... Wake/PwrLost S0 Modo de suspensão S4 S0 S0
Hibernar para... S4 Hibernar S0 S4 S4
... Acordar S0 Modo de suspensão S4 S0 S0
Desligamento híbrido para... S4 Hibernar S0 S5 S4 Aplicativos fechados, usuário desconectado como se estivesse desligado (Inicialização hiber)
... Inicialização Rápida S0 Modo de suspensão S4 S0 S0
Desligar para... S5 Desligamento/redefinição/desativação S0 S5 S5
... Inicialização 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 inseriu o estado solicitado.

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

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

Operação

O power manager ou um driver pode solicitar um IRP IRP_MN_SET_POWER . O power manager envia esse IRP por um dos seguintes motivos:

  • 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 power manager está executando a detecção ociosa

  • Para reafirmar o estado atual do sistema depois que um driver falha em uma solicitação 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 de seu dispositivo.

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

Cada driver deve passar cada IRP de energia para o driver mais baixo 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, atrasos podem ocorrer em uma solicitação PowerDeviceD0 se o dispositivo exigir inrush atual e, portanto, deve ser ativado em série com outro dispositivo desse tipo.

Depois que um driver recebe uma solicitação 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 power manager do sistema pode enviar um IRP de set-power do sistema.

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

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

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

Normalmente, um driver de filtro não precisa agir em um IRP de set-power do sistema, além de passá-lo.

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

Um IRP de set-power do sistema informa aos drivers que uma alteração 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 o PowerSystemShutdown (S5), um driver pode determinar se o sistema está redefinindo (PowerActionShutdownReset) ou desligando indefinidamente para reiniciar mais tarde (PowerActionShutdownOff). Para 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 interromper a E/S quando o sistema estiver redefinindo.

No Windows 2000 e versões posteriores do sistema operacional, o valor em ShutdownType também pode ser PowerActionShutdown. Nesse caso, o driver não pode informar que tipo de desligamento é solicitado e, portanto, deve continuar como para uma redefinição.

Estados de energia do dispositivo

Os drivers de função e filtro localizados acima de um driver de ônibus não devem falhar em uma solicitação para definir um estado de energia do dispositivo. O motorista do barramento poderá falhar em uma solicitação de ativação do dispositivo se o dispositivo for removido ou 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 lidar com o IRP à medida que ele percorre a pilha do dispositivo, salvando qualquer contexto que o driver precisará para restaurar o dispositivo para o estado de trabalho. Depois que um motorista de ônibus recebe um IRP, o motorista:

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

  • Define o dispositivo para o estado de energia solicitado.

  • Chama PoSetPowerState para notificar o power manager.

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

  • Conclui o IRP de energia do dispositivo.

O driver deve concluir esse IRP em tempo hábil. Em geral, os drivers 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 dados de rede ou disco armazenados em cache, mas não deve manter uma conexão de rede ativa ou formatar uma fita. Para obter mais informações, consulte Passando POWER IRPs.

No Windows 2000 e versões posteriores do sistema operacional, se o IRP especificar PowerDeviceD1, PowerDeviceD2 ou PowerDeviceD3 e um IRP set-power 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 solicitar PowerDeviceD3 e ShutdownType for PowerActionHibernate, esse driver deverá salvar qualquer contexto necessário para restaurar o dispositivo, mas não deve desligar o dispositivo; o dispositivo entrará no estado D3 quando o computador perder energia.

No Windows 2000 e versões posteriores do sistema operacional, os drivers não devem depender do 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, ShutdownType será sempre PowerActionNone.

O driver que determina quando desligar um dispositivo varia dependendo da classe de 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 deverá 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 configuração 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 redefine) energia ao dispositivo, chama PoStartNextPowerIrp (somente Windows Server 2003, Windows XP e Windows 2000) e chama PoSetPowerState para informar o power manager do novo estado de energia para o dispositivo.

Depois que o motorista do barramento concluir o IRP de energia, os drivers de função e filtro manipularão o IRP em suas rotinas de IoCompletion à medida que ele faz backup da pilha do dispositivo. Na rotina IoCompletion , cada driver restaura ou reinicializa seu contexto de 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.

Requisitos

parâmetro

Wdm.h (inclua Wdm.h, Ntddk.h ou Ntifs.h)

Confira também

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT