Как USB-устройствам назначаются идентификаторы контейнеров

Для устройства, подключенного к компьютеру через USB, на следующей блок-схеме показана эвристика, используемая для назначения идентификатора контейнера узлу USB-устройства (devnode).

Блок-схема, иллюстрирующая эвристические идентификаторы контейнера для usb devnodes.

Эта эвристика использует информацию из нескольких источников, чтобы определить, верно ли одно из следующих сведений о usb devnode:

  • Представляет ли devnode новое устройство в USB-шине? Если это так, то devnode получит новый идентификатор контейнера.

  • Является ли devnode дочерним devnode существующего устройства? Если это так, devnode наследует идентификатор контейнера родительского devnode.

Идентификатор контейнера для USB-устройства создается несколькими способами. Это решение основано на информации, содержащейся в устройстве. Эти сведения извлекаются из параметров ACPI, драйвера USB-шины и USB-концентратора.

Эта эвристика выполняет следующие шаги для каждого devnode, который диспетчер Plug and Play (PnP) перечисляет на USB-шине.

  1. При запросе драйвера USB-шины USB-устройство может сообщить идентификатор контейнера через дескриптор ContainerID операционной системы Майкрософт (ОС).

    Начиная с Windows 7 операционная система поддерживает дескриптор Microsoft OS ContainerID . С помощью этого дескриптора независимый поставщик оборудования (IHV) может точно указать идентификатор контейнера для устройства. Таким образом, идентификатор контейнера устройства уникален и не меняется на каждом компьютере, на котором установлено устройство. Кроме того, если он сообщает дескриптор Microsoft OS ContainerID , устройство указывает операционной системе, что все перечисленные devnodes являются частью одного физического устройства.

    Дескриптор Microsoft OS ContainerID предназначен для использования на устройствах, поддерживающих одновременное подключение устройства через несколько системных шин. Например, принтер может поддерживать одновременные сетевые подключения USB и IP с помощью расширений Plug and Play (PnP-X). При использовании одного дескриптора ContainerID ос Microsoft один и тот же идентификатор контейнера отображается в обоих транспортах. Таким образом, диспетчер PnP определяет, что devnodes, перечисляемые каждой шиной, являются частью одного физического устройства.

    Дополнительные сведения об дескрипторов Microsoft OS ContainerID см. в разделе Дескрипторы ОС Майкрософт.

  2. Если USB-устройство не сообщает дескриптор Microsoft OS ContainerID , драйвер USB-концентратора запрашивает ACPI, чтобы определить, подключено ли устройство к внешнему порту.

    Операционная система пытается найти объект ACPI-адреса (_ADR), соответствующий адресу USB-порта, к которому подключено устройство. При обнаружении соответствующего объекта адреса операционная система выполняет следующие действия:

    • Объект возможностей USB-порта (_UPC) запрашивается и проверяется значение PortIsConnectable . Если portIsConnectable имеет ненулевое значение 0xFF, порт можно использовать для подключения внешних устройств. Следовательно, любое устройство, подключенное к этому порту, должно быть внешним для компьютера.

    • Если компьютер реализует ACPI 3.0 и байт PortIsConnectable не равен нулю, операционная система дополнительно запрашивает объект описания физического расположения (_PLD). Операционная система проверяет, задан ли бит UserVisible (бит 64) для объекта _PLD . Это делается в качестве дополнительного проверка, чтобы гарантировать, что порт является как подключенным, так и видимым для пользователя извне.

    Если данные, собранные из ACPI, указывают на то, что устройство является внешним, диспетчер PnP создает идентификатор контейнера для устройства. Значение ContainedID — это хэш серийного номера USB устройства или случайно созданное значение. Devnode назначается этот идентификатор контейнера.

    Примечание Если операционная система определяет, что устройство является внутренним для компьютера, devnode наследует идентификатор контейнера родительского devnode, который (в данном случае) является идентификатором контейнера самого компьютера.

  3. Если ACPI не возвращает объект _ADR , соответствующий адресу USB-порта, к которому подключено устройство, диспетчер PnP создает идентификатор контейнера на основе состояния съемного устройства.

    Драйвер USB-концентратора запрашивает дескриптор USB RemoveAndPowerMask из концентратора и проверяет, задан ли бит DeviceRemovable для порта, к которому подключено устройство. Если задан бит DeviceRemovable , устройства, подключенные к порту, можно удалить из концентратора. Если бит DeviceRemovable не задан, устройства, подключенные к порту, не удаляются из концентратора.

    Драйвер USB-шины сообщает диспетчеру PnP состояние съемного или несъемного порта, который создает ContainerId для devnode, выполнив следующие действия.

    • Если концентратор указывает, что устройства, подключенные к данному порту, являются съемными из концентратора, диспетчер PnP определяет, что устройства, подключенные к этому порту, являются внешними для компьютера. Идентификатор контейнера, который он создает для devnode, является либо хэшом серийного номера USB устройства, либо является случайным образом сформированным значением.

    • Если концентратор указывает, что устройства, подключенные к данному порту, не являются съемными из концентратора, диспетчер PnP определяет, что устройства, подключенные к этому порту, являются подфункциями многофункционального устройства. В этом случае devnode наследует идентификатор контейнера родительского devnode.

Дополнительные сведения об интерфейсе ACPI 3.0 см. в разделе Advanced Configuration and Power Interface Specification Revision 3.0b.