容器 ID 设备驱动程序接口 (DDI)
在显示微型端口驱动程序中实现此函数和结构:
- DxgkDdiGetChildContainerId
- DXGK_CHILD_CONTAINER_ID
容器 ID 说明
监视设备中的新功能可以提供更好的用户体验。 具体而言,通用串行总线 (USB) 集线器是监视器上用于连接鼠标和键盘的常用连接器。 此外,HDMI 等连接器支持音频,因此音频扬声器也嵌入在监视器中。 许多新的显示设备都支持触摸功能。 这可以通过减少用户桌面上的线路混乱来提供出色的用户体验。
以直观的方式向用户直观地呈现这些设备的连接和状态非常重要。 “设备和打印机”页是随 Windows 7 一起引入的。 如下图所示,“设备和打印机”文件夹向用户显示连接到电脑的已安装设备,从而提供了一种在打印机、音乐播放器、相机、鼠标或数字相框上检查的简单方法, (仅举几) 。 同时,此页面对包含在同一硬件中的设备进行分组,以便用户更轻松地发现其所有驱动程序。
借助 Windows 7,Microsoft 为设备引入了 容器 ID 的概念:“系统提供的设备标识字符串,用于唯一地对与计算机上安装的单功能或多功能设备关联的功能设备进行分组。”
要使容器 ID 概念成功,Windows 中的所有设备类都必须支持它,并且整个生态系统需要在硬件中实现它。 在 Windows 7 中,如果插入了多个支持音频的监视器,则用户很难确定哪个显示器映射到哪个音频终结点。 触摸数字化器也存在同样的困难。 在 Windows 8 中,显示设备类添加了对容器 ID 的支持。 这使得显示设备的所有功能都可以报告相同的容器 ID,并在 Windows 用户界面和 API 中直观地配对。
容器 ID 用户方案
对于嵌入音频扬声器的监视器,请考虑以下工作流:
- 用户使用 HDMI 电缆连接监视器。
- WDDM 驱动程序向 Windows 图形堆栈报告显示设备的存在。
- Windows 图形堆栈使用设备驱动程序接口 (随 Windows 8 引入的 DDI) 查询 WDDM 驱动程序以获取容器 ID。
- 显示驱动程序在监视器中查询容器 ID,并将其传递回 Windows。
- 同时,音频驱动程序必须将完全相同的容器 ID 传递给 Windows 音频堆栈。
- 如果在 “设备和打印机 ”控制面板中查看,则显示器和扬声器将组合在一起。
多设备聚合与显示-音频同步
一、典型应用场景:带音频的显示器设备
1.硬件配置:
-
显示器内置扬声器(通过HDMI/DP传输音频)
-
支持EDID 2.0+的显示面板
-
WDDM 1.2+兼容的GPU驱动
用户操作流:
sequenceDiagramparticipant Userparticipant Monitorparticipant WDDM_Driverparticipant Windows_Graphicsparticipant Audio_DriverUser->>Monitor: 连接HDMI线缆Monitor->>WDDM_Driver: 发送EDID(含容器ID)WDDM_Driver->>Windows_Graphics: 报告显示设备(DXGK_DISPLAY_INFORMATION)Windows_Graphics->>WDDM_Driver: 调用DXGKDDI_QUERY_CONTAINER_IDWDDM_Driver->>Monitor: 查询容器ID(通过DDC/CI或I2C)WDDM_Driver->>Windows_Graphics: 返回容器IDWindows_Graphics->>Audio_Driver: 同步相同容器IDNote over Windows_Graphics,Audio_Driver: 设备和打印机中聚合显示设备与音频端点
二、容器ID传递的三种模式
1.理想情况(显示器提供容器ID)
-
数据来源:EDID的VSDB区块(Offset 0x50-0x6F)
-
格式要求:
typedef struct _CONTAINER_ID_DESCRIPTOR {UCHAR bDescriptorType; // 固定值0x83UCHAR bContainerID[16]; // GUID格式
} CONTAINER_ID_DESCRIPTOR;
2.自动生成模式(无显式容器ID)
-
生成算法
# 基于EDID的PNS三元组生成GUID def generate_container_id(edid):manufacturer = edid[0x08:0x0A] # 2字节制造商IDproduct_code = edid[0x0B:0x0D] # 2字节产品码serial = edid[0x0C:0x10] # 4字节序列号return uuid.uuid5(uuid.NAMESPACE_URL, f"Display/{manufacturer:04X}-{product_code:04X}-{serial:08X}")
3.设备所有权转换时的异常处理
-
GPU驱动重置(如TDR超时恢复)
-
显示器热插拔事件
-
固件模式切换(如HDR开关
-
固件模式切换(如HDR开关)
4.系统行为
阶段 | 操作 | 用户可见现象 |
---|---|---|
所有权释放 | 驱动调用DxgkCbReleaseDevice | 屏幕闪烁1-2秒 |
容器ID重新协商 | Windows发起IRP_MN_QUERY_ID (BusQueryContainerID) | 设备管理器短暂刷新 |
音频端点重建 | 音频堆栈收到DEVICE_INTERFACE_ARRIVAL 通知 | 扬声器设备短暂断开 |
三、厂商实施检查清单
- EDID编程:确保VSDB包含有效容器ID(可通过AW EDID Editor验证)
- 驱动测试:通过WHCK的Device.Graphics.DisplayContainerID测试项
- 音频同步:验证扬声器属性页显示的容器ID与显示器一致
- 热插拔测试:重复插拔50次检查容器ID稳定性
注意:对于USB-C Dock等多功能设备,需确保所有子设备(网络/存储/音频)共享同一容器ID