IRP_MN_WAIT_WAKE

Este IRP permite a un controlador despertar un sistema de suspensión o despertar un dispositivo en suspensión.

Código principal

IRP_MJ_POWER

Cuándo se envió

Un controlador que posee la directiva de energía se dirige a este IRP a su PDO para permitir que su dispositivo se desencien en respuesta a un evento externo, como una llamada telefónica entrante. Un controlador debe llamar a PoRequestPowerIrp para enviar este IRP.

Como regla general, un controlador debe enviar este IRP tan pronto como determine que su dispositivo debe estar habilitado para reactivación. Por lo tanto, los controladores para la mayoría de estos dispositivos envían este IRP después de encender sus dispositivos y antes de completar la solicitud de IRP_MN_START_DEVICE .

Sin embargo, un controlador puede enviar el IRP cada vez que el dispositivo esté en estado de trabajo (PowerDeviceD0). La pila de dispositivos no debe estar en transición; es decir, un controlador no debe enviar un IRP_MN_WAIT_WAKE mientras cualquier otro IRP de energía está activo en su pila de dispositivos.

Un IRP de espera/reactivación no cambia el estado de alimentación del dispositivo o del sistema. Simplemente habilita una señal de reactivación desde el dispositivo. Cuando llegue la señal de reactivación, el propietario de la directiva debe llamar a PoRequestPowerIrp para enviar un IRP de set-power para devolver su dispositivo a D0.

El controlador debe ejecutarse en IRQL = PASSIVE_LEVEL para enviar este IRP. Sin embargo, el IRP se puede completar en IRQL = DISPATCH_LEVEL.

Parámetros de entrada

Parameters.WaitWake.PowerState contiene el estado de alimentación del sistema más bajo (menos alimentado) desde el que se debe permitir que el dispositivo despierte el sistema.

Parámetros de salida

Ninguno.

Bloque de estado de entrada/salida

Un controlador establece Irp-IoStatus.Status> en uno de los siguientes elementos:

STATUS_PENDING
El controlador recibió el IRP y está esperando a que el dispositivo señale de reactivación.

STATUS_INVALID_DEVICE_STATE
El dispositivo está en un estado menos alimentado que el estado DeviceWake especificado en la estructura de DEVICE_CAPABILITIES para el dispositivo o el dispositivo no puede despertar el sistema del estado SystemWake pasado en el IRP.

STATUS_NOT_SUPPORTED
El dispositivo no admite reactivación.

STATUS_DEVICE_BUSY
Una solicitud de IRP_MN_WAIT_WAKE ya está pendiente y debe completarse o cancelarse antes de que se pueda emitir otra solicitud de IRP_MN_WAIT_WAKE.

STATUS_SUCCESS
El dispositivo ha señalado un evento de reactivación.

STATUS_CANCELLED
El IRP se ha cancelado.

Si un controlador debe producir un error en este IRP, completa el IRP inmediatamente y no pasa el IRP al controlador inferior siguiente.

Operación

Un controlador envía IRP_MN_WAIT_WAKE por dos motivos:

  1. Para permitir que su dispositivo despierte un sistema de suspensión en respuesta a una señal de reactivación externa.

  2. Para permitir que su dispositivo se despierte de un estado de suspensión del dispositivo en respuesta a una señal de reactivación externa.

El IRP debe pasarse la pila de dispositivos al controlador de bus del dispositivo, que llama a IoMarkIrpPending y devuelve STATUS_PENDING de su rutina DispatchPower . El IRP permanece pendiente hasta que se produzca una señal de reactivación o hasta que el controlador que envió el IRP lo cancele.

Solo se puede mantener un IRP de espera/reactivación pendiente para un PDO en un momento dado. Si un controlador ya contiene un IRP de espera o reactivación para un PDO, debe producir un error en cualquier IRP adicional con STATUS_DEVICE_BUSY. Un controlador que enumera más de un PDO secundario puede tener un IRP de espera o reactivación pendiente para cada uno de estos PDO.

Cada controlador establece una rutina de IoCompletion a medida que irP viaja por la pila de dispositivos. Cuando el dispositivo señala un evento de reactivación, el controlador de bus atiende la señal de reactivación y completa el IRP, devolviendo STATUS_SUCCESS. A continuación, el administrador de E/S llama a la rutina IoCompletion del siguiente controlador superior, etc.

Cuando un controlador envía un IRP de espera o reactivación, debe especificar una rutina de devolución de llamada en la llamada PoRequestPowerIrp . En la rutina de devolución de llamada, el controlador normalmente atiende el dispositivo. Por ejemplo, el propietario de la directiva de energía del dispositivo debe llamar a PoRequestPowerIrp para enviar un IRP_MN_SET_POWER para el estado del dispositivo D0.

Un controlador que actúa como controlador de bus para un dispositivo y el propietario de la directiva de un dispositivo primario solicita un IRP IRP_MN_WAIT_WAKE para la pila de dispositivos del elemento primario cuando recibe una solicitud de IRP_MN_WAIT_WAKE de un PDO secundario. Si el controlador enumera más de un PDO secundario, solo debe solicitar un IRP de espera o reactivación para la pila de dispositivos del elemento primario, independientemente del número de PDO secundarios que envíen solicitudes de espera/reactivación. En su lugar, este controlador debe mantener un recuento interno de IRP de espera/reactivación, incrementando el recuento cada vez que recibe una solicitud y disminuyendo el recuento cada vez que completa una solicitud. Si el recuento es distinto de cero después de haber completado un IRP de espera/reactivación, el controlador debe enviar otro IRP de espera/reactivación a su pila de dispositivos a "rearm" en sí mismo para reactivación. Para obtener más información, consulte Descripción de la ruta de acceso de los IRP de espera y reactivación a través de un árbol de dispositivos.

Para cancelar un IRP_MN_WAIT_WAKE, un controlador llama a IoCancelIrp. Solo el controlador que originó el IRP puede cancelarlo. Un controlador cancela una IRP_MN_WAIT_WAKE pendiente cuando se produce alguna de las siguientes acciones:

  • El controlador recibe un IRP de PnP que detiene o quita el dispositivo.

  • El sistema va a dormir y la señal de reactivación del dispositivo no debe despertarla.

Requisitos

Encabezado

Wdm.h (incluya Wdm.h, Ntddk.h o Ntifs.h)

Consulte también

PoRequestPowerIrp