Создание ключей свойств устройства из дескриптора ОС MS в встроенном ПО камеры класса ВИДЕО USB (UVC)

В прошлом производителям usb-видеоклассов (UVC) приходилось создавать пользовательские INF-файлы для предоставления функциональных возможностей, таких как ключи свойств устройства. Для простых разделов реестра драйвер USBVideo имеет механизм создания разделов реестра из дескриптора ОС MS, если имя ключа предваряется UVC-. Это расширяет возможности драйвера USBVideo, чтобы также создавать ключи свойств устройства из дескриптора ОС MS, если он соответствует определенному формату. Это позволяет встроенному ПО камеры USBVideo достичь четности функций с драйвером камеры MIPI без создания пользовательского INF-файла для этих камер.

Примечание

Если один и тот же ключ свойства устройства определен в пользовательском inf, он переопределит значение, предоставленное дескриптором ОС MS.

Применяется к

  • Windows 11 и более поздних версий операционных систем

Дескриптор свойства реестра MS OS 2.0

Текущий дескриптор свойства реестра MS OS 2.0 определяется следующим образом:

Offset Поле Size Описание
0 wLength 2 Длина этого дескриптора в байтах.
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 Тип свойства реестра
6 wPropertyNameLength 2 Длина имени свойства.
8 PropertyName Переменная Имя свойства реестра.
8+M wPropertyDataLength 2 Длина данных свойства
10+M PropertyData Переменная Данные свойств

Значения wPropertyDataType для дескриптора свойств реестра MS OS 2.0

В следующей таблице описаны значения wPropertyDataType для дескриптора свойств реестра MS OS 2.0:

Значение Описание
0 RESERVED
1 Строка Юникода с завершением NULL (REG_SZ)
2 Строка Юникода, завершающаяся null, которая включает переменные среды (REG_EXPAND_SZ)
3 Двоичный файл в свободной форме (REG_BINARY)
4 32-разрядное целое число (REG_DWORD_LITTLE_ENDIAN)
5 32-разрядное целое число (REG_DWORD_BIG_ENDIAN)
6 Строка Юникода, заканчивающаяся null, которая содержит символьную ссылку (REG_LINK)
7 Несколько строк Юникода с завершением NULL (REG_MULTI_SZ)
8 и выше RESERVED

Драйвер USBVideo в настоящее время копирует все дескрипторы UVC- ОС MS с префиксом в качестве имен переменных реестра в каждый узел интерфейса устройства. Это прямые копии одного раздела реестра в другой с удалением UVC- префикса. Для ключей свойств устройства требуются дополнительные сведения. Для определения ключа свойства устройства должны быть определены GUID и идентификатор. Кроме того, каждому ключу требуется соответствующий тип данных и значение для этих данных. Для этой функции драйвер USBVideo сопоставляет значение реестра и тип с DEVPROPTYPE.

Возможные типы реестра

Значение реестра Описание Значение DEVPROPTYPE Описание
1 REG_SZ DEVPROP_TYPE_STRING Строка, заканчивающаяся null
2 REG_EXPAND_SZ Н/Д Не поддерживается
3 REG_BINARY DEVPROP_TYPE_BINARY Пользовательские двоичные данные
4 REG_DWORD_LITTLE_ENDIAN DEVPROP_TYPE_UINT32 32-разрядная версия int без знака (ULONG32)
5 REG_DWORD_BIG_ENDIAN Н/Д Не поддерживается
6 REG_LINK Н/Д Не поддерживается
7 REG_MULTI_SZ DEVPROP_TYPE_STRING_LIST Список строк с несколькими sz

Чтобы определить, что этот ключ свойства устройства должен быть создан, будет определен новый префикс. Если дескриптор ОС MS найден в формате DKEY-GUID,ID<>>,< драйвер USBVideo попытается создать его. Значение реестра должно иметь один из указанных выше форматов (отмена и игнорирование REG_LINK, REG_EXPAND_SZ и REG_DWORD_BIG_ENDIAN). Формат GUID должен быть {XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXX}, а формат идентификатора должен быть числовым значением больше 2.

Пример дескриптора ОС MS

В следующем примере определяется дескриптор ОС MS:

UCHAR Example2_MSOS20DescriptorSet_UVCDevicePropertyKeyForFutureWindows\[0x3C\] =
{

//
// MS OS 2.0 Descriptor Set Header
//
0x0A, 0x00, // wLength - 10 bytes
0x00, 0x00, // MSOS20_SET_HEADER_DESCRIPTOR
0x00, 0x00, 0x0?, 0x06, // dwWindowsVersion – 0x060?0000 for future Windows version
0x76, 0x00, // wTotalLength – 118 bytes

//
// MS OS 2.0 Registry Value Feature Descriptor
//
0x6c, 0x00, // wLength - 108 bytes
0x04, 0x00, // wDescriptorType – 4 for Registry Property
0x04, 0x00, // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
0x5E, 0x00, // wPropertyNameLength – 94 bytes
'D', 0x00, 'K', 0x00, // Property Name – **DKEY-{4023440c-a74e-46e0-82df-e486fa545f40},3**
'E', 0x00, 'Y', 0x00,
'-', 0x00, '{', 0x00,
'4', 0x00, '0', 0x00,
'2', 0x00, '3', 0x00,
'4', 0x00, '4', 0x00,
'0', 0x00, 'C', 0x00,
'-', 0x00, 'A', 0x00,
'7', 0x00, '4', 0x00,
'E', 0x00, '-', 0x00,
'4', 0x00, '6', 0x00,
'E', 0x00, '0', 0x00,
'-', 0x00, '8', 0x00,
'2', 0x00, 'D', 0x00,
'F', 0x00, '-', 0x00,
'E', 0x00, '4', 0x00,
'8', 0x00, '6', 0x00,
'F', 0x00, 'A', 0x00,
'5', 0x00, '4', 0x00,
'5', 0x00, 'F', 0x00,
'4', 0x00, '0', 0x00,
'}', 0x00, ',', 0x00,
'3', 0x00, 0x00, 0x00,
0x00, 0x00,
0x04, 0x00, // wPropertyDataLength – 4 bytes
0xAC, 0x03, 0x00, 0x00 // PropertyData – 0x000003AC (940)
};

Он преобразуется в следующий ключ свойства устройства с помощью IoSetDevicePropertyData со следующими параметрами:

DEVPROPKEY

    DEVPROPGUID = {4023440c-a74e-46e0-82df-e486fa545f40}

    DEVPROPID = 3

DEVPROPTYPE = DEVPROP_TYPE_UINT32

PropertyBuffer containing UINT32 value = 940