USB 视频类 (UVC) 相机实现指南

从 Windows 10 开始,为符合 USB 视频类规范的设备提供收件箱 USB 视频类 (UVC) 驱动程序, (版本 1.0 到 1.5) 。 此驱动程序支持颜色和传感器类型相机。 本文档概述了如何通过收件箱驱动程序向应用程序公开符合 UVC 的相机的某些功能。

术语

关键字 说明
UVC USB 视频类
UVC 驱动程序 与 OS 一起附带的USBVideo.sys驱动程序
IR 红外线
彩色相机 输出颜色流的相机 (例如 RGB 或 YUV 相机)
传感器相机 输出非颜色流的相机 (例如 IR 或深度相机)
BOS 二进制设备对象存储
MS OS 2.0 描述符 Microsoft 特定于平台的 BOS 设备功能描述符

传感器相机

Windows 支持两类相机。 一个是彩色相机,另一个是非颜色传感器相机。 RGB 或 YUV 相机分类为彩色相机,非颜色相机(如灰度、IR 和深度相机)分类为传感器相机。 UVC 驱动程序支持这两种类型的相机。 我们建议相机固件指定一个值,根据该值,UVC 驱动程序会在一个或两个受支持的类别下注册相机。

仅支持颜色格式类型的相机应在KSCATEGORY_VIDEO_CAMERA下注册。 支持 IR 或仅深度格式类型的相机应在KSCATEGORY_SENSOR_CAMERA下注册。 支持颜色和非颜色格式类型的相机应在KSCATEGORY_VIDEO_CAMERA和KSCATEGORY_SENSOR_CAMERA下注册。 此分类可帮助应用程序选择要使用的相机。

UVC 相机可以通过属性、 SensorCameraModeSkipCameraEnumeration,在其 BOS MS OS 2.0 描述符 中指定其类别首选项,详见以下各节。

属性 SensorCameraMode 采用值 1 或 2。

值为 1,将在KSCATEGORY_SENSOR_CAMERA下注册设备。 此外,还指定 SkipCameraEnumeration 的值为 1,使相机可供仅查找传感器相机的应用程序使用。 仅公开传感器相机媒体类型的相机应使用此值。

SensorCameraMode 的值为 2,将在KSCATEGORY_SENSOR_CAMERA KSCATEGORY_VIDEO_CAMERA&下注册设备。 这将使相机可用于查找传感器和颜色相机的应用程序。 公开传感器相机和彩色相机媒体类型的相机应使用此值。

建议使用 BOS 描述符指定上述注册表值。 有关具有特定于平台的 MS OS 2.0 描述符的示例 BOS 描述符,请参阅下面的 示例复合设备 部分。

如果无法按上文所述更新设备固件,则可以使用自定义 INF,并通过指定 SensorCameraModeSkipCameraEnumeration 的值来指定相机需要注册为传感器相机,如下所示:

基于收件箱 UVC 驱动程序) 的自定义 INF 文件 (必须包含以下 AddReg 条目:

SensorCameraMode:REG_DWORD:1 (注册为传感器相机)

SkipCameraEnumeration:REG_DWORD:1 (使其仅适用于 IR 应用程序)

自定义 INF 部分的示例如下所示:

[USBVideo.NT.HW]
AddReg=USBVideo.HW.AddReg

[USBVideo.HW.AddReg]
HKR,, SensorCameraMode, 0x00010001,1      ; places the value under device HW
                                          ; Registry key

HKR,, SkipCameraEnumeration, 0x00010001,1 ; This makes the camera available
                                          ; only for application looking for
                                          ; IR cameras

如果未在固件或 INF 中指定 SensorCameraModeSkipCameraEnumeration 属性,则相机将注册为彩色相机,并且仅对彩色相机感知应用程序可见。

IR 流

Windows 收件箱 USB 视频类 (UVC) 驱动程序支持以 YUV 格式捕获场景的相机,并将像素数据以未压缩的 YUV 或压缩的 MJPEG 帧的形式通过 USB 传输。

应在流视频格式描述符中指定以下格式类型 GUID,如 WDK ksmedia.h 头文件中定义:

类型 说明
KSDATAFORMAT_SUBTYPE_L8_IR 未压缩的 8 位 luma 平面。 此类型映射到 MFVideoFormat_L8
KSDATAFORMAT_SUBTYPE_L16_IR 未压缩的 16 位 luma 平面。 此类型映射到 MFVideoFormat_L16
KSDATAFORMAT_SUBTYPE_MJPG_IR 压缩的 MJPEG 帧。 Media Foundation 将此转换为 NV12 未压缩的帧,并且仅使用 luma 平面。

当这些格式类型 GUID 在帧描述符的 guidFormat 字段中指定时,Media Foundation 捕获管道会将流标记为 IR 流。 使用 Media Foundation FrameReader API 编写的应用程序将能够使用 IR 流。 IR 流的管道不支持 IR 帧的缩放或转换。

公开 IR 格式类型的流不得公开 RGB 或深度格式类型。

// Example Format Descriptor for UVC 1.1 frame based format

typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID  guidFormat;  // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;

注意

IR 流将在 DShow 中显示为常规捕获流。

深度流

Windows 收件箱 USB 视频类驱动程序支持生成深度流的相机。 这些相机捕获 (深度信息,例如,飞行时间) 场景,并将深度地图作为未压缩的 YUV 帧通过 USB 传输。 应在流视频格式描述符中指定以下格式类型 GUID,如 WDK ksmedia.h 头文件中定义:

类型 说明
KSDATAFORMAT_SUBTYPE_D16 16 位深度映射值。 此类型与 MFVideoFormat_D16相同。 这些值以毫米为单位。

在框架描述符的 guidFormat 成员中指定格式类型 GUID 时,Media Foundation 捕获管道会将流标记为深度流。 使用 FrameReader API 编写的应用程序将能够使用深度流。 深度流的管道不支持深度帧的缩放或转换。

公开深度格式类型的流不得公开 RGB 或 IR 格式类型。

// Example Format Descriptor for UVC 1.1 frame based format
typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID guidFormat; // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;

注意

深度流在 DShow 中显示为常规捕获流。

对相机进行分组

Windows 支持基于其容器 ID 对相机进行分组,以帮助应用程序处理相关相机。 例如,在同一物理设备上存在的 IR 相机和颜色相机可以作为相关相机向 OS 公开。 这样,应用程序(如Windows Hello)将相关相机用于其方案。

相机函数之间的关系可以在固件中的相机 BOS 描述符中指定。 UVC 驱动程序将利用此信息并公开这些相机功能,使其与相关。 这样,OS 相机堆栈会将它们公开为应用程序的相关相机组。

相机固件必须指定 UVC-FSSensorGroupID,该 ID 采用带大括号的字符串形式。 具有相同 UVC-FSSensorGroupID 的相机将组合在一起。

可以通过在固件中指定 UVC-FSSensorGroupName(Unicode 字符串)来指定传感器组的名称。

有关指定 UVC-FSSensorGroupIDUVC-FSSensorGroupName 的示例 BOS,请参阅下面的示例复合设备部分。

如果无法按上文所述更新设备固件,可以使用自定义 INF,并通过指定传感器组 ID 和名称来指定相机是传感器组的一部分,如下所示。 基于收件箱 UVC 驱动程序) 的自定义 INF 文件 (必须包含以下 AddReg 条目:

FSSensorGroupID:REG_SZ:“{传感器组 ID GUID}”

FSSensorGroupName:REG_SZ:“传感器组友好名称”

自定义 INF 节的示例如下所示:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,, FSSensorGroupID,0x00000000,%FSSensorGroupID%
HKR,, FSSensorGroupName,0x00000000,%FSSensorGroupName%

注意

DShow 捕获管道不支持传感器组。

方法 2 或方法 3 仍捕获支持

UVC 规范确实提供了一种机制,用于指定视频流接口是否支持方法 1/2/3 类型的静止图像捕获。 若要使 OS 利用设备的 2/3 方法仍然图像捕获支持,通过 UVC 驱动程序,设备固件可以在 BOS 描述符中指定值。

要指定启用方法 2/3 静止图像捕获的值是名为 UVC-EnableDependentStillPinCapture 的 DWORD。 使用 BOS 描述符指定其值。 下面的示例 复合设备 演示如何使用示例 BOS 描述符启用静止图像捕获。

如果无法按上述方式更新设备固件,可以使用自定义 INF 指定相机支持方法 2 或方法 3 仍捕获方法。

基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序 () 的自定义 INF 文件必须包含以下 AddReg 条目:

EnableDependentStillPinCapture:REG_DWORD:0x0 (禁用) 0x1 (已启用)

当此项设置为“启用” (0x1) 时,捕获管道将利用方法 2/3 作为静止图像捕获 (假设固件还播发了对 UVC 规范) 指定的方法 2/3 的支持。

自定义 INF 节的示例如下所示:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnableDependentStillPinCapture,0x00010001,0x00000001

设备 MFT 链接

设备 MFT 是适用于 IHD 和 OEM 的推荐用户模式插件机制,用于在 Windows 上扩展相机功能。

在Windows 10版本 1703 之前,相机管道仅支持一个 DMFT 扩展插件。

从版本 1703 Windows 10开始,Windows 相机管道支持一个可选的 DMFT 链,最多包含两个 DMFT。

从版本 22H2 Windows 11开始,Windows 相机管道支持一个可选的 DMFT 链,最多包含四个 DMFT。

这为 OEM 和 IHV 提供了更大的灵活性,以后处理相机流的形式提供增值。 例如,设备可以使用 PDMFT 以及 IHV DMFT 和 OEM DMFT。

下图演示了涉及 DMFT 链的体系结构。

DMFT 链。

捕获从相机驱动程序流向 DevProxy 的示例,然后浏览 DMFT 链。 链中的每个 DMFT 都有机会处理示例。 如果 DMFT 不想处理示例,则它可以充当直通,只需将示例传递到下一个 DMFT 即可。

对于 KsProperty 等控件,调用将进入流 - 链中的最后一个 DMFT 将首先获取调用,可以处理该调用,也可以传递到链中的上一个 DMFT。

错误将从 DMFT 传播到 DTM,然后传播到应用程序。 对于 IHV/OEM DMFT,任何一个 DMFT 无法实例化将是 DTM 的致命错误。

DMFT 要求:

  • DMFT 的输入引脚计数必须与以前的 DMFT 的输出引脚计数匹配,否则在初始化期间 DTM 会失败。 但是,同一 DMFT 的输入和输出引脚计数不需要匹配。

  • DMFT 需要支持接口 - IMFDeviceTransform、IMFShutdown、IMFRealTimeClientEx、IKsControl 和 IMFMediaEventGenerator;如果已配置 MFT0,或者链中的下一个 DMFT 需要 IMFTransform 支持,则可能需要支持 IMFTransform。

  • 在不使用帧服务器的 64 位系统上,必须注册 32 位和 64 位 DMF。 鉴于 USB 相机可能插入任意系统,对于“外部” (或非收件箱) USB 相机,USB 相机供应商应同时提供 32 位和 64 位 DMFT。

配置 DMFT 链

相机设备可以使用使用收件箱 USBVideo.INF 部分的自定义 INF 文件在 DLL 中提供 DMFT COM 对象。

在自定义中。INF 文件的“Interface AddReg”部分,通过添加以下注册表项来指定 DMFT CLSID:

CameraDeviceMftCLSIDChain (REG_MULTI_SZ) %Dmft0.CLSID%%Dmft.CLSID%,%Dmft2.CLSID%

如下面的示例 INF 设置所示, (将 %Dmft0.CLSID% 和 %Dmft1.CLSID% 替换为用于 DMFT) 的实际 CLSID 字符串,在Windows 10版本 1703 中最多允许 2 个 CLSID,第一个字符串最接近 DevProxy,最后一个字符串是链中的最后一个 DMFT。

平台 DMFT CLSID 为 {3D096DDE-8971-4AD5-98F9-C74F56492630}。

一些 示例 CameraDeviceMftCLSIDChain 设置:

  • 无 IHV/OEM DMFT 或平台 DMFT

    • CameraDeviceMftCLSIDChain = “” (或无需指定此注册表项)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • 平台 DMFT <-> IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = “{3D096DDE-8971-4AD5-98F9-C74F56492630}”,%Dmft.CLSID%

    • 下面是带有平台 DMFT (的 USB 相机的结果注册表项和 GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7} ) 的 USB 相机的结果注册表项的屏幕截图。

注册表编辑器 DMFT 链。

  • IHV/OEM DMFT0 <-> IHV/OEM DMFT1

    • CameraDeviceMftCLSIDChain = %Dmft0.CLSID%,%Dmft1.CLSID%,

注意

CameraDeviceMftCLSIDChain 最多可以有 2 个 CLSID。

如果配置 CameraDeviceMftCLSIDChain ,则 DTM 将跳过旧版 CameraDeviceMftCLSID 设置。

如果未配置 CameraDeviceMftCLSIDChain,并且配置了旧版 CameraDeviceMftCLSID, 然后,如果平台 DMFT 和平台 DMFT 支持其 USB 相机且平台 DMFT 支持,则链看起来 () DevProxy <– 平台 DMFT <– 平台 DMFT –>> OEM/IHV DMFT,或者如果平台 DMFT 或平台 DMFT 不支持相机,则 () DevProxy <-> OEM/IHV DMFT。

INF 文件设置示例:

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001
HKR,,DisablePlatformDmftFeatures,0x00010001,0x00000001
HKR,,CameraDeviceMftCLSIDChain, 0x00010000,%Dmft0.CLSID%,%Dmft1.CLSID%

平台设备 MFT

从版本 1703 Windows 10开始,Windows 为称为平台 DMFT (PDMFT) 的 UVC 相机提供收件箱设备 MFT。 此 DMFT 允许 IHV 和 OEM 利用 Windows 提供的后处理算法。

平台 DMFT 支持的功能 Windows 版本
为支持 ROI 的 USB 相机中的 3A 调整启用基于人脸的区域 (ROI) 。 Windows 10 版本 1703

注意

如果相机不支持基于 UVC 1.5 的 ROI,则即使设备选择使用 PDMFT,PDMFT 也不会加载。

UVC 相机可以通过 BOS 描述符指定 EnablePlatformDmft 来选择使用平台 DMFT。

要指定用于启用平台 DMFT 的值是一个 DWORD,名称为 UVC-EnablePlatformDmft ,并使用 BOS 描述符指定其值。 下面的示例 复合设备 部分演示了如何使用示例 BOS 描述符启用平台 DMFT。

如果无法按上文所述更新设备固件,可以使用自定义 INF 文件为设备启用平台 DMFT。

基于自定义 UVC 驱动程序或收件箱 UVC 驱动程序 () 的自定义 INF 文件必须包含以下 AddReg 条目:

EnablePlatformDmft: REG_DWORD: 0x0 (禁用) 启用0x1 ()

当此项设置为“启用” (0x1) 时,捕获管道将为设备使用收件箱平台 DMFT。 下面显示了此自定义 INF 部分的示例:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001

在版本 1703 Windows 10中,如果设备选择使用 PDMFT,则根据设备功能) 启用 PDMFT 支持的所有功能 (。 不支持 PDMFT 功能的精细配置。

注意

基于人脸的 ROI 坐标相对于传输到 PDMFT 的图像的视场进行计算。 如果由于使用 “缩放”、“平移”或数字窗口”等控件而修改了视图字段,则相机负责将提供的坐标映射回传感器的完整视野,考虑当前的缩放/平移窗口。

通过 MS OS 描述符进行人脸身份验证配置文件

Windows 10 RS5 现在对支持Windows Hello的任何相机强制实施人脸身份验证配置文件 V2 要求。 对于具有自定义相机驱动程序堆栈的基于 MIPI 的系统,可以通过 INF (或扩展 INF) 或通过用户模式插件 (设备 MFT) 发布此支持。

但是,对于 USB 视频设备,基于 UVC 的相机的约束是,对于 Windows 10 19H1,不允许使用自定义相机驱动程序。 所有基于 UVC 的相机都必须使用收件箱 USB 视频类驱动程序,并且任何供应商扩展都必须以设备 MFT 的形式实现。

对于许多 OEM/ODM,相机模块的首选方法是在模块固件中实现大部分功能,即通过 Microsoft OS 描述符。

以下相机支持通过 MSOS 描述符 (也称为 BOS 描述符) 发布人脸身份验证配置文件:

  • 仅用于传感器组中具有单独 IR 相机的 RGB 相机。

  • 仅 IR 相机用于具有单独 RGB 相机的传感器组中。

  • 带独立 IR 和 RGB 引脚的 RGB+IR 相机。

注意

如果相机固件不能满足上述三个要求之一,ODM/OEM 必须使用扩展 INF 来声明相机配置文件 V2。

Microsoft OS 描述符布局示例

下面提供了以下规范的示例:

  • Microsoft OS 扩展描述符规范 1.0

  • Microsoft OS 2.0 描述符规范

Microsoft OS 扩展描述符 1.0 规范

扩展属性 OS 描述符有两个组件

  • 固定长度标头部分
  • 一个或多个可变长度的自定义属性部分,紧随标题部分

Microsoft OS 1.0 描述符标头部分

“标头”部分描述 (人脸身份验证配置文件) 的单个自定义属性。

Offset 字段 大小(字节) 说明
0 dwLength 4 <>
4 bcdVersion 2 0x0100 版本 1.0
6 wIndex 2 0x0005 扩展属性 OS 描述符
8 wCount 2 0x0001 一个自定义属性

Microsoft OS 1.0 描述符自定义属性部分

Offset 字段 大小(字节) 说明
0 dwSize 4 0x00000036 (54) 此属性的总大小 (字节) 。
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) 属性名称) 的大小 ((以字节为单位)。
10 bPropertyName 36 UVC-CPV2FaceAuth Unicode 中的“UVC-CPV2FaceAuth”字符串。
46 dwPropertyDataLength 4 0x00000004 属性数据 (sizeof (DWORD) ) 的 4 字节。
50 bPropertyData 4 请参阅下面的数据架构 请参阅下面的数据架构。
有效负载架构

UVC-CPV2FaceAuth数据有效负载是一个 32 位无符号整数。 高阶 16 位表示 RGB 引脚公开的媒体类型列表的基于 0 的索引。 低序 16 位表示 IR 引脚公开的媒体类型列表的基于 0 的索引。

例如,一个类型 3 相机,它公开以下媒体类型,按从 RGB 引脚声明的顺序:

  • YUY2,640x480@30fps

  • MJPG,1280x720@30fps

  • MJPG,800x600@30fps

  • MJPG、1920x1080@30fps

IR 的以下媒体类型:

  • L8、480x480@30fps

  • L8、480x480@15fps

  • L8、480x480@10fps

有效负载值0x00010000将导致发布以下人脸身份验证配置文件:

Pin0: (RES==1280,720;FRT==30,1;SUT==MJPG) // 第二种媒体类型 (0x0001)
Pin1: (RES==480,480;FRT==30,1;SUT==L8) // 第一个媒体类型 (0x0000)

注意

在撰写本文时,Windows Hello至少要求为 RGB 流480x480@7.5fps,并为 IR 流340x340@15fps。 启用人脸身份验证配置文件时,需要 IHV/OEM 选择满足此要求的媒体类型。

类型 1 相机示例

对于类型 1 相机,由于没有 IR 引脚 (预期类型 1 相机将配对到传感器组) 计算机上的类型 2 相机,因此只会发布 RGB 媒体类型索引。 对于 IR 媒体类型索引,有效负载的低顺序 16 位值必须设置为0xFFFF。

例如,如果类型 1 相机公开了以下媒体类型列表:

  • YUY2,640x480@30fps

  • MJPG,1280x720@30fps

  • MJPG,800x600@30fps

  • MJPG、1920x1080@30fps

若要使用 MJPG 发布 CPV2FaceAuth,1280x720@30fps媒体类型,必须将有效负载设置为0x0001FFFF。

类型 2 相机示例

对于类型 2 相机,高阶 16 位必须设置为0xFFFF,低序 16 位表示要使用的 IR 媒体类型。

例如,对于具有以下媒体类型的类型 2 相机:

  • L8、480x480@30fps

  • L8、480x480@15fps

  • L8、480x480@10fps

如果第一个媒体类型用于人脸身份验证,该值必须为:0xFFFF0000。

Microsoft OS 扩展描述符 2.0 规范

MSOS 扩展描述符 2.0 可用于定义注册表值以添加人脸身份验证配置文件支持。 这是使用 Microsoft OS 2.0 注册表属性描述符完成的。

对于UVC-CPV2FaceAuth注册表项,下面显示了一个示例 MSOS 2.0 描述符集:

UCHAR Example2_MSOS20DescriptorSet_UVCFaceAuthForFutureWindows[0x3C] =
{
    //
    // Microsoft 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
    0x3C, 0x00,               // wTotalLength – 60 bytes

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x32, 0x00,               // wLength - 50 bytes
    0x04, 0x00,               // wDescriptorType – 4 for Registry Property
    0x04, 0x00,               // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
    0x30, 0x00,               // wPropertyNameLength – 36 bytes
    0x55, 0x00, 0x56, 0x00,   // Property Name - "UVC-CPV2FaceAuth"
    0x43, 0x00, 0x2D, 0x00,
    0x43, 0x00, 0x50, 0x00,
    0x56, 0x00, 0x32, 0x00,
    0x46, 0x00, 0x61, 0x00,
    0x63, 0x00, 0x65, 0x00,
    0x41, 0x00, 0x75, 0x00,
    0x74, 0x00, 0x68, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x04, 0x00,               // wPropertyDataLength – 4 bytes
    0x00, 0x00, 0x01, 0x00    // PropertyData – 0x00010000 (see Payload Schema)
}

添加UVC-CPV2FaceAuth注册表项时,设备无需发布 EnableDshowRedirection 注册表项,如 适用于 UVC 设备的 DShow Bridge 实现指南中所述。

但是,如果设备供应商必须支持较旧版本的 Windows 和/或需要在 Frame Server 中启用 MJPEG 解压缩,则必须添加 EnableDshowRedirection 注册表项。

传感器组生成

当 OEM 使用类型 1 和类型 2 相机生成系统以提供 RGB 和 IR 流以进行Windows Hello支持时,OEM 必须声明这两个相机作为合成传感器组的一部分。

为此,在扩展 INF 中声明一个 FSSensorGroupId 和 FSSensorGroupName 标记,以便在每个相机的设备接口属性下创建。

但是,如果未提供扩展 INF,则 ODM 可能会使用相同的 MSOS 描述符来发布 FSSensorGroupId 和 FSSensorGroupName 值。 收件箱Windows 10 USB 视频类驱动程序将自动采用其有效负载名称前缀为“UVC-”的任何 MSOS 描述符,并将标记迁移到设备接口属性存储中, (删除“UVC-”前缀) 。

因此,发布以下内容的类型 1 和类型 2 相机将允许 OS 将相机合成为多设备传感器组,以用于Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

每个标记的有效负载必须是 Unicode 字符串。 UVC-FSSensorGroupId有效负载必须是以下格式的 GUID 字符串:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX}

GUID 的值必须在类型 1 和类型 2 相机之间相同,并且两个相机都必须添加到相同的物理机箱中。 对于内置相机,物理底盘是计算机本身。 对于外部相机,类型 1 和类型 2 相机模块必须内置到连接到计算机的同一物理设备中。

传感器组的自定义设备接口类别

从 19H1 开始,Windows 提供 IHV/OEM 指定的扩展机制,允许将合成传感器组发布到任何自定义或预定义类别。 生成传感器组由 IHV/OEM 定义,在自定义 INF 中提供传感器组 ID 密钥:

FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <用于传感器组的友好名称>

除了 INF 中的两个上述 AddReg 条目外,还为自定义类别定义了新的 AddReg 条目:

FSSensorGroupCategoryList: {GUID};{GUID};...;{GUID}

使用分号 (;) 分隔的 GUID 列表定义多个类别。

声明匹配的 FSSensorGroupId 的每个设备都必须声明相同的 FSSensorGroupCategoryList。 如果列表不匹配,将忽略所有列表,默认情况下传感器组将发布到KSCATEGORY_SENSOR_GROUP,就像未定义任何自定义类别一样。

相机旋转

查看 相机设备方向

UVC 控制缓存

请参阅 UVC 控制缓存

BOS 和 MS OS 2.0 描述符

符合 UVC 的相机可以使用 Microsoft OS 2.0 描述符在平台功能 BOS 描述符中指定特定于 Windows 的设备配置值。 请参阅 MS OS 2.0 描述符上的文档,了解如何指定将设备配置传达给 OS 的有效 BOS 描述符。

Microsoft OS 2.0 描述符集标头

Offset 字段 大小(字节) 说明
0 wLength 2 此标头的长度(以字节为单位)必须为 10。
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Windows 版本。
8 wTotalLength 2 包括此标头大小的整个 MS OS 2.0 描述符集的大小。

Microsoft OS 2.0 Registry 属性描述符

Offset 字段 大小(字节) 说明
0 wLength 2 此描述符的长度(以字节为单位)
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 属性名称的长度。
8 PropertyName 变量 注册表属性的名称。
8+M wPropertyDataLength 2 属性数据的长度。
10+M PropertyData 变量 属性数据

在固件中指定有效的 MS OS 2.0 描述符时,USB 堆栈会将配置值复制到设备 HW 注册表项中,如下所示:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<Device ID>\<Instance ID>\Device Parameters

UVC 驱动程序从设备 HW 注册表项读取配置值,并相应地在 OS 上配置设备。 例如,如果固件指定要使用配置值注册为传感器相机的设备,则 UVC 驱动程序将在该类别下注册设备。

通过平台 BOS 描述符配置 UVC 设备是一种在 Windows 10 版本 1703 中启用的机制,可帮助 UVC 设备供应商在 Windows OS 上无需 INF 文件即可配置设备。

仍支持通过自定义 INF 配置 UVC 设备,并且优先于基于 BOS 描述符的机制。 通过 INF 指定设备属性时,无需添加前缀“UVC-”。 只有通过 BOS 描述符指定的设备属性以及特定于接口实例的设备属性才需要此前缀。 如果设备需要用户模式插件(如 DMFT),则需要提供 INF 来安装 DMFT。 无法使用固件对其进行配置。

当前通过 BOS 描述符支持的配置值

配置名称 类型 说明
SensorCameraMode REG_DWORD 在特定类别下注册相机。
UVC-FSSensorGroupID,UVC-FSSensorGroupName REG_SZ 具有相同UVC-FSSensorGroupID的组相机
UVC-EnableDependentStillPinCapture REG_DWORD 启用仍捕获方法 2/3
UVC-EnablePlatformDmft REG_DWORD 启用平台 DMFT

当 UVC 驱动程序看到前缀为“UVC-”的注册表值时,它会填充设备的类别接口实例注册表项,其值与没有前缀的值相同。 驱动程序将针对固件指定的任何变量执行此操作,而不仅仅是上面列出的变量。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{e5323777-f976-4f5b-9b55-b94699c46e44}\<Device Symbolic Link>\Device Parameters

为了使 OS 能够使用 BOS 平台设备功能和 MS OS 2.0 描述符,设备描述符必须指定要0x0210或更高版本的 bcdUSB 版本。

复合设备示例

本部分为具有两个相机功能的示例复合设备提供了 BOS 描述符和 MS OS 2.0 描述符。 一个函数是 UVC 颜色相机,第二个函数是 UVC IR 相机。

示例描述符如下所示:

  1. 在 KSCATEGORY_VIDEO_CAMERA 下注册颜色相机功能

  2. 在 KSCATEGORY_SENSOR_CAMERA 下注册 IR 相机功能

  3. 启用彩色相机功能仍然图像捕获

  4. 将颜色和 IR 相机功能关联为组

设备枚举后,USB 堆栈将从设备检索 BOS 描述符。 遵循 BOS 描述符是特定于平台的设备功能。

#include <usbspec.h>

const BYTE USBVideoBOSDescriptor[0x21] =
{
    /* BOS Descriptor */
    0x05,                       // Descriptor size
    USB_BOS_DESCRIPTOR_TYPE,    // Device descriptor type BOS
    0x21, 0x00,                 // Length 0x21 (33) this and all sub descriptors
    0x01,                       // Number of device capability descriptors

    /* Platform Device Capability Descriptor */
    0x1C,                                   // 28 bytes bLength
    USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE,  // Platform Descriptor type
    USB_DEVICE_CAPABILITY_PLATFORM,         // bDevCapabilityType PLATFORM
    0,                                      // bReserved
    0xDF, 0x60, 0xDD, 0xD8,                 // PlatformCapabilityUUID
    0x89, 0x45,                             // MS OS2.0 Descriptor
    0xC7, 0x4C,                             // D8DD60DF-4589-4CC7-9CD2-659D9E648A9F
    0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
                                            // CapabilityData
    0x00, 0x00, 0x00, 0x0A,                 // dwWindowsVersion for Windows 10 and later
    0xC8, 0x02,                             // wLength 0x2C8 (712)
    0x01,                                   // bMS_VendorCode - any value. e.g. 0x01
    0x00                                    // bAltEnumCmd 0
};

BOS 平台功能描述符指定:

  1. MS OS 2.0 描述符平台功能 GUID

  2. 此处bMS_VendorCode (供应商控制代码设置为 1。供应商喜欢) 检索 MS OS 2.0 描述符可能需要任何值。

  3. 此 BOS 描述符适用于 OS 版本Windows 10及更高版本。

看到 BOS 描述符后,USB 堆栈将发出供应商特定的控制请求来检索 MS OS 2.0 描述符。

用于检索 MS OS 2.0 供应商特定描述符的控制请求的格式:

bmRequestType BRequest wValue WIndex wLength 数据
1100 0000B bMS_VendorCode 0x00 0x07 Length 返回的 MS OS 2.0 描述符集 blob

bmRequestType

  • 数据传输方向 - 设备到主机

  • 类型 – 供应商

  • 收件人 - 设备

bRequest

描述符集信息结构中返回 的bMS_VendorCode 值。

wValue

设置为0x00。

wIndex

0x7 MS_OS_20_DESCRIPTOR_INDEX。

wLength

MS OS 2.0 描述符集的长度,如 BOS 描述符中返回。 本示例中0x25C (604) 。

设备应返回 MS OS 2.0 描述符,如 USBVideoMSOS20DescriptorSet 中指定的描述符。

USBVideoMSOS20DescriptorSet 描述颜色和 IR 函数。 它指定以下 MS OS 2.0 描述符值:

  1. 设置标头

  2. 配置子集标头

  3. 颜色相机函数子集标头

  4. 传感器组 ID 的注册表值功能描述符

  5. 传感器组名称的注册表值功能描述符

  6. 用于启用静止映像捕获的注册表值功能描述符

  7. 用于启用平台 DMFT 的注册表值功能描述符

  8. IR 相机函数子集标头

  9. 传感器组 ID 的注册表值功能描述符

  10. 传感器组名称的注册表值功能描述符

  11. 用于将相机注册为传感器相机的注册表值功能描述符

固件将为供应商请求提供处理程序,该请求将返回本部分开头所述的虚构设备的以下 MS OS 2.0 描述符。

UCHAR USBVideoMSOS20DescriptorSet[0x2C8] =
{
    /* Microsoft OS 2.0 Descriptor Set Header */
    0x0A, 0x00,             // wLength of MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00,             // wDescriptorType == MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x00, 0x0A, // dwWindowsVersion – 0x10000000 for Windows 10
    0xC8, 0x02,             // wTotalLength - Total length 0x2C8 (712)

    /* Microsoft OS 2.0 Configuration Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_CONFIGURATION
    0x01, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_CONFIGURATION
    0x00,                   // bConfigurationValue set to the first configuration
    0x00,                   // bReserved set to 0.
    0xBE, 0x02,             // wTotalLength - Total length 0x2BE (702)

    /****************Color Camera Function******************/

    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x00,                   // bFirstInterface field of the first IAD
    0x00,                   // bReserved set to 0.
    0x6E, 0x01,             // wSubsetLength - Length 0x16E (366)

    /****************Register the Color Camera in a sensor group******************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 0x4E (78) bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,   // This is just an example GUID.
    '0', 0x00, 'C', 0x00,   // You need to generate and use your
    '9', 0x00, '4', 0x00,   // own GUID for the sensor group ID
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 0x20 (32) bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,

    /****************Enable Still Image Capture for Color Camera************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x54, 0x00,             // wLength 0x54 (84) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x46, 0x00,             // wPropertyNameLength – 0x46 (70) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnableDependentStillPinCapture"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'D', 0x00, 'e', 0x00,
    'p', 0x00, 'e', 0x00,
    'n', 0x00, 'd', 0x00,
    'e', 0x00, 'n', 0x00,
    't', 0x00, 'S', 0x00,
    't', 0x00, 'i', 0x00,
    'l', 0x00, 'l', 0x00,
    'P', 0x00, 'i', 0x00,
    'n', 0x00, 'C', 0x00,
    'a', 0x00, 'p', 0x00,
    't', 0x00, 'u', 0x00,
    'r', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,   // Enable still pin capture using Method 2 or Method 3

    /****************Enable Platform DMFT for ROI-capable USB Camera************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3C, 0x00,             // wLength 0x3C (60) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2E, 0x00,             // wPropertyNameLength – 0x2E (46) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnablePlatformDmft"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'P', 0x00, 'l', 0x00,
    'a', 0x00, 't', 0x00,
    'f', 0x00, 'o', 0x00,
    'r', 0x00, 'm', 0x00,
    'D', 0x00, 'm', 0x00,
    'f', 0x00, 't', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,  // Enable Platform DMFT

    /****************IR Camera Function*********************************************/

    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x01,                   // bFirstInterface set of the second function
    0x00,                   // bReserved set to 0.
    0x48, 0x01,             // wSubsetLength - Length 0x148 (328)

    /********Register the IR Camera to the same sensor group as the Color Camera*****/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 78 bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,
    '0', 0x00, 'C', 0x00,
    '9', 0x00, '4', 0x00,
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 32 bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,

    /****************Make IR camera visible to applications*********************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x30, 0x00,             // wLength 0x30 (48) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x22, 0x00,             // wPropertyNameLength – 0x22 (34) bytes
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'M', 0x00, 'o', 0x00,
    'd', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00, // This exposes the camera to OS as an IR only camera
                            // i.e. KSCATEGORY_SENSOR_CAMERA

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3A, 0x00,             // wLength 0x3A (58) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'S', 0x00, 'k', 0x00,
    'i', 0x00, 'p', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'E', 0x00, 'n', 0x00,
    'u', 0x00, 'm', 0x00,
    'e', 0x00, 'r', 0x00,
    'a', 0x00, 't', 0x00,
    'i', 0x00, 'o', 0x00,
    'n', 0x00, 0x00, 0x00,
    0x04, 0x00,             // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00  // This exposes the camera to applications looking for IR only cameras
};