從 USB 視訊類別中的 MS OS 描述元建立裝置屬性密鑰, (UVC) 相機韌體
在過去,USB 視訊類別的製造商 (UVC) 相機必須撰寫自定義 INF 檔案,以提供裝置屬性鍵等功能。 針對簡單的登錄機碼,如果有問題的機碼名稱前面 UVC-
加上 ,USBVideo 驅動程式有一種機制可從 MS OS 描述項建立登錄機碼。 這會擴充 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 | 已保留 |
1 | NULL 終止的 Unicode 字串 (REG_SZ) |
2 | NULL 終止的 Unicode 字串,其中包含環境變數 (REG_EXPAND_SZ) |
3 | 自由格式二進位 (REG_BINARY) |
4 | 位元組尾 32 位整數 (REG_DWORD_LITTLE_ENDIAN) |
5 | big-endian 32 位整數 (REG_DWORD_BIG_ENDIAN) |
6 | NULL 終止的 Unicode 字串,其中包含符號連結 (REG_LINK) |
7 | 多個 NULL 終止的 Unicode 字串 (REG_MULTI_SZ) |
8 和更新版本 | 已保留 |
USBVideo 驅動程式目前會將前置詞 UVC-
為 登錄變數名稱的所有 MS OS 描述元複製到每個裝置介面節點。 這些是一對一登錄機碼的一對一複本,移除 UVC-
前置詞。 針對裝置屬性金鑰,需要其他資訊。 若要定義裝置屬性金鑰,必須有已定義的 GUID 和識別碼。 此外,每個索引鍵都需要該數據的對應數據類型和值。 針對此功能,USBVideo 驅動程式會將登錄值和類型對應至 DEVPROPTYPE。
可能的登錄類型
登錄值 | Description | 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<> 格式的 MS OS 描述元,標識碼>,<則 USBVideo 驅動程式會嘗試建立此專案。 登錄值必須是上述其中一個定義的格式, (捨棄和忽略REG_LINK、REG_EXPAND_SZ和REG_DWORD_BIG_ENDIAN) 。 GUID 的格式應該是 {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX},而標識符的格式應該是大於 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