Compartir a través de


IRP de energía para el sistema

Un IRP de alimentación del sistema 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 SystemPowerState en el miembro Power.Type de la pila IRP. Sólo el administrador de energía puede enviar este TIPO de IRP; un controlador no puede enviar un IRP de alimentación del sistema.

El administrador de energía envía un IRP de alimentación del sistema por uno de los siguientes motivos:

  • Para cambiar el estado de alimentación del sistema en respuesta a un tiempo de espera de inactividad, un cambio en la actividad del sistema, una solicitud de usuario o una batería que expira (IRP_MN_SET_POWER)

  • Para consultar dispositivos para determinar si el sistema puede ir a suspensión (IRP_MN_QUERY_POWER)

  • Para reafirmar el estado actual de energía del sistema después de una consulta (IRP_MN_SET_POWER)

El administrador de energía envía IRP_MN_QUERY_POWER y IRP_MN_SET_POWER solicitudes en nombre del sistema. Un controlador puede producir un error en una solicitud de IRP_MN_QUERY_POWER , pero no puede producir un error IRP_MN_SET_POWER.

Por ejemplo, para cambiar el estado de energía del sistema, el administrador de energía envía un IRP de alimentación del sistema al controlador superior de la pila en cada nodo de dispositivo del árbol de dispositivos. En la ilustración siguiente se muestra cómo los controladores de una sola pila de dispositivos controlan un IRP de alimentación del sistema.

diagrama que ilustra la ruta de acceso de un irp de energía del sistema.

Como se muestra en la ilustración anterior:

  1. El administrador de energía llama al administrador de E/S para enviar un IRP de energía del sistema a cada nodo hoja del árbol de dispositivos.

  2. Los controladores controlan irP si es posible, establecen rutinas de IoCompletion si es necesario y llaman a IoCallDriver (Windows 7 y Windows Vista) o PoCallDriver (Windows Server 2003, Windows XP y Windows 2000) para reenviar el IRP a la pila. Si un controlador debe producir un error en el IRP, el controlador lo hace inmediatamente y completa el IRP. Los controladores pueden producir errores IRP_MN_QUERY_POWER IRP, pero no deben producir errores IRP_MN_SET_POWER IRP que establecen el estado de alimentación del sistema.

  3. Cuando el controlador que posee la directiva de energía para el dispositivo recibe el IRP, ese controlador establece una rutina de IoCompletion para el IRP del sistema y, a continuación, reenvía el IRP.

  4. Cualquier otro controlador de la pila controla irP si es posible, establezca rutinas de IoCompletion si es necesario y reenvíe el IRP al controlador inferior siguiente, como en el paso 2.

  5. Finalmente, el conductor del autobús recibe y completa el IRP del sistema.

  6. El administrador de E/S llama a las rutinas de IoCompletion establecidas como controladores que pasaron el IRP del sistema a la pila de dispositivos.

  7. En su rutina de IoCompletion , el propietario de la directiva de energía del dispositivo llama a PoRequestPowerIrp para enviar un IRP de energía del dispositivo, especificando un estado de alimentación del dispositivo que es válido para el estado de energía del sistema en el IRP del sistema. El controlador establece una rutina de devolución de llamada que se invocará cuando se complete el IRP de alimentación del dispositivo.

    Si es necesario, el controlador consulta al miembro DeviceState en su copia almacenada en caché de la estructura de DEVICE_CAPABILITIES (consulte Reporting Device Power Capabilities) para determinar qué estados de alimentación del dispositivo corresponden al estado de alimentación del sistema en el IRP.

  8. Una vez completado el IRP del dispositivo y que se hayan ejecutado las rutinas de finalización de IRP del dispositivo, se invoca la rutina de devolución de llamada del propietario de la directiva de energía. En la rutina de devolución de llamada, el controlador copia su estado devuelto en el IRP del sistema. En Windows Server 2003, Windows XP y Windows 2000, la devolución de llamada llama a PoStartNextPowerIrp para iniciar el siguiente IRP de energía. Sin embargo, en Windows 7 y Windows Vista, no es necesario llamar a PoStartNextPowerIrp y esta llamada no realiza ninguna operación de administración de energía. Por último, la devolución de llamada llama a IoCompleteRequest para completar el IRP del sistema.

Para obtener más información, consulte Control de solicitudes de estado de energía del sistema.

Dado que algunos dispositivos requieren un pincel de corriente cuando se encienden, los IRP de alimentación del sistema se controlan de forma sincrónica y serial en todo el sistema. Solo uno de estos IRP puede estar activo a la vez. Para obtener más información, vea Llamar a IoCallDriver frente a llamar a PoCallDriver.