Идентификаторы контейнеров USB в Windows

В этом документе содержатся сведения о usb ContainerIDдля операционной системы Windows. Он содержит рекомендации для производителей устройств по программированию своих многофункциональных USB-устройств, чтобы они могли быть правильно обнаружены Windows.

Начиная с Windows 7, пользователи могут воспользоваться всеми возможностями устройств, подключенных к их компьютерам. К ним относятся многофункциональные устройства, такие как комбинированный принтер, сканер и устройство копирования. Windows 7 поддерживает объединение всех функций одного физического устройства в контейнер устройства. Контейнер устройств — это виртуальное представление физического устройства. Эта консолидация достигается путем назначения свойства ContainerID каждой функции устройства, перечисленной для физического устройства. Присваивая каждой функции устройства одно и то же значение ContainerID , Windows 7 распознает, что все функции устройства принадлежат одному физическому устройству.

Контейнеры устройств могут поддерживать все типы устройств, которые подключаются к компьютеру с помощью разных типов шин. Однако не все типы шин используют одинаковый механизм для создания ContainerID. Для USB-устройств поставщики устройств могут использовать дескриптор ContainerID для описания ContainerID для физического устройства. Дескриптор ContainerID — это дескриптор функций ОС Майкрософт, который может храниться в встроенном ПО USB-устройства. Производители USB-устройств должны правильно реализовать эти дескрипторы ContainerID на своих устройствах, чтобы воспользоваться преимуществами новых возможностей устройств, доступных в Windows 7. Производителям USB-устройств необходимо реализовать только один containerID для каждого физического устройства, независимо от того, сколько функций устройства поддерживается устройством.

Дополнительные сведения об объединении всех функциональных возможностей одного устройства в контейнер устройства см. в разделе Создание идентификаторов контейнеров.

Дополнительные сведения о дескрипторах ОС Майкрософт для USB-устройств см. в разделе Дескрипторы ОС Майкрософт для USB-устройств.

Как создается ИДЕНТИФИКАТОР контейнера USB

Ниже приведены два способа создания ContainerID для USB-устройства.

  • Изготовитель USB-устройства указывает ContainerID в встроенном ПО устройства с помощью дескриптора Microsoft CONTAINERID .
  • Драйвер USB-концентратора Майкрософт автоматически создает containerID для устройства на основе сочетания идентификатора продукта (PID), идентификатора поставщика (VID), номера редакции и серийного номера. В этом случае драйвер USB-концентратора Майкрософт создает ContainerID с минимальной функциональностью. Этот метод применяется только к устройствам с уникальным серийным номером.

Содержимое идентификатора контейнера USB

Идентификатор контейнера USB представляется операционной системе в виде строки универсального уникального идентификатора (UUID). UUID ContainerID содержится в дескрипторе ContainerID. Дескриптор ContainerID — это дескриптор компонентов ОС Майкрософт на уровне устройства. Таким образом, когда операционная система запрашивает USB ContainerID, поле wValue запроса дескриптора всегда должно быть равно нулю. Дополнительные сведения о дескрипторов и запросах дескрипторов функций ОС Майкрософт см. в статье Спецификация дескрипторов Microsoft OS 1.0.

Дескриптор ContainerID состоит из раздела заголовка.

Offset Поле Size Тип Описание
0 dwLength 4 Неподписанный DWord Длина (в байтах) всего дескриптора ContainerID . Для этого поля всегда должно быть задано значение 0x18.
4 bcdVersion 2 BCD Номер версии дескриптора ContainerID в двоичном кодированном десятичном формате (BCD), где каждый элемент соответствует цифре. Самый значительный байт (MSB) содержит две цифры перед десятичной запятой, а наименее значимый байт (LSB) — две цифры после десятичной запятой. Например, версия 1.00 представлена как 0x0100. Для этого поля всегда должно быть задано значение 0x0100.
6 wIndex 2 Слово Для этого поля всегда задано значение 6 для дескрипторов USB ContainerID .

Дескриптор ContainerID состоит из раздела ContainerID.

Offset Поле Size Тип Описание
0 bContainerID 16 Неподписанный DWord Данные ContainerID .

Производители устройств отвечают за то, чтобы каждый экземпляр устройства получил универсально уникальное 16-байтовое значение containerID. Кроме того, устройство должно сообщать одно и то же значение ContainerID при каждом включении. Существует несколько установленных алгоритмов для создания UUID с почти нулевой вероятностью дублирования. Производители устройств могут выбрать алгоритм создания UUID, который лучше всего соответствует их потребностям. При условии, что результат уникален, не имеет значения, какой алгоритм генерации UUID используется.

Синтаксис USB ContainerID

ContainerID отображается в стандартном строковом формате UUID : {xxxxxxx-xxxx-xxxx-xxxxx}. Ниже приведен пример представления во встроенном ПО для 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07 USB ContainerID, который имеет формат {2CA7B40C-7BD1-4F25-B573-A13A975DDC07} UUID.

UCHAR ExampleContainerIDDescriptor[24] =
{
    0x18, 0x00, 0x00, 0x00,     // dwLength - 24 bytes
    0x00, 0x01,                 // bcdVersion - 1.00
    0x06, 0x00,                 // wIndex – 6 for a ContainerID
    0x0C, 0xB4, 0xA7, 0x2C,     // bContainerID -
    0xD1, 0x7B, 0x25, 0x4F,     // {2CA7B40C-7BD1-4F25-B573-A13A975DDC07}
    0xB5, 0x73, 0xA1, 0x3A,     // 0C B4 A7 2C D1 7B 25 4F B5 73 A1 3A 97 5D DC 07
    0x97, 0x5D, 0xDC, 0x07      //
}

Обратите внимание на изменение порядка байтов первых 8 байт при форматировании в виде строки UUID.

Изменения дескриптора ОС Майкрософт

Чтобы сохранить устаревшие функции ContainerID , в дескриптор строки ОС Майкрософт добавлено новое поле флагов, которое можно использовать для указания поддержки дескриптора ContainerID .

Текущее определение дескриптора строки ОС Майкрософт включает 1-байтовое поле панели bPad в конце дескриптора, которому обычно присваивается нулевое значение. Для USB-устройств, поддерживающих новый ContainerID, поле bPad переопределено как поле флагов bFlags. Бит 1 этого поля используется для указания поддержки дескриптора ContainerID . В таблице 3 описаны поля дескриптора строки ОС Майкрософт для USB-устройств.

Поле Длина (байты) Значение Описание
bLength 1 0x12 Длина дескриптора.
bDescriptorType 1 0x03 Тип дескриптора. Значение 0x03 указывает на дескриптор строки ОС Майкрософт.
qwSignature 14 MSFT100 Поле подписи.
bMS_VendorCode 1 Код поставщика Код поставщика.
bFlags 1 0x02 Бит 0: зарезервировано
Бит 1. Поддержка ContainerID
 0: не поддерживает ContainerID.
 1. Поддерживает containerID
Биты 2–7: зарезервированные

В настоящее время на usb-устройствах, которые поддерживают дескриптор ОС Майкрософт, но не поддерживают дескриптор ContainerID , поле bPad имеет значение 0x00. Драйвер USB-концентратора не запрашивает у таких устройств дескриптор USB ContainerID .

Представление контейнера многофункционального устройства USB

ContainerID предоставляет сведения для консолидации устройств для многофункциональных USB-устройств. На рисунке 1 показан пример объединения всех устройств в многофункциональном принтере в один контейнер устройств, если все отдельные устройства в продукте используют один и тот же ContainerID.

консолидация всех устройств в многофункциональном принтере.

Объединяя все устройства для многофункционального USB-устройства, физический продукт можно показать как единое устройство в разделе Устройства и принтеры в Windows 7. На рисунке 2 показан пример многофункциональной usb-клавиатуры и мыши, которое отображается как единое устройство в разделе Устройства и принтеры.

многофункциональное устройство в устройствах и принтерах.

Требования USB ContainerID HCK

Производители устройств должны убедиться, что каждый экземпляр устройства, который они создают, имеет глобально уникальное значение ContainerID , чтобы Windows успешно консолидировала функциональность каждого многофункционального USB-устройства. Сертификация оборудования Windows Комплект сертификации оборудования Windows Комплект сертификации оборудования Windows включает требование DEVFUND-0034 для USB ContainerID , если он реализован на устройстве. Если устройство реализует USB ContainerID, сертификация оборудования Windows проверяет ContainerID в рамках тестов дескриптора ОС Майкрософт и проверяет, является ли значение ContainerID глобально уникальным. Дополнительные сведения об этих требованиях к сертификации оборудования Windows см. на веб-сайте сертификации оборудования Windows.

Рекомендации по реализации USB ContainerID . Ниже приведены рекомендации для поставщиков устройств, которые проектируют, производят и поставляют USB-устройства.

  • Узнайте, как Windows 7 улучшает поддержку многофункциональных и нескольких транспортных USB-устройств с помощью ContainerID. Для начала рекомендуется прочитать статью Поддержка многофункциональных устройств и группы контейнеров устройств в Windows 7.
  • Убедитесь, что серийный номер на каждом USB-устройстве уникален. Требование сертификации оборудования Windows гласит, что, если устройство содержит серийный номер, серийный номер должен быть уникальным для каждого экземпляра устройства.
  • Не указывайте ContainerID для USB-устройства, встроенного в систему. Встроенные USB-устройства должны использовать параметры ACPI BIOS или дескриптор USB-концентратора DeviceRemovable bit для порта.
  • Убедитесь, что все USB-устройства, подключенные к системе, имеют уникальные значения ContainerID . Не делитесь значениями ContainerID или серийными номерами USB в линейках продуктов.
  • Убедитесь, что для устройства правильно задана возможность съемных устройств. Примечание Поставщики устройств, добавляющие дескриптор USB ContainerID на ранее поставляемое USB-устройство, должны увеличить номер выпуска устройства (bcdDevice) в дескрипторе устройства. Это необходимо, так как драйвер USB-концентратора кэширует дескриптор строки ОС Майкрософт (или его отсутствие) на основе идентификатора поставщика устройства, идентификатора продукта и номера выпуска устройства. Если вы не увеличиваете номер выпуска устройства, драйвер концентратора не запрашивает USB ContainerID нового устройства, если он ранее перечислял экземпляр устройства с тем же идентификатором поставщика, идентификатором продукта и номером выпуска устройства, который не поддерживал дескриптор USB ContainerID .

Создание USB-устройств для Windows
Идентификаторы контейнеров для USB-устройств