Использование 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 и питания устройства путем доступа к конечным машинам в платформе.