Compartilhar via


Rotinas de callback de espera/ativação

Quando um driver solicita um IRP de espera/despertar, ele deve especificar uma rotina de retorno para que ele possa retornar o dispositivo ao estado de trabalho (D0) quando o evento de ativação ocorrer. Depois que o evento de ativação ocorrer e todos os drivers tiverem concluído o IRP, o sistema chamará a rotina de retorno de chamada passada para PoRequestPowerIrp.

Como essa rotina de retorno de chamada é definida em nome do driver que originou o IRP e não para um driver que está tratando o IRP, ele não deve chamar PoStartNextPowerIrp; somente as rotinas IoCompletion definidas à medida que os drivers passam o IRP para baixo na pilha devem iniciar o próximo IRP de energia. Tenha em mente que o proprietário da política não só envia o IRP, mas também o manipula. Assim, ele pode definir uma rotina IoCompletion à medida que transmite o IRP através da pilha, além de definir uma rotina de retorno de chamada ao solicitar o IRP de espera/despertar.

A rotina de retorno de chamada tem as seguintes responsabilidades:

  1. Se o driver controlar mais de um dispositivo, determine quais de seus dispositivos sinalizaram a ativação.

  2. Atenda ao evento que causou o sinal de ativação.

  3. Configure o dispositivo que sinalizou a ativação no estado D0 chamando PoRequestPowerIrp para enviar uma solicitação PowerDeviceD0. O driver também deve chamar PoSetPowerState para informar o power manager sobre o novo estado de energia do dispositivo. Para obter mais informações, consulte Envio de IRP_MN_QUERY_POWER ou IRP_MN_SET_POWER para estados de energia de dispositivo.

  4. Se o driver definir uma rotina Cancelar para o IRP, chame IoSetCancelRoutine para redefinir a rotina Cancelar para NULL.

  5. Se o driver possuir uma política de energia para mais de um dispositivo, decremente sua contagem de referência de espera/ativação. Se a contagem não for zero, indicando que outro dispositivo já havia enviado um IRP de espera/ativação, solicite outro IRP de espera/ativação (PoRequestPowerIrp) para seu PDO.

    Por exemplo, um dispositivo PCI pode ter a espera/ativação habilitada para um modem e uma Placa de Interface de Rede (NIC). Se a NIC ativar o sistema (concluindo assim o IRP), o PCI FDO deverá enviar outro IRP de espera/ativação para si mesmo para que o modem ainda possa ser ativado.

Como o driver que solicitou o IRP de espera/despertar controla a política de energia para sua pilha de dispositivos, ele é responsável por restaurar o dispositivo ao estado operacional quando o IRP for concluído. Embora drivers inferiores já possam ter a potência aplicada fisicamente ao dispositivo, o proprietário da política deve chamar PoRequestPowerIrp para enviar uma solicitação IRP_MN_SET_POWER para o estado de energia do dispositivo D0. Somente depois que todos os drivers na pilha de dispositivos tiverem processado esse IRP de energização, o dispositivo será retornado ao estado operacional.