Share via


Controlar un IRP del sistema Query-Power en un propietario de la directiva de energía de dispositivo

Cuando un propietario de la directiva de energía de dispositivo recibe un IRP_MN_QUERY_POWER para un estado de energía del sistema, responde pasando la consulta y, en una rutina de IoCompletion , enviando un IRP_MN_QUERY_POWER para un estado de alimentación del dispositivo. Cuando todos los controladores de la pila hayan completado la consulta del dispositivo, el propietario de la directiva de energía del dispositivo completa la consulta del sistema.

Un propietario de la directiva de energía del dispositivo debe seguir los pasos siguientes en su rutina DispatchPower para responder a una consulta del sistema:

  1. Llame a IoAcquireRemoveLock, pasando el IRP actual, para asegurarse de que el controlador no recibe una solicitud de IRP_MN_REMOVE_DEVICE PnP 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 el IRP y devolver el estado de error. En Windows Server 2003, Windows XP y Windows 2000, el controlador debe llamar a PoStartNextPowerIrp, llamar a IoCompleteRequest para completar el IRP y devolver el estado de error.

  2. Asegúrese de que el controlador puede admitir el estado de alimentación del sistema consultado, como se describe en Error de un sistema Query-Power IRP en un filtro o controlador de funciones. Si no es así, complete el IRP con un estado de error como se describe en esa sección.

    Sin embargo, un controlador no debe producir un error en una consulta para S4 (PowerSystemHibernate) si su dispositivo está habilitado para reactivación, pero no puede reactivar el sistema desde el estado de hibernación. En este caso, el propietario de la directiva de energía para el controlador (que envió el IRP_MN_WAIT_WAKE) debe cancelar el IRP de espera o reactivación y realizar correctamente la consulta del sistema. Para obtener más información, vea Cancelar un IRP de espera o reactivación.

  3. Si el controlador puede admitir el estado de energía del sistema consultado, llame a IoMarkIrpPending.

  4. Configure la ubicación de la pila IRP para el controlador inferior siguiente mediante una llamada a IoCopyCurrentIrpStackLocationToNext.

  5. Establezca una rutina de IoCompletion en el IRP de power query del sistema.

  6. Llame a IoCallDriver (en Windows 7 y Windows Vista) o PoCallDriver (en Windows Server 2003, Windows XP y Windows 2000) para pasar el IRP al controlador inferior siguiente.

  7. Devuelve STATUS_PENDING.

La rutina IoCompletion debe hacer lo siguiente:

  1. Compruebe Irp-IoStatus.Status> para asegurarse de que los controladores inferiores hayan completado el IRP correctamente. Si un controlador inferior ha especificado un valor NTSTATUS no correcto, la rutina IoCompletion debe devolver el valor NTSTATUS.

  2. Si los controladores inferiores han completado correctamente el IRP, llame a PoRequestPowerIrp para enviar un IRP de consulta de dispositivo para un estado de alimentación del dispositivo válido para el estado de alimentación del sistema consultado. Si es necesario, consulte la matriz DEVICE_STATE en la estructura de DEVICE_CAPABILITIES para determinar qué estados de alimentación del dispositivo son válidos para el estado de alimentación del sistema consultado.

  3. Especifique una rutina de devolución de llamada (parámetro CompletionFunction ) en la llamada a PoRequestPowerIrp y pase el IRP del sistema en el área Contexto .

  4. Devuelve STATUS_MORE_PROCESSING_REQUIRED para que el controlador pueda terminar de procesar el IRP de consulta del sistema en la rutina de devolución de llamada.

Una vez completado el IRP y se han ejecutado todas las rutinas de IoCompletion establecidas durante el procesamiento de IRP, el administrador de energía, a través del administrador de E/S, llama a la rutina de devolución de llamada del administrador de directivas de energía (el parámetro CompletionFunction a PoRequestPowerIrp). La rutina de devolución de llamada, a su vez, debe hacer lo siguiente:

  1. Llame a PoStartNextPowerIrp para iniciar el siguiente IRP de energía. (Solo Windows Server 2003, Windows XP y Windows 2000).

  2. Complete el IRP de consulta del sistema (llame a IoCompleteRequest) con el estado devuelto para el IRP de consulta de consulta del dispositivo.

  3. Llame a IoReleaseRemoveLock para liberar el bloqueo adquirido anteriormente.

Recuerde que el propietario de la directiva de energía del dispositivo no solo envía la consulta del dispositivo, sino que también debe controlarla en su camino hacia abajo de la pila del dispositivo. Para obtener más información, consulte Control de IRP_MN_QUERY_POWER para estados de energía del dispositivo.