在 USB 视频类 (UVC) 相机固件中通过 MS OS 描述符创建设备属性键
过去,USB 视频类 (UVC) 相机的制造商必须创作自定义 INF 文件才能提供设备属性键等功能。 对于简单的注册表项,USBVideo 驱动程序具有一种机制,用于从 MS OS 描述符创建注册表项(如果有问题的密钥名称前面带有 UVC-
)。 这扩展了 USBVideo 驱动程序中的该功能,如果 MS OS 描述符遵循特定格式,则还会从它创建设备属性键。 这允许 USBVideo 相机固件达到与 MIPI 相机驱动程序的功能奇偶一致,而无需为这些相机创作自定义 INF。
注意
如果在自定义 INF 中定义了相同的设备属性键,它将替代 MS OS 描述符提供的值。
适用于
- Windows 11 及更高版本的操作系统
MS OS 2.0 注册表属性描述符
当前 MS OS 2.0 注册表属性描述符的定义如下:
Offset | 字段 | 大小 | 说明 |
---|---|---|---|
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 | 变量 | 属性数据 |
MS OS 2.0 注册表属性描述符的 wPropertyDataType 值
下表描述了 MS OS 2.0 注册表属性描述符的 wPropertyDataType 值:
值 | 说明 |
---|---|
0 | RESERVED |
1 | 以 NULL 结尾的 Unicode 字符串 (REG_SZ) |
2 | 包含环境变量的 NULL 终止 Unicode 字符串 (REG_EXPAND_SZ) |
3 | 自由格式的二进制 (REG_BINARY) |
4 | Little-endian 32 位整数 (REG_DWORD_LITTLE_ENDIAN) |
5 | 大端 32 位整数 (REG_DWORD_BIG_ENDIAN) |
6 | 以 NULL 结尾的 Unicode 字符串,其中包含符号链接 (REG_LINK) |
7 | 多个以 NULL 结尾的 Unicode 字符串 (REG_MULTI_SZ) |
8 及更高版本 | RESERVED |
USBVideo 驱动程序当前会将前缀 UVC-
为 作为注册表变量名称的所有 MS OS 描述符复制到每个设备接口节点。 这些是一个注册表项到另一个注册表项的直接一对一副本,删除前缀 UVC-
。 对于设备属性密钥,需要其他信息。 若要定义设备属性密钥,需要有定义的 GUID 和 ID。 此外,每个键都需要相应的数据类型和相应数据值。 对于此功能,USBVideo 驱动程序会将注册表值和类型映射到 DEVPROPTYPE。
可能的注册表类型
注册表值 | 说明 | DEVPROPTYPE 值 | 说明 |
---|---|---|---|
1 | REG_SZ | DEVPROP_TYPE_STRING | 以 Null 结尾的字符串 |
2 | REG_EXPAND_SZ | NA | 不支持 |
3 | REG_BINARY | DEVPROP_TYPE_BINARY | 自定义二进制数据 |
4 | REG_DWORD_LITTLE_ENDIAN | DEVPROP_TYPE_UINT32 | 32 位无符号 int (ULONG32) |
5 | REG_DWORD_BIG_ENDIAN | NA | 不支持 |
6 | REG_LINK | NA | 不支持 |
7 | REG_MULTI_SZ | DEVPROP_TYPE_STRING_LIST | 多 sz 字符串列表 |
若要确定应创建此设备属性键,将定义一个新前缀。 如果找到格式为 DKEY-GUID<>、ID> 的 MS OS 描述符,<则 USBVideo 驱动程序将尝试此创建。 注册表值必须是上述定义的格式之一, (放弃并忽略REG_LINK、REG_EXPAND_SZ和REG_DWORD_BIG_ENDIAN) 。 GUID 的格式应为 {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},ID 的格式应为大于 2 的数值。
示例 MS OS 描述符
以下示例定义 MS OS 描述符:
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