Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La rutina DispatchPower de un controlador admite la administración de energía mediante el manejo de IRPs para el código de función E/S IRP_MJ_POWER. Asociados al código de función IRP_MJ_POWER hay varios códigos de función menores de E/S para la gestión de energía. El administrador de energía usa estos códigos de función menores para indicarle a los controladores que cambien los estados de energía, esperen y respondan a eventos de reactivación del sistema, y consulten a los controladores sobre sus dispositivos.
La rutina DispatchPower de cada controlador realiza las siguientes tareas:
Controle el IRP si es posible.
Pase el IRP al siguiente controlador inferior de la pila de dispositivos mediante PoCallDriver.
Si eres un controlador de autobús, realiza la operación de alimentación solicitada en el dispositivo y completa el IRP.
Todos los controladores de un dispositivo deben tener la oportunidad de controlar los IRP de energía para el dispositivo, excepto en algunos casos en los que se permite que una función o un controlador de filtro produzcan un error en el IRP. La mayoría de los controladores de función y filtro realizan algún procesamiento o establecen una rutina de IoCompletion para cada IRP de energía y, a continuación, pasan el IRP al siguiente controlador inferior sin completarlo. Finalmente, el IRP llega al controlador de autobús, que cambia físicamente el estado de energía del dispositivo si es necesario y completa el IRP.
Cuando se haya completado el IRP, el administrador de E/S llama a cualquier rutina de IoCompletion establecida por los controladores mientras el IRP recorría la pila de dispositivos. Si un controlador debe establecer una rutina de finalización depende del tipo de IRP y de los requisitos individuales del controlador.
Los IRP de energía que encienden un dispositivo deben controlarse primero por el controlador más bajo de la pila de dispositivos (el controlador de bus subyacente) y, a continuación, por cada controlador sucesivo en la pila. Los IRP de energía que apagan un dispositivo deben ser controlados primero por el controlador en la parte superior de la pila de dispositivos y luego por cada controlador sucesivo descendiendo en la pila.
Control especial para dispositivos extraíbles
En sus rutinas DispatchPower , los controladores de dispositivos extraíbles deben comprobar si el dispositivo sigue presente. Si se ha quitado el dispositivo, el controlador no debe pasar el IRP al siguiente controlador inferior. En su lugar, el controlador debe hacer lo siguiente:
Llame a PoStartNextPowerIrp para comenzar a procesar el siguiente IRP de energía.
Establezca Irp->IoStatus.Status en STATUS_DELETE_PENDING.
Llame a IoCompleteRequest, especificando IO_NO_INCREMENT, para completar el IRP.
Devuelve STATUS_DELETE_PENDING.