Управление питанием для очередей ввода-вывода
Когда платформа получает запрос ввода-вывода, направленный на одно из устройств драйвера, платформа помещает запрос в очередь ввода-вывода. Драйвер может получить запросы ввода-вывода из очереди ввода-вывода, предоставив обработчики запросов или опросив очередь. Дополнительные сведения о очередях ввода-вывода см. в разделе "Объекты очередей платформы".
При разработке драйвера необходимо сгруппировать запросы ввода-вывода, которые ваш драйвер получит в две категории:
Запросы, для которых устройство должно находиться в рабочем состоянии (D0), в том числе:
- Запросы на чтение или запись, для которых драйвер функции устройства должен считывать данные из устройства или записывать данные в устройство.
- Управление устройствами запрашивает, что драйвер функции или шины не может обслуживаться без доступа к устройству.
Запросы, которые не требуют, чтобы устройство было в рабочем состоянии (D0), включая:
- Управление устройствами запрашивает, что драйвер функции или шины может обслуживаться без доступа к устройству.
- Возможно, все запросы, получаемые драйвером фильтра.
- Все запросы, которые получают все драйверы в стеке драйверов, если стек поддерживает устройство, доступное только для программного обеспечения, которое не взаимодействует с оборудованием.
Если вы не пишете драйвер фильтра или драйвер для стека, который не взаимодействует с оборудованием, скорее всего, ваш драйвер получит некоторые запросы, требующие, чтобы устройство было в рабочем состоянии, а также некоторые, которые не делают этого.
Для поддержки этих двух типов запросов платформа предоставляет два типа очередей ввода-вывода: те, которые управляются питанием и которые не являются. Когда драйвер создает каждую из очередей ввода-вывода, он задает элемент PowerManaged в структуре очереди WDF_IO_QUEUE_CONFIG для WdfTrue или WdfFalse, чтобы указать одно из следующих элементов:
Если драйвер устанавливает PowerManaged в WdfTrue, очередь управляется питанием.
Когда запросы ввода-вывода доступны в очереди, управляемой питанием, платформа отправляет запросы драйверу только в том случае, если устройство находится в состоянии работы (D0). Поэтому всякий раз, когда драйвер получает запрос из управляемой питанием очереди, платформа гарантирует, что устройство доступно. Если устройство не находится в рабочем состоянии, платформа сохраняет запросы в очереди, пока устройство не станет доступным.
Если устройство находится в состоянии низкой мощности, так как оно неактивно, и если платформа помещает запрос ввода-вывода в одну из очередей, управляемых драйвером, платформа просит стек драйверов восстановить устройство в его рабочем состоянии, прежде чем он отправляет запрос драйверу.
Если устройство находится в состоянии низкой мощности, так как система не находится в рабочем состоянии (S0), а если платформа помещает запрос ввода-вывода в одну из управляемых драйвером очередей, платформа ожидает, пока устройство не вернется к рабочему состоянию (D0), а затем отправляет запрос драйверу.
Так как платформа не доставляет запросы ввода-вывода из управляемой питанием очереди драйверу, если устройство не находится в рабочем состоянии, драйверы, расположенные над владельцем политики питания в стеке драйверов, не должны использовать очереди ввода-вывода, управляемые питанием. Если драйвер, расположенный выше владельца политики питания, использует управляемую питанием очередь, и если устройство находится в состоянии низкой мощности, драйвер не получает запрос и не может передать его владельцу политики питания. Поэтому владелец политики питания, который управляет состоянием питания устройства, не проснет устройство.
Если драйвер устанавливает PowerManaged в WdfFalse, очередь не управляется питанием.
Когда запросы ввода-вывода доступны в очереди, которая не управляется питанием, платформа отправляет запросы драйверу независимо от того, находится ли устройство в состоянии работы (D0). Если вы настроили очередь таким образом, чтобы она получала только запросы, которые не требуют доступа к устройству, драйвер может обслуживать каждый запрос, даже если устройство недоступно.
Дополнительные сведения о очередях ввода-вывода, управляемых питанием, см. в разделе "Использование очередей ввода-вывода, управляемых питанием".
Для некоторых драйверов требуется прямой контроль над самонастраивающийся (PnP) и операциями управления питанием. Эти драйверы могут использовать самоуправляемые ввода-вывода. Дополнительные сведения см. в разделе "Использование самостоятельно управляемых операций ввода-вывода".