POWER IRP para dispositivos individuales
Un IRP de alimentación del dispositivo especifica el código IRP principal IRP_MJ_POWER, uno de los códigos IRP de alimentación secundaria que se enumeran a continuación y el valor DevicePowerState en el miembro Power.Type .
Todos los controladores de una pila de dispositivos reciben estos IRP; normalmente, solo el administrador de directivas de energía del dispositivo puede enviar estos IRP. Sin embargo, el administrador de energía puede enviar un IRP de energía del dispositivo al realizar la detección de inactividad en nombre de un dispositivo, como se explica en Uso de rutinas de Power Manager para la detección de inactividad.
Un controlador envía un IRP de alimentación del dispositivo por cualquiera de los siguientes motivos:
Para consultar o cambiar el estado de alimentación del dispositivo en respuesta a un IRP de alimentación del sistema
Para poner el dispositivo en estado de suspensión para conservar la energía
Para devolver el dispositivo al estado de trabajo después de que se haya dormido
Para permitir que el dispositivo se despierte en respuesta a una señal externa
Para obtener un valor de secuencia de energía al encender un dispositivo
En la ilustración siguiente se muestra la secuencia de pasos que se producen para enviar, reenviar y completar un IRP de alimentación del dispositivo.
Como se muestra en la ilustración anterior, se envía, reenvía y completa un IRP de alimentación del dispositivo en los pasos siguientes:
El propietario de la directiva de energía del dispositivo llama a PoRequestPowerIrp para asignar un IRP de energía del dispositivo, especificando el PDO que es el destino del IRP y una rutina de devolución de llamada que se invocará cuando se complete el IRP.
El administrador de energía asigna un IRP de energía del dispositivo y lo envía al controlador superior de la pila de dispositivos para el PDO de destino.
El controlador realiza las siguientes acciones:
Establece una rutina de IoCompletion si es necesario.
Llama a PoStartNextPowerIrp (Windows Server 2003, Windows XP y Windows 2000) si no se usa una rutina de finalización. A partir de Windows Vista, esta llamada no es necesaria y dicha llamada no realiza ninguna operación de administración de energía.
Llama a IoCallDriver (Windows 7 y Windows Vista) o llama a PoCallDriver (Windows Server 2003, Windows XP y Windows 2000) para pasar el IRP al controlador inferior siguiente.
Cada controlador de la pila lo hace hasta que el IRP llegue al conductor del autobús. Si un controlador debe producir un error en el IRP, debe hacerlo inmediatamente y llamar a IoCompleteRequest.
El controlador de bus, que mantiene el PDO del dispositivo, realiza la acción solicitada y, a continuación, llama a IoCompleteRequest para completar el IRP. Un controlador de bus puede producir un error en un IRP de encendido del dispositivo si se quita un dispositivo o en el proceso de eliminación.
El administrador de E/S llama a las rutinas de IoCompletion que establecieron los controladores a medida que pasaron el IRP a la pila. Después de llamar a todas las rutinas de IoCompletion , se ejecuta la rutina de devolución de llamada.
Para obtener más información sobre los IRP de energía de dispositivos, consulte Administración de energía para dispositivos individuales y dispositivos auxiliares que tienen Wake-Up funcionalidades. Para más información sobre el IRP de secuencia de energía, consulte IRP_MN_POWER_SEQUENCE.