Enviar un IRP de Set-Power de dispositivo en respuesta a un IRP del sistema Set-Power IRP
El propietario de la directiva de energía del dispositivo debe realizar los siguientes pasos para responder a un IRP de configuración del sistema:
Llame a IoAcquireRemoveLock, pasando el IRP actual como parámetro Tag, para asegurarse de que el controlador no recibe una solicitud de Plug and Play IRP_MN_REMOVE_DEVICE mientras controla el IRP de energía.
Si IoAcquireRemoveLock devuelve un estado de error, el controlador no debe seguir procesando el IRP. En su lugar, a partir de Windows Vista, el controlador debe llamar a IoCompleteRequest para completar la solicitud y, a continuación, devolver el estado del error. En Windows Server 2003, Windows XP y Windows 2000, el controlador debe llamar primero a PoStartNextPowerIrp, llamar a IoCompleteRequest para completar el IRP y, a continuación, devolver el estado de error.
Configure la ubicación de la pila IRP para el controlador inferior siguiente mediante una llamada a IoCopyCurrentIrpStackLocationToNext.
Establezca una rutina de IoCompletion en el IRP del conjunto de energía del sistema.
Llame a IoMarkIrpPending para marcar el IRP establecido por el sistema como pendiente.
Llame a IoCallDriver (a partir de Windows Vista) o PoCallDriver (en Windows Server 2003, Windows XP y Windows 2000) para pasar el IRP de configuración del sistema al controlador inferior siguiente.
Devuelve STATUS_PENDING de su rutina DispatchPower .
En la rutina IoCompletion (consulte el paso 3 de la lista anterior), el propietario de la directiva de energía del dispositivo envía un IRP de energía de conjunto de dispositivos de la siguiente manera:
Inspeccione el IRP de configuración del sistema para obtener el estado de alimentación del sistema solicitado. Elija un estado de alimentación del dispositivo adecuado para ese estado de alimentación del sistema. Para obtener más información, consulte Determinar el estado correcto de energía del dispositivo.
Llame a PoRequestPowerIrp para enviar un IRP_MN_SET_POWER para el estado de alimentación del dispositivo determinado en el paso 1. El propietario de la directiva de energía debe enviar la solicitud de configuración de energía del dispositivo incluso si el dispositivo ya está en ese estado.
Especifique una rutina de devolución de llamada de finalización de energía (CompletionFunction) en la llamada a PoRequestPowerIrp y pase el IRP set-power del sistema en el búfer de contexto .
Devuelve STATUS_MORE_PROCESSING_REQUIRED de la rutina IoCompletion para que el controlador pueda terminar de procesar el IRP de configuración del sistema en la rutina de devolución de llamada de finalización de energía.
Recuerde que el propietario de la directiva de energía del dispositivo no solo envía el IRP del conjunto de dispositivos, sino que también debe controlar este IRP a medida que viaja a través de la pila de dispositivos. Por lo tanto, un propietario de la directiva de energía del dispositivo podría no tener solo una rutina de devolución de llamada de finalización de energía asociada con el IRP de encendido del conjunto de dispositivos y una rutina de IoCompletion para el IRP de configuración del sistema, sino también una rutina de ioCompletion para el IRP de conjunto de dispositivos. Para obtener más información, consulte Control de IRP_MN_SET_POWER para estados de energía del dispositivo.
Después de que el administrador de E/S llame a todas las rutinas de IoCompletion que se establecieron a medida que el IRP del conjunto de dispositivos ha recorrido la pila del dispositivo, el administrador de E/S llama a la rutina de devolución de llamada de finalización de energía. En este momento, todos los controladores de la pila han completado el IRP del conjunto de dispositivos y la transición de energía del dispositivo se ha completado.
La rutina de devolución de llamada de finalización de energía debe hacer lo siguiente:
Llame a PoStartNextPowerIrp para iniciar el siguiente IRP de energía. (Solo Windows Server 2003, Windows XP y Windows 2000).
Complete el IRP de set-power del sistema (IoCompleteRequest) con el estado devuelto para el IRP de set-power del dispositivo.
Llame a IoReleaseRemoveLock para liberar el bloqueo adquirido anteriormente.
Devuelve el estado con el que se completaron los IRP de set-power.