Поделиться через


Управление состоянием общего объекта ввода-вывода в UMDF

Предупреждение

UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.

Архивные примеры UMDF 1 можно найти в Windows 11, версия 22H2 — обновление драйверов за май 2022 года.

Дополнительные сведения см. в разделе Начало работы сUMDF.

Платформа определяет следующие состояния для общих целевых объектов ввода-вывода:

#B0 #A1 Запущено #C2
Целевой объект ввода-вывода открыт (то есть доступен драйверу UMDF), и драйвер может отправлять в него запросы ввода-вывода. Платформа предоставляет запросы соответствующему драйверу.

остановлено
Целевой объект ввода-вывода открыт, но драйвер UMDF не может отправлять запросы ввода-вывода в целевой объект ввода-вывода, если драйвер не передает флаг WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE параметру Flags в вызове метода IWDFIoRequest::Send .

Платформа перестает предоставлять запросы соответствующему драйверу.

Закрыто для удаления запросов
Целевой объект ввода-вывода временно закрыт, так как его устройство может быть удалено.

#B0 #A1 закрыто #C2
Целевой объект ввода-вывода закрыт и не может быть запущен или остановлен.

#B0 #A1 Удалено #C2
Устройство целевого объекта ввода-вывода было удалено.

Перечисление WDF_IO_TARGET_STATE определяет значения, представляющие эти состояния.

Локальные целевые состояния ввода-вывода

Платформа автоматически открывает и запускает локальные целевые объекты ввода-вывода.

При необходимости драйвер может вызвать IWDFIoTargetStateManagement::Stop , чтобы временно остановить локальный целевой объект ввода-вывода и вызвать IWDFIoTargetStateManagement::Start , чтобы перезапустить его. Например, драйвер может остановить локальный целевой объект ввода-вывода, если он обнаруживает временное условие ошибки, а затем перезапустить целевой объект ввода-вывода, если условие ошибки исправлено.

Если локальное устройство ввода-вывода отключено, фреймворк автоматически останавливает и закрывает целевую цель ввода-вывода и отменяет все запросы ввода-вывода, находящиеся в очереди этой цели. Фреймворк уведомляет драйвер о том, что устройство больше недоступно, вызывая функции обратного вызова событий объектного устройства. Дополнительные сведения об этих функциях обратного вызова см. в сценариях PnP и управления питанием в UMDF.

Драйверы могут вызывать IWDFIoTargetStateManagement::GetState , чтобы получить текущее состояние локального целевого объекта ввода-вывода.

Целевые состояния удаленного ввода-вывода

Драйверы должны вызывать IWDFRemoteTarget::OpenFileByName или IWDFRemoteTarget::OpenRemoteInterface , чтобы открыть удаленные целевые объекты ввода-вывода. Когда драйвер открывает удаленный целевой объект ввода-вывода, платформа автоматически запускает целевой объект ввода-вывода.

При необходимости драйвер может вызвать IWDFRemoteTarget::Stop , чтобы временно остановить удаленный целевой объект ввода-вывода и вызвать IWDFRemoteTarget::Start , чтобы перезапустить его.

Если устройство удаленного объекта ввода-вывода удалено, платформа автоматически останавливается и закрывает целевой объект ввода-вывода и отменяет все запросы ввода-вывода, находящиеся в очереди целевого объекта, если только драйвер не регистрирует следующие функции обратного вызова событий:

IRemoteTargetCallbackRemoval::OnRemoteTargetQueryRemove
Сообщает драйверу, что устройство удаленного объекта ввода-вывода может быть удалено. Драйвер должен вызвать IWDFRemoteTarget::CloseForQueryRemove , если вы хотите, чтобы драйвер разрешал удаление устройства.

IRemoteTargetCallbackRemoval::OnRemoteTargetRemoveComplete
Сообщает драйверу, что устройство удаленного целевого ввода-вывода было удалено. Эта функция обратного вызова должна вызывать IWDFRemoteTarget::Close.

IRemoteTargetCallbackRemoval::OnRemoteTargetRemoveCanceled
Сообщает драйверу, что была отменена попытка удаления удаленного целевого устройства ввода-вывода. Если вы хотите, чтобы драйвер продолжал использовать целевой объект, драйвер должен вызвать IWDFRemoteTarget::Повторное открытие. Как правило, драйвер вызывает повторное открытие из функции обратного вызова OnRemoteTargetRemoveCanceled , но повторное открытие может вызываться после возврата OnRemoteTargetRemoveCanceled .

Драйверы могут вызывать IWDFRemoteTarget::GetState , чтобы получить текущее состояние удаленного целевого объекта ввода-вывода.