Compartilhar via


Rotinas de retorno de chamada de espera/ativação

Quando um driver solicita um IRP de espera/ativação, ele deve especificar uma rotina de retorno de chamada para que ele possa retornar o dispositivo para o 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, ela 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 o manipula e, portanto, pode definir uma rotina IoCompletion à medida que passa o IRP para baixo na pilha, além de definir uma rotina de retorno de chamada quando solicitar o IRP de espera/ativação.

A rotina de retorno de chamada tem as seguintes responsabilidades:

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

  2. Serviço o evento que causou o sinal de ativação.

  3. Defina 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 gerenciador de energia do novo estado de energia do dispositivo. Para obter mais informações, consulte Enviando IRP_MN_QUERY_POWER ou IRP_MN_SET_POWER para estados de energia do 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 a política de energia para mais de um dispositivo, decremente sua contagem de referência de espera/ativação. Se a contagem for diferente de 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 NIC (placa de interface de rede). 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/ativação controla a política de energia para sua pilha de dispositivos, ele é responsável por retornar seu dispositivo para o estado de trabalho quando o IRP é concluído. Embora drivers inferiores já possam já ter aplicado energia 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 manipulado esse IRP de ativação o dispositivo será retornado ao estado de trabalho.