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


Управление состоянием общего целевого объекта ввода-вывода в 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.

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

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

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

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

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

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

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

Перечисление 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::Reopen. Как правило, драйвер вызывает функцию повторного открытия из функции обратного вызова OnRemoteTargetRemoveCanceled , но функцию Повторное открытие можно вызвать после возврата OnRemoteTargetRemoveCanceled .

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