window显示驱动开发—监视筛选器驱动程序(三)
Microsoft 提供了一个通用的监视器类函数驱动程序,它可以处理大多数与监视器相关的任务。 除非供应商想提供超出监视器类函数驱动程序所能提供的服务,否则没有必要使用供应商提供的监视器驱动程序。 如果监视器供应商选择提供筛选器驱动程序,则该驱动程序由筛选器设备对象(筛选器 DO)来表示,该对象位于监视器设备堆栈中功能设备对象 (FDO) 的上方。 筛选器驱动程序也由监控器供应商提供,它可以处理来自用户模式应用程序的请求。 筛选器驱动程序与用户模式应用程序之间的接口是专用的,只有监控器供应商知道。 监视器设备堆栈不会通过显示数据通道命令接口 (DDC/CI) 来对显示器进行编程控制,因此计数器供应商不应编写用于此目的的筛选器驱动程序。
核心概念解析
1. 微软的监视器类函数驱动程序 (Monitor Class Function Driver)
- 角色:这是操作系统内置的通用驱动程序。它的主要职责是通过显示数据通道 (DDC) 从监视器的扩展显示识别数据 (EDID) 中读取信息,例如制造商、型号、支持的分辨率和时序等。
- 功能:它将这些信息提供给显示端口驱动程序和图形用户界面(如“显示设置”),以便系统能够正确识别和配置显示器。对于绝大多数标准显示器,这个驱动程序已经完全足够。
2. 供应商提供的监视器筛选器驱动程序 (Vendor-Supplied Monitor Filter Driver)
目的:正如您所说,只有当供应商需要提供超出标准功能的增值服务时,才需要开发这种驱动程序。常见的增值功能包括:
- 专有的颜色校准和色彩管理。
- 自定义的显示模式或情景模式(如游戏、阅读、电影)。
- 控制显示器上的物理按钮或LED指示灯。
- 集成到供应商特定的系统管理工具中。
架构位置:您准确地指出了它在设备堆栈中的位置——附加在功能设备对象 (FDO) 之上,形成一个筛选器设备对象 (Filter DO)。这意味着所有发往监视器的I/O请求包 (IRP) 都会先经过这个筛选器驱动程序,它可以选择处理、修改或忽略这些请求后再传递给下方的微软标准驱动程序。
3. 与用户模式应用程序的通信
- 专用接口:筛选器驱动程序通过设备接口 (Device Interface) 或I/O控制代码 (IOCTL) 与供应商提供的用户模式应用程序(如控制中心或配置工具)进行通信。这个接口是私有且未公开的,只有该供应商的应用程序知道如何与之交互。应用程序通过调用 CreateFile 打开设备句柄,然后使用 DeviceIoControl 发送自定义的IOCTL命令来驱动特定的功能。
4. 关于DDC/CI的重要说明
您提到的这一点至关重要,它澄清了一个常见的误解:
- DDC/CI (Display Data Channel Command Interface):这是一个由VESA标准化的协议,允许主机通过显示电缆(如VGA、DVI、HDMI、DisplayPort)的DDC线路向显示器发送命令(如调整亮度、对比度)。
- 堆栈分工:在Windows驱动架构中,直接发送DDC/CI命令的任务是由显示端口驱动程序(即显卡驱动程序)完成的,而不是监视器设备堆栈。
- 正确做法:因此,如果供应商只是想通过DDC/CI实现基本的显示器控制(如亮度调节),他们不应该为此编写一个监视器筛选器驱动程序。相反,他们应该与显卡厂商(如NVIDIA、AMD、Intel)合作,确保其显卡驱动能通过DDC/CI正确控制他们的显示器。或者,他们可以在用户模式应用程序中直接调用支持DDC/CI的API(如Windows上的 PhysicalMonitorFromPoint 和 GetMonitorCapabilities 等函数,这些函数最终会由显卡驱动执行)。
总结与工作流程
- 即插即用:当一台新显示器接入时,Windows会尝试为其安装驱动程序。
- 首选通用驱动:系统首先会使用内置的监视器类函数驱动程序。这会创建一个FDO,并成功读取EDID信息。
- 查找特定驱动:如果显示器提供了特定的硬件ID(在EDID中),系统会在本地和Windows Update中搜索是否有为其签名的筛选器驱动程序。
- 加载筛选器:如果找到,系统会加载这个供应商提供的筛选器驱动程序,并在FDO之上创建Filter DO。
- 应用程序交互:用户运行供应商提供的控制软件(如Dell Display Manager、LG OnScreen Control)。该软件通过私有接口与筛选器驱动程序通信。
- 执行命令:筛选器驱动程序收到来自应用程序的指令后,它可能会:
- 通过私有方式与显卡驱动交互(如果需要涉及图形流水线)。
- 处理一些本地逻辑。
- 但请注意:它通常不直接处理DDC/CI流量,那是显卡驱动的职责。