在Windows驱动开发中,UMDF为用户模式驱动程序提供了一个安全稳定的开发框架。而INF文件作为驱动安装的核心,其正确配置对于驱动能否正常工作至关重要。这篇博客详细介绍UMDF驱动的INF文件配置,特别是设备类的选择与配置。实可以把INF文件理解为驱动的"安装说明书" - 它告诉Windows系统:
-
这个驱动叫什么名字
-
应该安装到哪里
-
属于什么类型的设备
-
需要哪些文件
INF文件:驱动的"身份证"和"说明书"
INF文件其实就是个文本文件,但它包含了驱动安装所需的所有信息。主要完成四个任务:
-
自我介绍 - 我叫什么,版本多少,谁开发的
-
文件说明 - 需要复制哪些文件,放到哪里
-
设备分类 - 我属于哪类设备(最重要!)
-
服务注册 - 如何启动和运行
解剖INF文件:一看就懂的结构
1. 版本信息 - "身份证页"
[Version]
Signature = "$WINDOWS NT$" // 固定写法,表示这是Windows驱动
Class = SampleDevice // 设备类型:决定在设备管理器哪里显示
ClassGuid = {GUID} // 设备类型的唯一编号
Provider = %ManufacturerName% // 开发商名称
DriverVer = 01/01/2024,1.0.0.0 // 驱动版本
CatalogFile = YourDriver.cat // 签名文件(安全相关)
2.文件管理 - "附件清单" 源文件节(SourceDisksNames/Files)
[SourceDisksNames]
1 = %DiskName%,,,"" // 磁盘标签[SourceDisksFiles]
YourDriver.dll = 1,, // 驱动文件在哪[DestinationDirs]
YourDriver.DriverFiles = 12 // 驱动文件安装到System32\drivers
3.设备安装 - "安装步骤" 设备安装节(Device Installation)
[Manufacturer]
%ManufacturerName% = MyCompany,ntamd64 // 厂商信息[MyCompany]
%DeviceName% = YourDevice_Install, Root\YourDevice // 设备名称和ID[YourDevice_Install]
Include = umdf.inf // 引用UMDF标准安装步骤
Needs = UmdfDriverEntry // 需要UMDF驱动入口
CopyFiles = YourDriver.DriverFiles //ceInstall
设备类的选择
对于不涉及真实硬件的开发,主要就是两个选择:
System类 - "虚拟硬件"
把它想象成:创建一个虚拟的设备
[Version]
Class = System
ClassGuid = {4d36e97d-e325-11ce-bfc1-08002be10318}
适合场景:
-
虚拟串口(让软件以为有额外的COM端口)
-
虚拟摄像头(视频会议软件的虚拟摄像头)
-
测试设备(模拟各种硬件进行测试)
特点:
-
在"设备管理器"→"系统设备"中显示
-
应用程序可以用
CreateFile
打开设备 -
支持所有Windows版本
SoftwareComponent类 - "纯软件服务"
把它想象成:安装一个系统服务组件
[Version]
Class = SoftwareComponent
ClassGuid = {5c4c3332-344d-483c-8739-259e934c9cc8}
适合场景:
-
音频处理插件(音效增强、降噪)
-
视频解码器(支持新的视频格式)
-
AI推理引擎(图像识别、语音处理)
-
安全服务组件(加密、验证服务)
特点:
-
在"设备管理器"→"软件组件"中显示
-
通过专用API调用,不直接"打开设备"
-
只支持Windows 10及以上版本
实际项目选择指南
场景1:开发虚拟串口
需求:让串口调试工具能连接到一个虚拟的COM端口
选择:System类
原因:串口工具期望用CreateFile("COM3")这种方式打开设备
场景2:开发音频特效插件
需求:为系统音频添加实时混响效果
选择: SoftwareComponent类
原因:这是音频处理服务,通过音频API集成,不是独立的"设备"
场景3:开发USB设备模拟器
需求:模拟一个USB键盘,让系统认为插入了真实键盘
选择:System类
原因:需要让系统检测到"硬件设备"存在
场景4:开发AI图像识别服务
需求:提供图像识别能力,供其他程序调用
选择: SoftwareComponent类
原因:这是算法服务,应用程序应该通过API调用识别功能
强烈建议从System类开始,因为它的概念更直观,掌握了基础后,再学习SoftwareComponent类来开发更现代化的软件组件。