Compartilhar via


Enviar um dispositivo Set-Power IRP em resposta a um IRP do Set-Power do sistema

O proprietário da política de energia do dispositivo deve seguir as seguintes etapas para responder a um IRP de configuração do sistema:

  1. Chame IoAcquireRemoveLock, passando o IRP atual como o parâmetro Tag, para garantir que o driver não receba um Plug and Play IRP_MN_REMOVE_DEVICE solicitação ao manipular o IRP de energia.

    Se IoAcquireRemoveLock retornar uma falha status, o driver não deverá continuar processando o IRP. Em vez disso, a partir do Windows Vista, o driver deve chamar IoCompleteRequest para concluir a solicitação e, em seguida, retornar a falha status. No Windows Server 2003, Windows XP e Windows 2000, o driver deve primeiro chamar PoStartNextPowerIrp, chamar IoCompleteRequest para concluir o IRP e, em seguida, retornar a falha status.

  2. Configure o local da pilha IRP para o driver inferior seguinte chamando IoCopyCurrentIrpStackLocationToNext.

  3. Defina uma rotina IoCompletion no IRP de set-power do sistema.

  4. Chame IoMarkIrpPending para marcar o IRP set-power do sistema como pendente.

  5. Chame IoCallDriver (começando com o Windows Vista) ou PoCallDriver (no Windows Server 2003, Windows XP e Windows 2000) para passar o IRP de set-power do sistema para o driver mais baixo.

  6. Retorne STATUS_PENDING de sua rotina DispatchPower .

Na rotina IoCompletion (consulte Etapa 3 na lista anterior), o proprietário da política de energia do dispositivo envia um IRP de set-power do dispositivo da seguinte maneira:

  1. Inspecione o IRP de configuração do sistema para obter o estado de energia do sistema solicitado. Escolha um estado de energia do dispositivo apropriado para esse estado de energia do sistema. Para obter mais informações, consulte Determinando o estado correto de energia do dispositivo.

  2. Chame PoRequestPowerIrp para enviar uma IRP_MN_SET_POWER para o estado de energia do dispositivo determinado na Etapa 1. O proprietário da política de energia deve enviar a solicitação de set-power do dispositivo mesmo que o dispositivo já esteja nesse estado.

  3. Especifique uma rotina de retorno de chamada de preenchimento de energia (CompletionFunction) na chamada para PoRequestPowerIrp e passe o IRP de set-power do sistema no buffer de contexto .

  4. Retorne STATUS_MORE_PROCESSING_REQUIRED da rotina IoCompletion , para que o driver possa concluir o processamento do IRP de set-power do sistema na rotina de retorno de chamada de preenchimento de energia.

Lembre-se de que o proprietário da política de energia do dispositivo não só envia o IRP de set-power do dispositivo, mas também deve lidar com esse IRP à medida que ele percorre a pilha do dispositivo. Consequentemente, um proprietário de política de energia do dispositivo pode ter não apenas uma rotina de retorno de chamada de preenchimento de energia associada ao IRP de set-power do dispositivo e uma rotina IoCompletion para o IRP de set-power do sistema, mas também uma rotina IoCompletion para o IRP de configuração do dispositivo. Para obter mais informações, consulte Manipulando IRP_MN_SET_POWER para estados de energia do dispositivo.

Depois que o gerente de E/S chama todas as rotinas de IoCompletion que foram definidas como o IRP de set-power do dispositivo percorreu a pilha do dispositivo, o gerenciador de E/S chama a rotina de retorno de chamada de preenchimento de energia. Nesse momento, todos os drivers na pilha concluíram o IRP de set-power do dispositivo e a transição de energia do dispositivo está concluída.

A rotina de retorno de chamada de preenchimento de energia deve fazer o seguinte:

  1. Chame PoStartNextPowerIrp para iniciar o próximo IRP de energia. (Somente Windows Server 2003, Windows XP e Windows 2000.)

  2. Conclua o IRP de set-power do sistema (IoCompleteRequest) com o status retornado para o IRP de set-power do dispositivo.

  3. Chame IoReleaseRemoveLock para liberar o bloqueio adquirido anteriormente.

  4. Retorne o status com o qual os IRPs de set-power foram concluídos.