Windows驱动匹配详解

在Windows下,几乎所有的硬件设备都需要安装驱动后才能正常工作,我们重装系统后第一件事就是要为各设备安装好驱动,我们可以下载官方驱动手动安装,也可以让我Windows自动扫描安装,还可以使用驱动精灵、电脑管家之类的工具帮我们安装,为了发挥硬件设备最好的性能,我们还需要及时把驱动升级到最新的版本。那么,这些工具是如何为硬件设备匹配到最佳的驱动的呢?此文就这个问题一探究竟。

驱动匹配相关信息

设备都是通过hardware ID进行标识,一个设备一般有多个hardware ID和compatible ID,这些ID对设备的标识程度按照顺序依次降低,我们可以在Windows设备管理器中查看到设备的硬件Id和兼容Id。

Windows下的驱动必须包含一个信息文件(INF)以进行安装,INF文本文件包含设备安装组件(device installation components)安装驱动所必需的所有信息。从INF文件中可以提取驱动匹配所需的信息:

(1)驱动提供商

(2)驱动类型

(3)驱动的日期和版本

(4)驱动的特征值,用来衡量驱动对设备特征的支持程度

(5)驱动支持的操作系统版本和硬件平台

(6)驱动支持的设备的hardware ID和compatible ID

设备和驱动的标识匹配是指设备的hardware ID或compatible ID与驱动INF文件指定的hardware ID或compatible ID的匹配,匹配程度从高到低有以下4中类型:

(1)设备的hardware ID和INF的hardware ID匹配,匹配程度由设备的hardware ID的位置确定。

(2)设备的hardware ID和INF的compatible ID匹配,匹配程度由设备的hardware ID的位置确定。

(3)设备的compatible ID和INF的hardware ID匹配,匹配程度由设备的compatible ID的位置确定。

(4)设备的compatible ID和INF的compatible ID匹配,匹配程度由设备的compatible ID的位置和INF的compatible ID的位置确定,前者的优先级高。

驱动签名在驱动的匹配中也起着很关键的作用,签名的排序优先级如下:

(1)有微软签名的,包括:

* 优先级别 (Premium) 和标准级别 (Standrd) 的 WHQL 签名;

* Inbox 驱动签名 ( Signatures for inbox drivers ) ;

* 可靠驱动签名 (DRS, Driver Reliability Signature);

* SE 签名 (Windows Sustained Engineering);

* 老版本 Windows 的 WHQL 签名;

(2)有效代码签名,系统管理员可以设定安全策略来指定受信任的根证书颁发的微软代码签名证书的签名等同于微软签名;

(3)没有签名的驱动,但 INF DDInstall 中有 .nt后缀;

(4)没有签名的驱动,但 INF DDInstall 中没有 .nt后缀;

(5)没有签名或签名有问题而无法确认是否有签名的驱动。

驱动匹配规则

驱动安装工具在服务器端存储了大量的驱动,对于同一个设备可能有多个驱动都合适,那么哪个驱动再是最佳的呢?驱动匹配时就是按照如下匹配规则来选择最佳的驱动:

(1)客户端上报设备ID(hardware ID和compatible ID)的有序列表,操作系统版本,硬件平台。

(2)结合设备ID,操作系统版本,硬件平台与驱动库进行匹配,得到所有可用的驱动,若无可用的驱动,则匹配失败。

(3)选择签名最佳的驱动。

(4)选择特征最佳的驱动。

(5)选择匹配类型最佳的驱动。

(6)选择日期最新的驱动。

(7)选择版本最高的驱动。

(8)选择任一驱动。

驱动信息提取方法

前面提到驱动所支持的硬件等信息都是保存在INF文件中,为了能快速匹配驱动,就需要把这些信息先从INF文件中提取出来,下面就详细说明驱动信息的提取方法

 

1.基本信息的提取

Version section出现在INF文件最开始的位置,每一个INF文件都必须包含这个section。

[Version]

Signature="signature-name"

[Class=class-name]

[ClassGuid={nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}]

[Provider=%INF-creator%]

[LayoutFile=filename.inf [,filename.inf]... ]  (Windows 2000 and Windows XP)

[CatalogFile=filename.cat]

[CatalogFile.nt=unique-filename.cat]

[CatalogFile.ntx86=unique-filename.cat]

[CatalogFile.ntia64=unique-filename.cat]  (Windows XP and later versions of Windows)

[CatalogFile.ntamd64=unique-filename.cat]  (Windows XP and later versions of Windows)

DriverVer=mm/dd/yyyy[,w.x.y.z]

[DontReflectOffline=1] (Windows Vista and later versions of Windows)

[PnpLockDown=0|1] (Windows Vista and later versions of Windows)

[DriverPackageDisplayName=%driver-package-description%]

[DriverPackageType=PackageType]

(1)Signature必须是$Windows NT$或$Chicago$,表明在所有Windows系统下是可用的。

(2)Class指定使用该INF文件安装驱动的设备类型,关于类型的详细信息参考http://msdn.microsoft.com/en-us/library/windows/hardware/ff553426(v=vs.85).aspx

(3)Provider指定驱动的提供商,%INF-creator%在Strings section中定义。

(4)DriverVer指定驱动的日期和版本。日期是所有文件的最新日期,日期的格式为mm/dd/yyyy或mm-dd-yyyy,年必须包含4个数字,月和日必须包含2个数字;版本w.x.y.z是可选的,如果指定了版本,则w是必需的,x、y、z是可选的,w、x、y、z都是大于等于0小于65535的整数。从Windows 2000开始,INF文件在Version section中必须包含DriverVer,为整个INF指定版本信息,DDInstall sections也可以包含DriverVer,且比前者更明确,优先级更高。

(5)DriverPackageDisplayName指定驱动显示的名称,%driver-package-description%在Strings section中定义。

(6)DriverPackageType指定驱动的类型。

 

2.设备ID、操作系统、硬件平台、驱动特征的提取

(1)从Manufacturer section中提取所有的Models section name。

[Manufacturer]

manufacturer-identifier

[manufacturer-identifier]

[manufacturer-identifier]

...

manufacturer-identifier格式如下:

manufacturer-name |

%strkey%=models-section-name |

%strkey%=models-section-name [,TargetOSVersion] [,TargetOSVersion] ...  (Windows XP and later versions of Windows)

提取manufacturer-name或models-section-name作为Models section name。

(2)TargetOSVersion提取规则

nt[Architecture][.[OSMajorVersion][.[OSMinorVersion][.[ProductType][.SuiteMask]]]]

nt 指定操作系统是基于NT的,Windows 2000及以后的版本都是基于NT的。

Architecture 指定硬件平台,若指定,必须为x86, ia64, or amd64。Windows Server 2003 SP1以前的版本,若Architecture未指定,Model section可用于任何硬件平台;Windows Server 2003 SP1及以后的版本,非x86的操作系统必须指定Architecture,x86的操作系统是可选的。

OSMinorVersion 操作系统的主版本号。


Windows version


Major version


Windows 8


6


Windows Server 2008 R2


6


Windows 7


6


Windows Server 2008


6


Windows Vista


6


Windows Server 2003 R2


5


Windows Server 2003


5


Windows XP


5


Windows 2000


5

OSMinorVersion 操作系统的子版本号。


Windows version


Minor version


Windows 8


2


Windows Server 2008 R2


1


Windows 7


1


Windows Server 2008


0


Windows Vista


0


Windows Server 2003 R2


2


Windows Server 2003


2


Windows XP


1


Windows 2000


0

ProductType 在Winnt.h文件中定义的VER_NT_xxxx,若指定,操作系统的ProductType必须与之匹配。

SuiteMask 在Winnt.h文件中定义的VER_SUITE_xxxx,若指定,操作系统的SuiteMask必须与之匹配。

TargetOSVersion的提取规则如下:

1)TargetOSVersion若指定,必须以nt开头

2)TargetOSVersion的Architecture若指定,则为指定的硬件平台;若未指定,对于Windows Server 2003 SP1以前的版本的操作系统,为任何硬件平台,对于Windows Server 2003 SP1及以后版本的操作系统,为x86硬件平台。

3)TargetOSVersion的OSMajorVersion[.OSMinorVersion]指定该section适用的操作系统的最低版本;若OSMajorVersion指定而OSMinorVersion未指定,则OSMinorVersion为0;若OSMajorVersion和OSMinorVersion都未指定,则为Windows 2000及以后所有版本。

(3)从Model section中提取操作系统版本,硬件平台,设备ID,设备描述,DDInstall section name

[models-section-name] |

[models-section-name.TargetOSVersion]  (Windows XP and later versions of Windows)

device-description=install-section-name[,hw-id][,compatible-id...]

[device-description=install-section-name[,hw-id][,compatible-id]...] ...

一个models-section-name可能有多个Models section,带有不同的TargetOSVersion,每一个Models section的操作系统版本和硬件平台需要结合所有同名(名称为models-section-name. [TargetOSVersion])section确定,规则如下:

1)按TargetOSVersion的提取规则获取每个section的操作系统版本区间和硬件平台。

2)对于任何一个section,在同一个硬件平台下,如果任何两个同名section的版本区间存在交集,则以起始版本高的区间为准,从起始版本低的区间中移去交集。

从Model section的每一行提取一个指定的设备,device-description为设备描述,hw-id为hardware ID, compatible-id为compatible ID,install-section-name为该设备对应的DDInstall section name。

(3)从DDInstall section name提取对应某一设备的驱动特征和驱动版本。

[install-section-name] |

[install-section-name.nt] |

[install-section-name.ntx86] |

[install-section-name.ntia64] |  (Windows XP and later versions of Windows)

[install-section-name.ntamd64]  (Windows XP and later versions of Windows)

[DriverVer=mm/dd/yyyy[,x.y.v.z] ]

[FeatureScore=featurescore]...  (Windows Vista and later versions of Windows)

install-section-name和install-section-name.nt适用于所有的硬件平台,其它的为指定的硬件平台。

从DriverVer中提取驱动对应某一设备在指定的硬件平台下的版本,规则同从Version section中提取DriverVer。

从FeatureScore中提取驱动对应某一设备在指定的硬件平台下的特征值,值越小表明支持的特征越佳。

3.多个INF文件

以每个INF为单位进行提取信息,提取所有INF文件。

参考文献

http://msdn.microsoft.com/en-us/library/windows/hardware/ff546228(v=vs.85).aspx

时间: 2024-10-08 09:45:08

Windows驱动匹配详解的相关文章

【转】Linux下Android ADB驱动安装详解

原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比较多,本人使用的Ubuntu系统好多厂商的Android手机都无法正确的识别,经过一番折腾,和查阅SDK,现把Linux下ADB驱动配置的方法和当中会遇到的相关问题的解决方法整理出来贡献给大家. Linux下使用手机USB调试模式连接ADB进行Android程序的调试,配置驱动没有Windows来的

MTK平台LCD驱动框架详解(一)

许多学习嵌入式的进入MTK开发平台,很多东西都会感到很陌生.在MTK平台上你可以简简单单几分钟就点亮一块屏.加上MTK快速开发的节奏,也很少有时间自己整理学习.如果不思进取,不加班加点学习.很容易就慢慢--.这也难怪有些人说MTK造就了一批懒人,毁掉了一批工程师.但其实都是基于linux开发,核心的东西都是一样一样的.我刚入行业,在迷茫之际,自己整理跟踪源码.想慢慢找回自己熟悉的感觉,掌握MTK的整体框架.也希望能给有需要的人带来些帮助.好吧!前话说到这,开始正题. 本文肯定有不少地方会出现错误

《Linux设备驱动开发详解(第3版)》海量更新总结

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2015.2.26 几乎完成初稿. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第1章 <Linux设备驱动概述及开发环境构建>[D]删除关于LDD6410开发板的介绍[F]更新新的Ubuntu虚拟机[N]添加关于QEMU模拟vexpress板的描述 第2章 <驱动设计的硬件基础> [N]增加关于SoC的介绍:[N]增加关于eFuse的内容:[D]删除ISA总线的内容了:[N]增加关于SP

MTK平台LCD驱动框架详解(二)

前篇博客链接:http://blog.csdn.net/xuan_h/article/details/38519975 上篇博文说到了mtkfb_probe函数,本文在说mtkfb_probe函数之前.我还是打算在从应用程序的调用开始分析下具体的调用过程.这是我们理解驱动框架的核心,而并不是简单的接受. 一.驱动核心Fbmem.c(alps\kernel\drivers\video\Fbmem.c)分析 下面先摘取一部分源码,源码包括:入口函数.fb_fops.fb_fops中的open函数.用

《Linux设备驱动开发详解(第3版)》进展同步更新

本博实时更新<Linux设备驱动开发详解(第3版)>的最新进展. 2014.6.30 目前初步完成4-9章,相对于第2版,这几章主要的变更. [F]是修正或升级:[N]是新增知识点:[D]是删除的内容 第4章 <Linux内核模块>[F]改正关于模块使用非GPL license的问题:[F]修正关于__exit修饰函数的内存管理 第5章 <Linux文件系统与设备文件>[F]修正关于文件系统与块设备驱动关系图:[N]增加应用到驱动的file操作调用图:[N]增加通过ne

windows下权限详解——————【Badboy】

随着动网论坛的广泛应用和动网上传漏洞的被发现以及SQL注入式攻击越来越多的被使用,WEBSHELL让防火墙形同虚设,一台即使打了所有微软补丁.只 让80端口对外开放的WEB服务器也逃不过被黑的命运.难道我们真的无能为力了吗?其实,只要你弄明白了NTFS系统下的权限设置问题,我们可以对 crackers们说:NO! 要打造一台安全的WEB服务器,那么这台服务器就一定要使用NTFS和Windows NT/2000/2003.众所周知,Windows是一个支持多用户.多任务的操作系统,这是权限设置的基

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》china-pub 预售

<Linux设备驱动开发详解:基于最新的Linux 4.0内核>china-pub今日上线进入预售阶段: http://product.china-pub.com/4733972 推荐序一 技术日新月异,产业斗转星移,滚滚红尘,消逝的事物太多,新事物的诞生也更迅猛.众多新生事物如灿烂烟花,转瞬即逝.当我们仰望星空时,在浩如烟海的专业名词中寻找,赫然发现,Linux的生命力之旺盛顽强,斗志之昂扬雄壮,令人称奇.它正以摧枯拉朽之势迅速占领包括服务器.云计算.消费电子.工业控制.仪器仪表.导航娱乐等

《Linux设备驱动开发详解(基于最新4.0内核)》前言

Linux从未停歇脚步.Linus Torvalds,世界上最伟大的程序员之一,Linux内核的创始人,Git的缔造者,仍然在没日没夜的合并补丁,升级内核.做技术,从来没有终南捷径,拼的就是坐冷板凳的傻劲. 这是一个连阅读都被碎片化的时代,在这样一个时代,人们趋向于激进.浮躁.内心的不安宁使我们极难静下心来研究什么.我见过许许多多的Linux工程师,他们的简历书写着"精通"Linux内核,有多年的工作经验,而他们的"精通"却只是把某个寄存器从0改成1,从1改成0的不