IRP_MN_SET_POWER
Este IRP notifica a un controlador un cambio en el estado de alimentación del sistema o establece el estado de alimentación del dispositivo para un dispositivo.
Código principal
Cuándo se envió
El administrador de energía del sistema o el propietario de una directiva de energía del dispositivo pueden enviar este IRP.
El administrador de energía envía este IRP para notificar a los controladores un cambio en el estado de alimentación del sistema. Si un controlador ha registrado su dispositivo para la detección de inactividad, el administrador de energía envía este IRP para cambiar el estado de alimentación de un dispositivo inactivo.
Un controlador que posee la directiva de alimentación envía este IRP para establecer el estado de alimentación del dispositivo para su dispositivo. Un controlador debe llamar a PoRequestPowerIrp para enviar este IRP.
El administrador de energía envía este IRP en IRQL = PASSIVE_LEVEL a las pilas de dispositivos que establecen la marca DO_POWER_PAGABLE en el PDO. Los controladores de estas pilas pueden tocar código paginado o datos para completar la solicitud.
El administrador de energía puede enviar el IRP en IRQL = DISPATCH_LEVEL si se establece la marca de DO_POWER_INRUSH. Estos controladores no pueden acceder directa o indirectamente a ningún código paginado o datos.
Parámetros de entrada
El miembro Parameters.Power.Type especifica el tipo de estado de energía que se establece, ya sea SystemPowerState o DevicePowerState.
El miembro Parameters.Power.State especifica el propio estado de energía, como se indica a continuación:
Si Parameters.Power.Type es SystemPowerState, el valor es un enumerador del tipo SYSTEM_POWER_STATE .
Si Parameters.Power.Type es DevicePowerState, el valor es un enumerador del tipo DEVICE_POWER_STATE .
El miembro Parameters.Power.ShutdownType especifica información adicional sobre la transición solicitada. Los valores posibles para este miembro son POWER_ACTION valores de enumeración. Para obtener más información, consulte Acciones de energía del sistema.
A partir de Windows Vista, el miembro Parameters.Power.SystemPowerStateContext es una estructura de SYSTEM_POWER_STATE_CONTEXT parcialmente opaca de solo lectura que contiene información sobre los estados de energía del sistema anteriores de un equipo. Si Parameters.Power.Type es SystemPowerState y Parameters.Power.State es PowerSystemWorking, dos bits de marca en esta estructura indican si un inicio rápido o una reactivación desde hibernación hizo que el equipo entrara en el estado del sistema S0 (en funcionamiento). Para obtener más información, vea Distinguir inicio rápido de reactivación desde hibernación.
En la tabla siguiente se muestra el contenido de IRP_MN_SET_POWER. Parameters.Power. {State| ShutdownType} y los campos de bits CurrentSystemState, TargetSystemState y EffectiveSystemState de la estructura SYSTEM_POWER_STATE_CONTEXT para cada transición de energía del sistema. Cada fila representa un IRP_MN_SET_POWER.
Transición | State | Tipo de apagado | SystemState actual | SystemState de destino | SystemState efectivo | Comentarios |
---|---|---|---|---|---|---|
Dormir hasta... | S3 | En reposo | S0 | S3 | S3 | |
... Despertar | S0 | En reposo | S3 | S0 | S0 | |
Suspensión híbrida para... | S4 | Hibernar | S0 | S3 | S4 | Suspensión con archivo de hibernación (Fast S4) |
... Despertar | S0 | En reposo | S3 | S0 | S0 | |
... Wake/PwrLost | S0 | En reposo | S4 | S0 | S0 | |
Hibernar a... | S4 | Hibernar | S0 | S4 | S4 | |
... Despertar | S0 | En reposo | S4 | S0 | S0 | |
Apagado híbrido a... | S4 | Hibernar | S0 | S5 | S4 | Aplicaciones cerradas, el usuario ha cerrado la sesión como si se cerrara (arranque hiber) |
... Inicio rápido | S0 | En reposo | S4 | S0 | S0 | |
Apagar a... | S5 | Apagado, restablecimiento o desactivación | S0 | S5 | S5 | |
... Arranque del sistema | No hay S-IRP para el arranque |
Parámetros de salida
Parameters.Power.SystemContext está reservado para uso del sistema.
Bloque de estado de entrada/salida
Un controlador establece Irp-IoStatus.Status> en STATUS_SUCCESS para indicar que el dispositivo ha entrado en el estado solicitado.
Un controlador no debe producir un error en una solicitud para establecer el estado de alimentación del sistema.
Los controladores de función y filtro que se encuentran encima de un controlador de bus no deben producir un error en una solicitud para establecer un estado de alimentación del dispositivo. El controlador de bus puede producir un error en una solicitud de encendido del dispositivo si el dispositivo se quita o en el proceso de eliminación.
Operación
El administrador de energía o un controlador pueden solicitar un IRP de IRP_MN_SET_POWER . El administrador de energía envía este IRP por uno de los siguientes motivos:
Para notificar a los controladores un cambio en el estado de alimentación del sistema
Para cambiar el estado de energía de un dispositivo para el que el administrador de energía está realizando la detección de inactividad
Para reafirmar el estado actual del sistema después de que un controlador produzca un error en una solicitud de IRP_MN_QUERY_POWER para un estado de alimentación del sistema. Para obtener más información, consulte IRP_MN_QUERY_POWER.
Un controlador que posee la directiva de energía del dispositivo envía IRP_MN_SET_POWER para cambiar el estado de alimentación de su dispositivo.
En un momento dado, el sistema solo permite que uno de estos IRP esté activo para cada objeto de dispositivo.
Cada controlador debe pasar cada IRP de alimentación al controlador inferior siguiente llamando a IoCallDriver (a partir de Windows Vista) o PoCallDriver (Windows Server 2003, Windows XP y Windows 2000). La interfaz PoCallDriver es similar a la de IoCallDriver, salvo que el subsistema de administración de energía podría retrasar el IRP antes de pasarlo al siguiente controlador. Por ejemplo, se pueden producir retrasos en una solicitud de PowerDeviceD0 si el dispositivo requiere corriente de pincel y, por lo tanto, debe encenderse en serie con otro dispositivo de este tipo.
Después de que un controlador reciba una solicitud de IRP_MN_SET_POWER en Windows Server 2003, Windows XP o Windows 2000, un controlador debe llamar a PoStartNextPowerIrp, como se describe en Llamar a PoStartNextPowerIrp. A partir de Windows Vista, no es necesario llamar a PoStartNextPowerIrp y, por tanto, una llamada no realiza ninguna operación de administración de energía.
IRP_MN_SET_POWER para estados de energía del sistema
Solo el administrador de energía del sistema puede enviar un IRP de set-power del sistema.
Un controlador no debe producir un error en una solicitud para establecer el estado de alimentación del sistema.
Siempre que sea posible, el administrador de energía envía IRP_MN_QUERY_POWER antes de enviar IRP_MN_SET_POWER para solicitar un estado de suspensión del sistema. Sin embargo, en algunas condiciones (como el usuario que presiona el botón Apagar o una batería expira), el administrador de energía podría emitir IRP_MN_SET_POWER sin consultar primero. El administrador de energía solo consulta los estados de suspensión; nunca consulta antes de encenderse.
La solicitud de IRP_MN_SET_POWER se envía al controlador superior de la pila de dispositivos de un dispositivo. El controlador superior pasa el IRP hacia abajo hasta el siguiente controlador inferior y así sucesivamente hasta que el IRP llega al conductor del autobús, que debe completar el IRP.
Normalmente, un controlador de filtro no necesita actuar en un IRP de configuración del sistema, excepto para pasarlo.
Sin embargo, el propietario de la directiva de energía del dispositivo establece una rutina de IoCompletion antes de pasar el IRP. En la rutina IoCompletion , envía una solicitud de IRP_MN_SET_POWER para un IRP de alimentación del dispositivo. Para obtener más información, consulte Control de un IRP del sistema Set-Power en un propietario de la directiva de energía del dispositivo.
Un IRP de set-power del sistema informa a los controladores de que un cambio en el estado de alimentación del sistema es inminente y los conductores deben prepararse para él. Sin embargo, un controlador no debe cambiar el estado de alimentación de su dispositivo hasta que reciba un IRP_MN_SET_POWER para un estado de alimentación del dispositivo .
El valor de Parameters.Power.ShutdownType proporciona información adicional sobre las acciones pendientes. Cuando IRP especifica PowerSystemShutdown (S5), un controlador puede determinar si el sistema se está restableciendo (PowerActionShutdownReset) o apagando indefinidamente para reiniciarlo más adelante (PowerActionShutdownOff). En el caso de los controladores de la mayoría de los dispositivos, la diferencia es inconsecuente. Sin embargo, para determinados dispositivos, como los dispositivos de streaming de vídeo, un controlador podría apagar el dispositivo para detener la E/S cuando el sistema se restablezca.
En Windows 2000 y versiones posteriores del sistema operativo, el valor de ShutdownType también puede ser PowerActionShutdown. En este caso, el controlador no puede indicar qué tipo de apagado se solicita y, por tanto, debe continuar como para un restablecimiento.
Estados de energía del dispositivo
Los controladores de función y filtro que se encuentran encima de un controlador de bus no deben producir un error en una solicitud para establecer un estado de alimentación del dispositivo. El controlador de bus puede producir un error en una solicitud de encendido del dispositivo si el dispositivo se quita o en el proceso de eliminación.
Un controlador debe establecer el dispositivo en el estado solicitado antes de completar el IRP.
Cuando el IRP solicita una transición a un estado de energía inferior, los controladores deben controlar el IRP a medida que recorre la pila del dispositivo, guardando cualquier contexto que el controlador necesite restaurar el dispositivo al estado de trabajo. Después de que un conductor de autobús reciba un IRP, el conductor:
Guarda cualquier contexto que necesite el controlador para restaurar el dispositivo al estado de trabajo.
Establece el dispositivo en el estado de alimentación solicitado.
Llama a PoSetPowerState para notificar al administrador de energía.
Llama a PoStartNextPowerIrp para iniciar el siguiente IRP de energía (solo Windows Server 2003, Windows XP y Windows 2000).
Completa el IRP de alimentación del dispositivo.
El controlador debe completar este IRP de forma oportuna. En general, los conductores deben evitar cualquier retraso que un usuario típico encuentre notablemente lento. Por ejemplo, un controlador podría retrasar un cambio de estado del sistema para vaciar los datos de red o disco almacenados en caché, pero no debe mantener activa una conexión de red ni dar formato a una cinta. Para obtener más información, consulte Paso de IRP de Power.
En Windows 2000 y versiones posteriores del sistema operativo, si el IRP especifica PowerDeviceD1, PowerDeviceD2 o PowerDeviceD3, y un IRP de configuración del sistema está activo, el valor de Parameters.Power.ShutdownType proporciona información sobre el IRP del sistema.
Los controladores de los dispositivos en la ruta de acceso de hibernación deben inspeccionar este valor. Si irP solicita PowerDeviceD3 y ShutdownType es PowerActionHibernate, este controlador debe guardar cualquier contexto necesario para restaurar el dispositivo, pero no debe apagar el dispositivo; el dispositivo entrará en el estado D3 cuando la máquina pierda energía.
En Windows 2000 y versiones posteriores del sistema operativo, los controladores no deben confiar en el valor de ShutdownType si el estado de energía solicitado es PowerDeviceD0.
En Windows 98/Me, si el IRP solicita un estado de alimentación del dispositivo, shutdownType siempre es PowerActionNone.
El controlador que determina cuándo apagar un dispositivo varía en función de la clase de dispositivo.
El controlador que determina cuándo encender un dispositivo es casi siempre un controlador que accede a los registros del dispositivo. El controlador debe comprobar que el dispositivo está en estado D0 antes de acceder a los registros de hardware del dispositivo. Si el dispositivo no está en estado D0, el controlador debe llamar a PoRequestPowerIrp para enviar un IRP para encender el dispositivo. Un controlador no puede acceder a su dispositivo a menos que el dispositivo esté en estado D0.
Cuando un controlador recibe un IRP de encendido establecido para el estado del dispositivo D0, establece una rutina de IoCompletion y pasa el IRP al siguiente controlador inferior.
Cuando el IRP alcanza el controlador de autobús, ese controlador aplica (o restablece) energía al dispositivo, llama a PoStartNextPowerIrp (Windows Server 2003, Windows XP y Windows 2000 solo) y llama a PoSetPowerState para informar al administrador de energía del nuevo estado de energía para el dispositivo.
Una vez que el controlador de autobús completa el IRP de encendido, los controladores de función y filtro controlan el IRP en sus rutinas de IoCompletion a medida que recorre la copia de seguridad de la pila del dispositivo. En la rutina IoCompletion , cada controlador restaura o reinicializa su contexto de dispositivo y realiza cualquier otra tarea de inicio necesaria.
Para obtener más información, consulte Control de IRP_MN_SET_POWER para estados de energía del dispositivo.
Requisitos
Encabezado |
Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h) |