Compartilhar via


IRP_MN_WAIT_WAKE

Esse IRP permite que um driver desperte um sistema em suspensão ou desperte um dispositivo em suspensão.

Código principal

IRP_MJ_POWER

Quando enviado

Um driver que possui a política de energia direciona esse IRP para seu PDO para permitir que seu dispositivo desperte em resposta a um evento externo, como uma chamada telefônica de entrada. Um driver deve chamar PoRequestPowerIrp para enviar esse IRP.

Como regra geral, um driver deve enviar esse IRP assim que determinar que seu dispositivo deve ser habilitado para ativação. Consequentemente, os drivers para a maioria desses dispositivos enviam esse IRP depois de ligar seus dispositivos e antes de concluir a solicitação de IRP_MN_START_DEVICE .

No entanto, um driver pode enviar o IRP sempre que o dispositivo estiver no estado de trabalho (PowerDeviceD0). A pilha do dispositivo não deve estar em transição; ou seja, um driver não deve enviar um IRP_MN_WAIT_WAKE enquanto qualquer outro IRP de energia estiver ativo em sua pilha de dispositivos.

Um IRP de espera/ativação não altera o estado de energia do dispositivo ou do sistema. Ele simplesmente habilita um sinal de ativação do dispositivo. Quando o sinal de ativação chega, o proprietário da política deve chamar PoRequestPowerIrp para enviar um IRP de set-power para retornar seu dispositivo para D0.

O driver deve estar em execução em IRQL = PASSIVE_LEVEL para enviar esse IRP. No entanto, o IRP pode ser concluído em IRQL = DISPATCH_LEVEL.

Parâmetros de Entrada

Parameters.WaitWake.PowerState contém o estado de energia do sistema mais baixo (menos alimentado) do qual o dispositivo deve ter permissão para despertar o sistema.

Parâmetros de saída

Nenhum.

Bloco de Status de E/S

Um driver define Irp-IoStatus.Status> como um dos seguintes:

STATUS_PENDING
O driver recebeu o IRP e está aguardando o dispositivo sinalizar a ativação.

STATUS_INVALID_DEVICE_STATE
O dispositivo está em um estado menos alimentado do que o estado DeviceWake especificado na estrutura DEVICE_CAPABILITIES para o dispositivo ou o dispositivo não pode despertar o sistema do estado SystemWake passado no IRP.

STATUS_NOT_SUPPORTED
O dispositivo não dá suporte à ativação.

STATUS_DEVICE_BUSY
Uma solicitação de IRP_MN_WAIT_WAKE já está pendente e deve ser concluída ou cancelada antes que outra solicitação de IRP_MN_WAIT_WAKE possa ser emitida.

STATUS_SUCCESS
O dispositivo sinalizou um evento de ativação.

STATUS_CANCELLED
O IRP foi cancelado.

Se um driver precisar falhar nesse IRP, ele concluirá o IRP imediatamente e não passará o IRP para o driver inferior seguinte.

Operação

Um driver envia IRP_MN_WAIT_WAKE por dois motivos:

  1. Para permitir que seu dispositivo desperte um sistema em suspensão em resposta a um sinal de ativação externo.

  2. Para permitir que seu dispositivo desperte de um estado de suspensão do dispositivo em resposta a um sinal de ativação externo.

O IRP deve ser passado para baixo na pilha do dispositivo para o driver de barramento do dispositivo, que chama IoMarkIrpPending e retorna STATUS_PENDING de sua rotina DispatchPower . O IRP permanece pendente até que ocorra um sinal de ativação ou até que o driver que enviou o IRP o cancele.

Somente um IRP de espera/ativação pode ser mantido pendente para um PDO a qualquer momento. Se um driver já tiver um IRP de espera/ativação para um PDO, ele deverá falhar em qualquer IRPs adicional com STATUS_DEVICE_BUSY. Um driver que enumera mais de um PDO filho pode ter um IRP de espera/ativação pendente para cada PDO.

Cada driver define uma rotina IoCompletion à medida que o IRP percorre a pilha do dispositivo. Quando o dispositivo sinaliza um evento de ativação, o motorista do barramento atende ao sinal de ativação e conclui o IRP, retornando STATUS_SUCCESS. Em seguida, o gerente de E/S chama a rotina IoCompletion do próximo driver superior e assim por diante na pilha do dispositivo.

Quando um driver envia um IRP de espera/ativação, ele deve especificar uma rotina de retorno de chamada na chamada PoRequestPowerIrp . Na rotina de retorno de chamada, o driver normalmente atende ao dispositivo. Por exemplo, o proprietário da política de energia do dispositivo deve chamar PoRequestPowerIrp para enviar um IRP_MN_SET_POWER para o estado do dispositivo D0.

Um driver que atua como o driver de barramento de um dispositivo e o proprietário da política de um dispositivo pai solicita um IRP IRP_MN_WAIT_WAKE para a pilha de dispositivos pai quando recebe uma solicitação IRP_MN_WAIT_WAKE de um PDO filho. Se o driver enumerar mais de um PDO filho, ele deverá solicitar apenas um IRP de espera/ativação para a pilha de dispositivos pai, independentemente de quantos PDOs filho enviarem solicitações de espera/ativação. Em vez disso, esse driver deve manter uma contagem interna de IRPs de espera/ativação, incrementando a contagem sempre que receber uma solicitação e diminuindo a contagem sempre que concluir uma solicitação. Se a contagem for diferente de zero depois de concluir um IRP de espera/ativação, o driver deverá enviar outro IRP de espera/ativação para sua pilha de dispositivos para "rearmar" a si mesmo para ativação. Para obter mais informações, consulte Noções básicas sobre o caminho dos IRPs de espera/ativação por meio de uma árvore de dispositivos.

Para cancelar um IRP_MN_WAIT_WAKE, um driver chama IoCancelIrp. Somente o driver que originou o IRP pode cancelá-lo. Um driver cancela uma IRP_MN_WAIT_WAKE pendente quando ocorre um destes procedimentos:

  • O driver recebe um IRP PnP que interrompe ou remove o dispositivo.

  • O sistema vai dormir e o sinal de ativação do dispositivo não deve despertá-lo.

Requisitos

parâmetro

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

Confira também

PoRequestPowerIrp