Управление состоянием общего целевого объекта ввода-вывода
Целевые объекты ввода-вывода можно визуализировать как имеющие два шлюза: входной и внешний. Out-gate управляет тем, когда платформа доставляет запрос целевому объекту устройства, а in-gate управляет, когда запросу разрешено входить в целевой объект ввода-вывода.
Платформа определяет следующие состояния для общих целевых объектов ввода-вывода:
Начал
Оба шлюза целевого объекта ввода-вывода открыты. Драйвер может отправлять запросы ввода-вывода в целевую очередь ввода-вывода, а платформа доставляет запросы соответствующему драйверу.
Остановился
Вход целевого объекта ввода-вывода открыт, но выходная ворота закрыта. Платформа прекращает доставку запросов соответствующему драйверу. Чтобы отправить запросы ввода-вывода в целевой объект ввода-вывода, драйвер должен задать WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE или WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET в структуре WDF_REQUEST_SEND_OPTIONS каждого запроса.
Очищены
Оба шлюза целевого объекта ввода-вывода закрыты. Драйвер не может отправлять запросы ввода-вывода в целевой объект ввода-вывода, если он не задает WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE или WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET. Кроме того, платформа отменяет необработанные запросы во внутренней очереди целевого объекта ввода-вывода. Это состояние доступно начиная с KMDF версии 1.11.
Закрыто для запроса и удаления
Удаленный целевой объект ввода-вывода временно закрывается, так как его устройство вскоре может быть удалено.
Закрыт
Целевой объект ввода-вывода закрыт и не может быть запущен или остановлен.
Удалены
Устройство целевого объекта ввода-вывода удалено.
Перечисление WDF_IO_TARGET_STATE определяет значения, представляющие эти состояния. Драйвер может вызвать WdfIoTargetGetState , чтобы получить состояние целевого объекта ввода-вывода.
Целевые состояния локальных операций ввода-вывода
Платформа автоматически открывается и запускает локальные целевые объекты ввода-вывода.
При необходимости драйвер может вызвать WdfIoTargetStop , чтобы временно остановить локальный целевой объект ввода-вывода, и вызвать WdfIoTargetStart , чтобы перезапустить его. Например, драйвер может остановить локальный целевой объект ввода-вывода, если обнаружит временное условие ошибки, а затем перезапустить целевой объект ввода-вывода, если условие ошибки исправлено.
В KMDF версии 1.11 и более поздних версиях драйвер может вызвать WdfIoTargetPurge , чтобы временно предотвратить отправку запросов ввода-вывода в локальный целевой объект ввода-вывода и отменить необработанные запросы в очереди целевого объекта. Например, в рамках очистки дескриптора файлов драйвер может очистить локальный целевой объект ввода-вывода, чтобы гарантировать отмену всех запросов, отправляемых драйверу.
Если устройство локального целевого объекта ввода-вывода удалено, платформа автоматически останавливает и закрывает целевой объект ввода-вывода и отменяет все запросы ввода-вывода, которые находятся в очереди целевого объекта. Платформа уведомляет драйвер о том, что устройство больше недоступно, вызывая функции обратного вызова событий объекта устройства. Дополнительные сведения об этих функциях обратного вызова см. в статье Сценарии PnP и управления питанием.
Целевые состояния удаленного ввода-вывода
Чтобы открыть удаленные целевые объекты ввода-вывода, драйверы должны вызывать WdfIoTargetOpen . Когда драйвер открывает удаленный целевой объект ввода-вывода, платформа автоматически запускает целевой объект ввода-вывода.
При необходимости драйвер может вызвать WdfIoTargetStop , чтобы временно остановить удаленный целевой объект ввода-вывода, и вызвать WdfIoTargetStart , чтобы перезапустить его.
В KMDF версии 1.11 и более поздних версиях драйвер может вызывать WdfIoTargetPurge , чтобы временно предотвратить отправку запросов ввода-вывода в удаленный целевой объект ввода-вывода и отменить необработанные запросы в очереди целевого объекта.
Если устройство удаленного целевого объекта ввода-вывода удалено, платформа автоматически останавливает и закрывает целевой объект ввода-вывода и отменяет все запросы ввода-вывода, которые находятся в очереди целевого объекта, если драйвер не регистрирует следующие функции обратного вызова событий:
EvtIoTargetQueryRemove
Сообщает драйверу о том, что устройство удаленного целевого объекта ввода-вывода может быть удалено. Драйвер должен вызвать WdfIoTargetCloseForQueryRemove , если вы хотите, чтобы драйвер разрешил удаление устройства.
EvtIoTargetRemoveComplete
Сообщает драйверу о том, что устройство удаленного целевого объекта ввода-вывода удалено. Эта функция обратного вызова должна вызывать WdfIoTargetClose.
EvtIoTargetRemoveCanceled
Сообщает драйверу о том, что попытка удалить устройство удаленного целевого объекта ввода-вывода была отменена. Эта функция обратного вызова должна вызывать WdfIoTargetOpen, а драйвер обычно вызывает WDF_IO_TARGET_OPEN_PARAMS_INIT_REOPEN для инициализации функции WDF_IO_TARGET_OPEN_PARAMS_INIT.
Если драйвер завершил использование удаленного целевого объекта ввода-вывода и больше не будет использовать целевой объект, а у целевого объекта нет дочерних объектов запросов, которые все еще находятся в состоянии ожидания, драйвер может вызвать WdfObjectDelete без предварительного вызова WdfIoTargetClose. Если у целевого объекта есть дочерние объекты запросов, которые все еще находятся в состоянии ожидания, драйвер должен вызвать WdfIoTargetClose , прежде чем он сможет безопасно вызвать WdfObjectDelete.