Rutinas de devolución de llamada de espera/reactivación
Cuando un controlador solicita un IRP de espera o reactivación, debe especificar una rutina de devolución de llamada para que pueda devolver el dispositivo al estado de trabajo (D0) cuando se produzca el evento de reactivación. Una vez que se produce el evento de reactivación y todos los controladores han completado el IRP, el sistema llama a la rutina de devolución de llamada pasada a PoRequestPowerIrp.
Dado que esta rutina de devolución de llamada se establece en nombre del controlador que originó el IRP ,y no para un controlador que controla el IRP, no debe llamar a PoStartNextPowerIrp; solo las rutinas de IoCompletion establecidas como controladores pasan el IRP hacia abajo la pila debe iniciar el siguiente IRP de energía. Tenga en cuenta que el propietario de la directiva no solo envía el IRP, sino que lo controla y, por tanto, podría establecer una rutina de IoCompletion a medida que pasa el IRP por la pila además de establecer una rutina de devolución de llamada cuando solicita el IRP de espera/reactivación.
La rutina de devolución de llamada tiene las siguientes responsabilidades:
Si el controlador controla más de un dispositivo, determine cuál de sus dispositivos señalizaron la reactivación.
Service el evento que provocó la señal de reactivación.
Establezca el dispositivo que señalaba la reactivación en el estado D0 llamando a PoRequestPowerIrp para enviar una solicitud de PowerDeviceD0 . El controlador también debe llamar a PoSetPowerState para informar al administrador de energía del nuevo estado de alimentación del dispositivo. Para obtener más información, consulte Envío de IRP_MN_QUERY_POWER o IRP_MN_SET_POWER para estados de energía del dispositivo.
Si el controlador establece una rutina Cancel para IRP, llame a IoSetCancelRoutine para restablecer la rutina Cancel a NULL.
Si el controlador posee la directiva de energía para más de un dispositivo, disminuya su recuento de referencias de espera/reactivación. Si el recuento es distinto de cero, lo que indica que otro dispositivo había enviado previamente un IRP de espera/reactivación, solicite otro IRP de espera/reactivación (PoRequestPowerIrp) para su PDO.
Por ejemplo, un dispositivo PCI podría tener habilitada la espera o reactivación para un módem y una tarjeta de interfaz de red (NIC). Si la NIC reactiva el sistema (completando el IRP), el FDO PCI debe enviar otro IRP de espera/reactivación a sí mismo para que el módem siga siendo capaz de reactivarse.
Dado que el controlador que solicitó la directiva de energía IRP de espera/reactivación para su pila de dispositivos, es responsable de devolver su dispositivo al estado de trabajo cuando se completa el IRP. Aunque es posible que los controladores inferiores ya hayan aplicado energía físicamente al dispositivo, el propietario de la directiva debe llamar a PoRequestPowerIrp para enviar una solicitud de IRP_MN_SET_POWER para el estado de alimentación del dispositivo D0. Solo después de que todos los controladores de la pila de dispositivos hayan controlado este IRP de encendido devolverá el dispositivo al estado de trabajo.