Compartir a través de


Control de irP de Power-Up de dispositivos

Los IRP de encendido del dispositivo especifican IRP_MN_SET_POWER y un estado de alimentación del dispositivo que requiere más energía que el estado de alimentación del dispositivo actual. Normalmente, un IRP de encendido especifica el estado de funcionamiento del dispositivo PowerDeviceD0.

Las solicitudes para encender un dispositivo deben ser administradas primero por el controlador de bus subyacente para el dispositivo y, a continuación, por cada controlador sucesivo que vuelva a la pila.

En la ilustración siguiente se muestran los pasos necesarios para controlar un IRP de encendido.

diagrama que ilustra el control de una solicitud de encendido del dispositivo.

Al controlar una solicitud de IRP_MN_SET_POWER de encendido, una función o un controlador de filtro debe:

  • Llame a IoAcquireRemoveLock para asegurarse de que el controlador no recibe una solicitud de IRP_MN_REMOVE_DEVICE mientras controla el IRP de encendido.

    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, a continuación, devolver el estado de error. En Windows Server 2003, Windows XP y Windows 2000, el controlador debe llamar a IoCompleteRequest para completar el IRP y, a continuación, llamar a PoStartNextPowerIrp para iniciar el siguiente IRP de energía y, a continuación, devolver el estado del error.

  • Llame a IoMarkIrpPending para marcar el IRP pendiente.

  • Llame a IoCopyCurrentIrpStackLocationToNext para establecer la ubicación de la pila IRP. Un controlador no debe llamar a IoSkipCurrentIrpStackLocation si establece una rutina de IoCompletion .

  • Llame a IoSetCompletionRoutine para establecer una rutina de IoCompletion de encendido.

    Al controlar un IRP de encendido del dispositivo, el controlador debe establecer una rutina de IoCompletion para restaurar el contexto, liberar el bloqueo de eliminación y realizar otras tareas necesarias una vez completado el IRP y el dispositivo se enciende. El controlador no debe restaurar el contexto antes de que se haya completado el IRP. Para obtener más información, consulte Rutinas de IoCompletion para IRP de power del dispositivo.

  • Llame a IoCallDriver (en Windows 7 y Windows Vista) o PoCallDriver (Windows Server 2003, Windows XP y Windows 2000) para pasar el IRP al controlador inferior siguiente. El IRP debe viajar hasta el controlador del bus hasta la pila del dispositivo. Solo se permite que el conductor del autobús complete el IRP.

  • Devuelve STATUS_PENDING.

Cuando el controlador de autobús recibe el IRP, primero debe comprobar para asegurarse de que el dispositivo todavía está presente y no se ha quitado o reemplazado mientras está dormido. Si el dispositivo ya no está presente, el controlador de bus debe llamar a IoInvalidateDeviceRelations en el dispositivo primario para notificar al administrador de Plug and Play que el dispositivo ha desaparecido. En esta situación, el controlador de bus puede producir un error en el IRP de encendido del dispositivo.

Si el dispositivo sigue presente, el controlador de bus realiza las tareas necesarias para devolver el dispositivo a una condición operativa, llama a PoSetPowerState para informar al administrador de energía del nuevo estado de alimentación del dispositivo y completa el IRP (IoCompleteRequest). Si los controladores han en cola E/S mientras el dispositivo estaba en suspensión, o si el dispositivo requiere alimentación de entrada, el controlador de bus aplica energía al dispositivo. De lo contrario, el controlador de bus aplica energía tan pronto como tenga que comunicarse con el dispositivo.

Para obtener una lista de los procedimientos recomendados para lograr tiempos de inicio rápidos a partir de los estados de apagado, espera e hibernación, consulte Mejora del rendimiento de inicio del sistema.