Rutinas DispatchPower
La rutina DispatchPower de un controlador admite la administración de energía mediante el control de IRP para el código de función de E/S de IRP_MJ_POWER . Asociados con el código de función IRP_MJ_POWER son varios códigos de función de E/S menores para la administración de energía. El administrador de energía usa estos códigos de función secundarios para dirigir los controladores para cambiar los estados de energía, esperar y responder a los eventos de reactivación del sistema y consultar 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 es un controlador de bus, realice la operación de alimentación solicitada en el dispositivo y complete 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 bus, que cambia físicamente el estado de alimentación del dispositivo si es necesario y completa el IRP.
Una vez completado el IRP, el administrador de E/S llama a las rutinas de IoCompletion establecidas por los controladores a medida que el IRP ha recorrido la pila de dispositivos. Si un controlador necesita 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 controlarse primero por el controlador en la parte superior de la pila de dispositivos y, a continuación, por cada controlador sucesivo que baja la pila.
Control especial para dispositivos extraíbles
En sus rutinas DispatchPower , los controladores de dispositivos extraíbles deben comprobar si el dispositivo todavía está 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.