当 Windows 为该设备加载驱动程序时,如果硬件设备匹配两个或多个 inf 文件,会发生什么情况?
例如,我的电脑中的磁盘驱动器已加载两个驱动程序,cdrom.sys 和 iaStorF.sys。cdrom.sys 是从 cdrom.inf 文件加载的,而 iaStorF.sys 是从我从英特尔安装的 oem2.inf 文件加载的。
Windows 是否搜索所有 inf 文件并加载任何匹配的内容?
如果是的话,哪个是“主 INF 文件”,我的意思是,当我在设备管理器中单击磁盘驱动器并转到“详细信息”选项卡,然后查看 inf 名称时,它会显示 cdrom.inf 文件,即使它也匹配 oem2.inf。
然后,如果我查看我的显示器,它也有两个驱动程序,它们从两个 inf 文件 oem22.inf 和 monitor.inf 加载。在“详细信息”和 inf 名称下,它显示 oem22.inf。
为什么选择 oem22.inf 而不是 monitor.inf?
答案1
它实际上是一个主驱动程序。您看到的另一个是过滤驱动程序 -- iaStorF.sys,其中 F 表示过滤器。
过滤驱动程序是一种 Microsoft Windows 驱动程序,用于扩展或修改外围设备的功能,或支持个人计算机中的专用设备。它是插入到现有驱动程序堆栈中以执行某些特定功能的驱动程序、程序或模块。维基百科)
这是我的系统的屏幕截图,对于磁盘驱动器,它位于
HKLM\System\CurrentControlSet\Control\Class\{4D36E967-E325-11CE-BFC1-08002BE10318}
主驱动程序是 disk.sys,其他 3 个都是过滤驱动程序,EhStoreClass.sys 和 partmgr.sys 是 Windows 8 中的默认 MS 驱动程序,edevmon.sys 来自 eset。
对于显示器来说,附加的 inf 是可选的,用于扩展容量,比如颜色配置文件 (.icm) 或 EDID 信息,这些 inf 不是显示器运行所必需的,只有 monitor.sys 是必需的。(微软)
有关过滤器驱动程序的更多信息,我将在这里重现以供将来参考。(微软)
过滤驱动程序是可选驱动程序,可增加设备的价值或修改设备的行为。过滤驱动程序可以为一个或多个设备提供服务。总线过滤驱动程序
总线过滤驱动程序通常会为总线增加价值,由 Microsoft 或系统 OEM 提供(参见可能的驱动程序层图)。总线过滤驱动程序是可选的。总线上可以有任意数量的总线过滤驱动程序。
例如,总线过滤驱动程序可以对标准总线硬件实现专有增强。
对于 ACPI BIOS 描述的设备,电源管理器会在每个此类设备的总线驱动程序上方插入 Microsoft 提供的 ACPI 筛选器(总线筛选器驱动程序)。ACPI 筛选器执行设备电源策略并打开和关闭设备。ACPI 筛选器对其他驱动程序是透明的,在非 ACPI 计算机上不存在。低级筛选器驱动程序
低级过滤驱动程序通常会修改设备硬件的行为(参见可能的驱动程序层图)。它们通常由 IHV 提供,并且是可选的。一个设备可以有任意数量的低级过滤驱动程序。
低级设备过滤驱动程序会监控和/或修改对特定设备的 I/O 请求。通常,此类过滤器会重新定义硬件行为以符合预期规范。
低级类过滤驱动程序监视和/或修改一类设备的 I/O 请求。例如,鼠标设备的低级类过滤驱动程序可以提供加速,执行鼠标移动数据的非线性转换。上级过滤驱动程序
上层过滤驱动程序通常为设备提供增值功能(参见可能的驱动程序层图)。此类驱动程序通常由 IHV 提供,并且是可选的。设备可以有任意数量的上层过滤驱动程序。
上层设备过滤驱动程序为特定设备增加了价值。例如,键盘的上层设备过滤驱动程序可以强制执行额外的安全检查。
上层类过滤驱动程序为特定类的所有设备增加了值。
答案2
可以在这篇旧的 Microsoft 文章(XP 时间)中找到一些信息
Windows 如何确定在安装过程中安装最合适的设备驱动程序:
运行 Windows 安装程序时,可能会有多组设备驱动程序或 .inf 文件与特定设备配合使用。安装程序和即插即用都会尝试通过选择与要安装的设备最匹配的设备驱动程序来解决这些冲突。
即插即用可以搜索所有 .inf 文件,以找到最适合安装特定设备的设备驱动程序。即插即用不会在找到第一个匹配项后停止搜索。即插即用会继续搜索在即插即用的搜索路径中列出的所有 .inf 文件,如以下注册表项中所定义:
HKEY-LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
设备路径:Reg_Expand_SZ:%Systemroot%\Inf
安装程序会构建一个包含 .inf 文件中匹配项的兼容设备驱动程序列表,并为找到的每个驱动程序分配一个“等级”。等级范围从“0”到“0xFFFF”,其中 0 表示最合适的匹配项,而 0xFFFF 表示最差的匹配项。等级最低的设备驱动程序被视为最合适的匹配项,并且是已安装的设备驱动程序。
但是,如果两个设备驱动程序的最低等级相同,则安装程序将使用日期最近的设备驱动程序。如果其中一个设备驱动程序已签名,而另一个设备驱动程序未签名,则未签名的设备驱动程序日期将被赋值为 0xFFFFFFFF,并选择并安装已签名的设备驱动程序。
需要注意的是,默认情况下,64 位 Windows 版本不会接受未签名的驱动程序作为候选。这仅在 32 位 Windows 中才有可能。
以下文章包含最新的算法: Windows 如何对驱动程序进行排名
Windows 为与设备匹配的驱动程序分配一个等级。等级表示驱动程序与设备的匹配程度。驱动程序等级由等于或大于零的整数表示。等级越低,驱动程序与设备的匹配程度越高。
驱动程序的等级是一个复合值,取决于驱动程序的签名方式、驱动程序支持的功能以及驱动程序与驱动程序之间的匹配类型。设备识别字符串设备报告的信息以及在设备标识字符串中指定的INF 模型部分驱动程序 INF 文件。
排名由 DWORD 类型的值表示。排名是签名分数、特征分数和标识符分数的总和。排名的格式为 0xSSGGTHHH,其中 S、G、T 和 H 是四位字段,SS、GG 和 THHH 字段代表三个排名分数,如下所示:
- 这签名分数根据驱动程序的签名方式对驱动程序进行排名。签名分数仅取决于 SS 字段的值。未指定的签名分数表示为 0xSS0000000。
有关 Windows Vista 及更高版本的 Windows 如何使用驱动程序签名来确定驱动程序的安装方式的概述,请参阅 签名类别和驱动程序安装。
基本上,Windows 签名机构颁发的数字签名得分最高。
- 这特征分数根据驱动程序支持的功能对驱动程序进行排名。功能分数仅取决于 GG 字段的值。未指定的功能分数表示为 0x00GG0000。
此信息在 .inf 文件中指定,因此制造商可以订购自己的驱动程序。
这段文字相当混乱和令人困惑。请参阅链接以获取有关标识符分数的更详细的描述。