Использование очередей ввода-вывода Power-Managed
Когда драйвер создает очередь ввода-вывода, он может указать, является ли очередь управляемой. Если запросы ввода-вывода доступны в очереди, управляемой питанием, платформа доставляет запросы драйверу только в том случае, если устройство находится в рабочем (D0) состоянии. Платформа не позволяет устройству покидать рабочее состояние до тех пор, пока не будут завершены, отменены или отложены все запросы ввода-вывода, которые платформа доставила из очереди, управляемой питанием, драйверу.
Дополнительные сведения об управляемых питанием очередях ввода-вывода см. в разделе Управление питанием для очередей ввода-вывода.
Функции обратного вызова для очередей Power-Managed
Если драйвер использует управляемые энергопотреблением очереди ввода-вывода, он может предоставить две дополнительные функции обратного вызова:
EvtIoStop
Функция обратного вызова EvtIoStop останавливает обработку указанного запроса ввода-вывода. Когда устройство выходит из рабочего состояния (D0) или удаляется, платформа вызывает функцию обратного вызова EvtIoStop очереди ввода-вывода один раз для каждого запроса ввода-вывода, который драйвер не завершил, включая запросы, принадлежащие драйверу, и те, которые он перенаправил целевому объекту ввода-вывода.
EvtIoResume
Функция обратного вызова EvtIoResume возобновляет обработку ранее остановленного запроса ввода-вывода. Платформа вызывает функцию обратного вызова EvtIoResume очереди ввода-вывода, когда она возобновляет доставку запросов ввода-вывода драйверу из очереди после возвращения устройства в рабочее состояние.
Каждый раз, когда платформа вызывает функцию обратного вызова EvtIoStop драйвера, функция обычно завершает или отменяет запрос ввода-вывода либо вызывает WdfRequestStopAcknowledge , чтобы вернуть платформе права владения запросом.
Хотя это необязательно, обычно следует предоставить функцию обратного вызова EvtIoStop для очереди, управляемой питанием. Предоставляя EvtIoStop, ваш драйвер может помочь сократить время, прошедшее до того, как ваше устройство и, возможно, система перейдет в состояние с низким энергопотреблением.
Если вы не предоставите EvtIoStop для очереди, управляемой питанием, платформа ожидает завершения всех запросов, доставленных из очереди, управляемой питанием, к драйверу, перед перемещением устройства (или системы) в более низкое состояние питания или удалением устройства. Потенциально это бездействие может помешать системе войти в состояние гибернации или другое состояние с низким энергопотреблением системы. В крайних случаях это может привести к сбою системы с кодом проверки ошибок 9F.
Если драйвер не перенаправляет запросы в целевой объект ввода-вывода и не содержит запросы в течение неопределенного времени, можно безопасно опустить EvtIoStop для очереди, управляемой питанием.
Ожидание объектов диспетчера
Как правило, драйверы должны использовать объекты диспетчера только в качестве механизмов синхронизации в контексте непарного потока.
Так как обработчики запросов выполняются в произвольном контексте потока, обработчик запросов для очереди, управляемой питанием, не должен ждать установки объектов диспетчера ядра. Это может привести к взаимоблокировке.
Дополнительные сведения о том, когда драйвер может ожидать объектов диспетчера, а также о том, что делать, если это не удается, см. в статье Общие сведения об объектах диспетчера ядра.