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