Использование ввода-вывода Self-Managed
Большинство драйверов на основе платформы используют преимущества возможностей PnP и управления питанием платформы для устройств, которые они поддерживают. Другими словами, большинство драйверов на основе платформы позволяют платформе управлять PnP устройства и состояниями питания, выполнив все следующие действия:
Предоставление функций обратного вызова EvtDeviceD0Entry и EvtDeviceD0Exit.
Предоставление функций обратного вызова для EvtDevicePrepareHardware и для EvtDeviceReleaseHardware.
Использование управляемых питанием очередей для запросов ввода-вывода, которые требуют, чтобы устройство было в рабочем состоянии, и использование очередей, которые не управляются питанием, для всех других запросов.
Однако для некоторых драйверов, которые строятся на базе фреймворка, потребуется более глубокое понимание о состоянии их устройств, включая драйверы в следующих ситуациях:
Операции, выполняемые драйвером, не определяются набором запросов ввода-вывода, получаемых драйвером из очередей ввода-вывода платформы.
Драйвер взаимодействует со старыми драйверами без фреймворка и напрямую работает с интерфейсами WDM.
Запросы на ввод-вывод, получаемые драйвером, не могут быть разделены на две группы: те, которые требуют, чтобы устройство находилось в рабочем состоянии, и те, которые этого не требуют.
Большинство драйверов не попадают в одну из вышеописанных ситуаций, но если ваш драйвер — это так, может потребоваться более прямой контроль над операциями PnP и управления питанием устройства. Такие драйверы могут использовать самоуправляемый ввод-вывод. Использование самостоятельного ввода-вывода означает, что драйвер получает уведомления (с помощью набора функций обратного вызова) каждый раз, когда одно из его устройств подключается или отключается, и каждый раз, когда устройство временно остановлено.
Обратите внимание, что драйвер может использовать автономные очереди ввода-вывода и по-прежнему использовать очереди ввода-вывода платформы в качестве управляемых питанием очередей или нет. Например, драйвер может использовать очереди ввода-вывода фреймворка, которые не управляются посредством питания, с набором автономных функций обратного вызова ввода-вывода.
Для использования самостоятельного ввода-вывода драйвер регистрирует дополнительный набор функций обратного вызова событий, когда вызывает WdfDeviceInitSetPnpPowerEventCallbacks. Эти функции обратного вызова событий:
EvtDeviceSelfManagedIoInit, который инициализирует и запускает операции ввода-вывода устройства.
EvtDeviceSelfManagedIoSuspend, которое приостанавливает операции ввода-вывода.
EvtDeviceSelfManagedIoRestart, который перезапускает операции ввода-вывода устройства после их приостановки.
EvtDeviceSelfManagedIoFlush, которая удаляет необработанные запросы ввода-вывода.
EvtDeviceSelfManagedIoCleanup, освобождает ресурсы, выделенные EvtDeviceSelfManagedIoInit.
Когда устройство впервые входит в рабочее состояние (D0), фреймворк вызывает функцию обратного вызова драйвера EvtDeviceSelfManagedIoInit. Это происходит каждый раз, когда пользователь подключает устройство к системе и при каждом перезапуске системы.
Существует три обстоятельства, в которых драйвер должен остановить операции ввода-вывода устройства: устройство будет входить в состояние низкой мощности, оно будет удалено или уже было удалено неожиданно. В следующем списке подробно рассматривается каждое из этих обстоятельств:
Устройство будет входить в состояние низкой мощности и в конечном итоге вернется к рабочему состоянию.
Когда устройство будет входить в состояние низкой мощности (так как устройство неактивно, вся система вводит низкое питание или диспетчер PnP распространяя аппаратные ресурсы системы), платформа вызывает функцию обратного вызова драйвера EvtDeviceSelfManagedIoSuspend обратного вызова. После повторного входа устройства в рабочее состояние фреймворк вызывает функцию обратного вызова драйвера EvtDeviceSelfManagedIoRestart.
Устройство будет удалено.
Для обработки запроса пользователя на удаление устройствафреймворк вызывает функцию обратного вызова драйвера EvtDeviceSelfManagedIoSuspend перед остановкой устройства. После остановки устройства фреймворк вызывает функцию обратного вызова драйвера EvtDeviceSelfManagedIoFlush. После удаления устройства фреймворк вызывает функцию обратного вызова EvtDeviceSelfManagedIoCleanup.
Устройство уже удалено неожиданно (неожиданное удаление).
Если драйвер шины устройства определяет, что устройство больше не присутствует, или если другой драйвер в стеке определяет, что устройство не отвечает, драйвер, который обнаружил проблему, сообщает диспетчеру PnP. Затем диспетчер PnP сообщает остальным драйверам, что устройство исчезло. Для драйверов на базе фреймворка, фреймворк получает сообщение от диспетчера PnP и вызывает функции обратного вызова драйвера: EvtDeviceSelfManagedIoSuspend, EvtDeviceSelfManagedIoFlushи EvtDeviceSelfManagedIoCleanup.
(Драйвер также может зарегистрировать функцию обратного вызова EvtDeviceSurpriseRemoval. Если устройство находилось в рабочем состоянии (D0) при удалении, фреймворк вызывает EvtDeviceSurpriseRemoval перед вызовом функций обратного вызова самоуправляемого ввода-вывода. Если устройство было в состоянии пониженной мощности при удалении, то EvtDeviceSurpriseRemoval вызывается после выполнения EvtDeviceSelfManagedIoSuspend)
Дополнительные сведения о порядке, в котором платформа вызывает функции обратного вызова событий драйвера, см. в сценариях управления питанием и PnP.
Хотя это редко необходимо, платформа предоставляет драйверам возможность более тщательно контролировать состояние PnP и электропитание устройства, имея доступ к машинами состояний в платформе.