window显示驱动开发—监视筛选器驱动程序(三)

Microsoft 提供了一个通用的监视器类函数驱动程序,它可以处理大多数与监视器相关的任务。 除非供应商想提供超出监视器类函数驱动程序所能提供的服务,否则没有必要使用供应商提供的监视器驱动程序。 如果监视器供应商选择提供筛选器驱动程序,则该驱动程序由筛选器设备对象(筛选器 DO)来表示,该对象位于监视器设备堆栈中功能设备对象 (FDO) 的上方。 筛选器驱动程序也由监控器供应商提供,它可以处理来自用户模式应用程序的请求。 筛选器驱动程序与用户模式应用程序之间的接口是专用的,只有监控器供应商知道。 监视器设备堆栈不会通过显示数据通道命令接口 (DDC/CI) 来对显示器进行编程控制,因此计数器供应商不应编写用于此目的的筛选器驱动程序。

核心概念解析

  1. 微软的监视器类函数驱动程序 (Monitor Class Function Driver)
  • 角色:这是操作系统内置的通用驱动程序。它的主要职责是通过显示数据通道 (DDC) 从监视器的扩展显示识别数据 (EDID) 中读取信息,例如制造商、型号、支持的分辨率和时序等。
  • 功能:它将这些信息提供给显示端口驱动程序和图形用户界面(如"显示设置"),以便系统能够正确识别和配置显示器。对于绝大多数标准显示器,这个驱动程序已经完全足够。
  1. 供应商提供的监视器筛选器驱动程序 (Vendor-Supplied Monitor Filter Driver)

目的:正如您所说,只有当供应商需要提供超出标准功能的增值服务时,才需要开发这种驱动程序。常见的增值功能包括:

  • 专有的颜色校准和色彩管理。
  • 自定义的显示模式或情景模式(如游戏、阅读、电影)。
  • 控制显示器上的物理按钮或LED指示灯。
  • 集成到供应商特定的系统管理工具中。

架构位置:您准确地指出了它在设备堆栈中的位置------附加在功能设备对象 (FDO) 之上,形成一个筛选器设备对象 (Filter DO)。这意味着所有发往监视器的I/O请求包 (IRP) 都会先经过这个筛选器驱动程序,它可以选择处理、修改或忽略这些请求后再传递给下方的微软标准驱动程序。

  1. 与用户模式应用程序的通信
  • 专用接口:筛选器驱动程序通过设备接口 (Device Interface) 或I/O控制代码 (IOCTL) 与供应商提供的用户模式应用程序(如控制中心或配置工具)进行通信。这个接口是私有且未公开的,只有该供应商的应用程序知道如何与之交互。应用程序通过调用 CreateFile 打开设备句柄,然后使用 DeviceIoControl 发送自定义的IOCTL命令来驱动特定的功能。
  1. 关于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 等函数,这些函数最终会由显卡驱动执行)。

总结与工作流程

  1. 即插即用:当一台新显示器接入时,Windows会尝试为其安装驱动程序。
  2. 首选通用驱动:系统首先会使用内置的监视器类函数驱动程序。这会创建一个FDO,并成功读取EDID信息。
  3. 查找特定驱动:如果显示器提供了特定的硬件ID(在EDID中),系统会在本地和Windows Update中搜索是否有为其签名的筛选器驱动程序。
  4. 加载筛选器:如果找到,系统会加载这个供应商提供的筛选器驱动程序,并在FDO之上创建Filter DO。
  5. 应用程序交互:用户运行供应商提供的控制软件(如Dell Display Manager、LG OnScreen Control)。该软件通过私有接口与筛选器驱动程序通信。
  6. 执行命令:筛选器驱动程序收到来自应用程序的指令后,它可能会:
  • 通过私有方式与显卡驱动交互(如果需要涉及图形流水线)。
  • 处理一些本地逻辑。
  • 但请注意:它通常不直接处理DDC/CI流量,那是显卡驱动的职责。
相关推荐
嵌入式-老费43 分钟前
Linux camera驱动开发(DVP接口的camera sensor)
驱动开发
VernonJsn16 小时前
visual studio 2022的windows驱动开发
ide·驱动开发·visual studio
嵌入式郑工1 天前
RK3566 LubanCat 开发板 USB Gadget 配置完整复盘
linux·驱动开发·ubuntu
雾削木2 天前
树莓派 ESPHome 固件编译与烧录全攻略(解决超时与串口识别问题)
驱动开发
春日见3 天前
win11 分屏设置
java·开发语言·驱动开发·docker·单例模式·计算机外设
DarkAthena3 天前
【GaussDB】手动编译不同python版本的psycopg2驱动以适配airflow
驱动开发·python·gaussdb
松涛和鸣4 天前
DAY66 SPI Driver for ADXL345 Accelerometer
linux·网络·arm开发·数据库·驱动开发
嵌入式郑工4 天前
# RK3576 平台 RTC 时钟调试全过程
linux·驱动开发·ubuntu
GS8FG4 天前
针对Linux,RK3568平台下,I2C驱动的一点小小的领悟
linux·驱动开发
一路往蓝-Anbo4 天前
第 4 篇:策略模式 (Strategy) —— 算法的热插拔艺术
网络·驱动开发·stm32·嵌入式硬件·算法·系统架构·策略模式