Uso de colas de E/S de Power-Managed

Cuando un controlador crea una cola de E/S, puede especificar si la cola está administrada por energía. Cuando las solicitudes de E/S están disponibles en una cola administrada por energía, el marco entrega las solicitudes al controlador solo si el dispositivo está en estado de trabajo (D0). El marco no permite que el dispositivo deje su estado de trabajo hasta que todas las solicitudes de E/S que el marco haya entregado desde la cola administrada por energía al controlador se hayan completado, cancelado o pospuesto.

Para obtener más información sobre las colas de E/S administradas por energía, consulte Administración de energía para colas de E/S.

Funciones de devolución de llamada para colas de Power-Managed

Si el controlador usa colas de E/S administradas por energía, puede proporcionar dos funciones de devolución de llamada adicionales:

EvtIoStop
La función de devolución de llamada EvtIoStop detiene el procesamiento de una solicitud de E/S especificada. Cuando el dispositivo deja su estado de trabajo (D0) o se quita, el marco llama a la función de devolución de llamada EvtIoStop de una cola de E/S una vez por cada solicitud de E/S que el controlador no ha completado, incluidas las solicitudes que posee el controlador y las que ha reenviado a un destino de E/S.

EvtIoResume
La función de devolución de llamada EvtIoResume reanuda el procesamiento de una solicitud de E/S detenida anteriormente. El marco llama a la función de devolución de llamada EvtIoResume de una cola de E/S cuando reanuda la entrega de solicitudes de E/S al controlador desde la cola, después de que el dispositivo haya vuelto a su estado de trabajo.

Cada vez que el marco llama a la función de devolución de llamada EvtIoStop de un controlador, la función normalmente completa o cancela la solicitud de E/S, o llama a WdfRequestStopAcknowledge para devolver la propiedad de la solicitud al marco.

Aunque hacerlo es opcional, debe proporcionar en general una función de devolución de llamada EvtIoStop para una cola administrada por energía. Al proporcionar EvtIoStop, el controlador puede ayudar a acortar el tiempo que transcurre antes del dispositivo y, posiblemente, el sistema, entra en un estado de baja potencia.

Si no proporciona EvtIoStop para una cola administrada por energía, el marco espera hasta que todas las solicitudes entregadas desde la cola administrada por energía al controlador se completen antes de mover el dispositivo (o sistema) a un estado de energía inferior o quitar el dispositivo. Potencialmente, esta inacción puede impedir que un sistema entre en su estado de hibernación u otro estado de energía del sistema bajo. En casos extremos, puede hacer que el sistema se bloquee con el código de comprobación de errores 9F.

Si el controlador no reenvía solicitudes a un destino de E/S y no contiene solicitudes durante un tiempo indeterminado, podría omitir EvtIoStop de forma segura para una cola administrada por energía.

Esperando objetos dispatcher

En general, los controladores solo deben usar objetos de distribuidor como mecanismos de sincronización dentro de un contexto de subproceso nobitrario.

Dado que los controladores de solicitudes se ejecutan en un contexto de subproceso arbitrario, un controlador de solicitudes para una cola administrada por energía no debe esperar a que se establezcan los objetos de distribuidor del kernel. Si lo hace, puede provocar interbloqueo.

Para obtener más información sobre cuándo un controlador puede esperar objetos de distribuidor y qué hacer cuando no puede hacerlo, vea Introducción a los objetos de distribuidor de kernel.