Compartilhar via


Manipulando IRP_MN_SET_POWER para estados de energia do dispositivo

Um IRP de configuração de dispositivo solicita uma alteração de estado para um único dispositivo e é enviado para todos os drivers na pilha do dispositivo. Esse IRP especifica DevicePowerState no membro Power.Type do local da pilha de E/S.

Os motoristas lidam com IRPs desligados enquanto viajam pela pilha. Para IRPs de ativação, os drivers definem rotinas de IoCompletion à medida que os IRPs percorrem a pilha e manipulam os IRPs nas rotinas IoCompletion à medida que os IRPs viajam de volta para a pilha. Os drivers em uma pilha de dispositivo típica lidam com um IRP de set-power do dispositivo da seguinte maneira:

  • A maioria dos drivers de filtro deve simplesmente chamar IoMarkIrpPending, passar o IRP para o driver mais baixo (consulte Passando POWER IRPs) e retornar STATUS_PENDING da rotina DispatchPower . Alguns drivers de filtro, no entanto, podem primeiro precisar executar tarefas específicas do dispositivo, como enfileirar IRPs de entrada ou salvar o estado de energia do dispositivo.

  • Um driver de função chama IoMarkIrpPending, executa tarefas específicas do dispositivo (como concluir solicitações de E/S pendentes, enfileirar solicitações de E/S de entrada, salvar o contexto do dispositivo ou alterar a energia do dispositivo), define uma rotina de IoCompletion , se necessário, e passa o IRP de energia do dispositivo para o driver mais baixo (consulte Passando POWER IRPs). Ele retorna STATUS_PENDING de sua rotina DispatchPower .

  • O driver de barramento altera a energia do dispositivo se ele for capaz de fazer isso e, em seguida, chama PoSetPowerState para notificar o gerenciador de energia do novo estado de energia do dispositivo. Somente no Windows Server 2003, Windows XP e Windows 2000, o driver também deve chamar PoStartNextPowerIrp para iniciar o próximo IRP de energia depois de definir o estado de energia. Em seguida, o driver conclui o IRP, especificando IO_NO_INCREMENT. Se o driver não puder concluir o IRP imediatamente, ele chamará IoMarkIrpPending, retornará STATUS_PENDING de sua rotina DispatchPower e concluirá o IRP mais tarde.

Mesmo que o dispositivo de destino já esteja no estado de energia solicitado, cada função ou driver de filtro deve passar o IRP para o driver inferior seguinte. Cada IRP de energia de conjunto deve percorrer toda a pilha do dispositivo até o motorista do ônibus, o que o conclui.

Os drivers de função e filtro localizados acima de um driver de barramento não devem falhar em um IRP de energia do conjunto de dispositivos. O driver de barramento poderá falhar em um IRP de ativação do dispositivo se o dispositivo for removido ou estiver em processo de remoção.

Cada driver (função, filtro e driver de barramento) em uma pilha de driver deve chamar PoSetPowerState para informar o power manager de uma alteração no estado de energia de seu objeto de dispositivo correspondente.

Assim como outras tarefas de driver associadas à ativação e desligamento do dispositivo, a chamada para PoSetPowerState deve ocorrer depois que o dispositivo ligar (se o novo estado for D0) ou antes de o dispositivo desligar (se o novo estado for qualquer outro estado).

Cada driver deve acompanhar o estado de energia de seu dispositivo. O power manager não fornece essas informações aos drivers.

Ao lidar com uma solicitação de IRP_MN_SET_POWER para um estado de energia do dispositivo, um driver deve retornar da rotina DispatchPower o mais rápido possível. Um driver não deve esperar em sua rotina DispatchPower para um evento de kernel sinalizado pelo código que manipula o mesmo IRP. Como os IRPs de energia são sincronizados em todo o sistema, pode ocorrer um deadlock.

Para garantir o nível mais alto de desempenho do sistema, especialmente para aplicativos multimídia, um driver deve executar operações demoradas em um IRQL (nível de solicitação de interrupção) igual a PASSIVE_LEVEL. Para executar operações em IRQL= PASSIVE_LEVEL, um driver pode usar um thread dedicado ou um thread de trabalho do sistema. Para obter diretrizes sobre como otimizar o desempenho do driver para plataformas multimídia, consulte o Guia de Design de Dispositivos de Mídia de Streaming.

As etapas exatas que um driver deve executar para lidar com um IRP de energia dependem se o dispositivo está aumentando ou diminuindo, conforme descrito nas seções a seguir:

Manipulando IRPs de Power-Down dispositivo

Manipulando IRPs de Power-Up dispositivo