MSDN上有关设备和驱动安装介绍的总入口 Device and Driver Installation (Windows Drivers)
MSDN上有关知识点和一些基本概念的介绍分散在各个章节里,这里只是把我认为比较重要的,需要经常回顾的知识点罗列在这里,以供经常回顾和参考。
摘录自Device Installation Components (Windows Drivers)
驱动和设备安装中涉及到的模块由两大部分组成。一部分是由IHV和OEM提供,另外一部分由Windows操作系统提供
Vendor-Provided Device Installation Components (Windows Drivers)
泛泛来讲,为了支持某种设备,所有由驱动和设备开发人员提供的东西加在一起我们可以统一叫做一个Driver Package。所以MSDN图中的Driver Package表达的更多的是下面所描述的“驱动文件”和“与安装相关的文件”
细分起来Driver Package由以下几个部分组成。更消息的描述可以参考Components of a Driver Package
* 驱动文件(Driver Files)
就是我们平时看到的.sys文件,一个或者多个。Windows会在device被安装时copy一份sys文件到"%SystemRoot%\system32\drivers"
* 与安装相关的文件(Installation Files)
- INF file: 有且只有一个。就是我们平时看到的.inf文件,该文件是必须的,用于描述设备安装设置的详细信息。e.g. osrusbfx2\windows\drivers\x86\osrusbfx2.inf
- catalog file: 有且只有一个。就是我们平时看到的.cat文件,它提供了对整个driver package的数字签名
* 其他文件
Driver Package中除了驱动文件和安装相关文件外的部分都归到这里,主要包括:
- Device Installation Applicaiton:
- [Class Installers], 可选,这里我们暂不介绍因为osrusbfx2没有用到
- [Class Co-Installers], 可选,这里我们暂不介绍因为osrusbfx2没有用到
- [Device Co-Installers], 可选,这里我们暂不介绍因为osrusbfx2没有用到
- ......
System-Provided Device Installation Components (Windows Drivers)
-
-
系统booting过程中设备的检测和枚举
-
系统running过程中设备的添加和删除
-
-
[Configuration Manager API]
-
Driver Store 从Vista开始,操作系统只会允许安装本地维护的一个系统目录中的Driver Package,这个系统目录就定义为Driver Store。
一般情况下,设备驱动的开发人员都会提供一个驱动的安装包,这个安装包的工作就是将Driver Package拷贝到本地的一个目录下,在Driver Package中的文件可以被系统用来安装设备之前,这些文件首先应该已经被___Staging___进了Driver Store. (所谓的___Staging___,就是将Driver Package中的所有的文件,包括INF file以及INF file引用到的所有文件拷贝到Driver Store的过程,似乎可以将[Staging]翻译为“入场”或者“上台”。)
一个Driver Package只有通过系统的验证和检查合格后才会被___Staging___入Driver Store,这些检查包括:
-
通过数字签名检查Driver Package是否是完整可信的
-
当前用户是否有权安装驱动
-
INF file语法正确,INF file引用的文件都存在于Driver Package之中
在Driver Package被___Staging___入Driver Store后,操作系统就可以使用Driver Package来自动安装新设备而不用用户的帮助了。
Driver Store的位置:
-
XP: C:\WINDOWS\system32\DRVSTORE
-
Vista & Win7: C:\Windows\System32\DriverStore\FileRepository
-
严格地讲,我们平时说的驱动的安装的概念应该分两大部分来讨论。 一个是Driver Package的预安装,也就是MSDN上所谓的Preinstall,预安装会将我们的inf,sys等等相关文件从我们自己的安装目录拷贝到Windows系统自己维护的驱动仓库中Driver Store。还有一个是设备的配置。MSDN上的官方说法是configuration of devices, 该动作发生的前提条件是设备连上主机PC。主要是由Pnp Manager根据INF file为设备创建设备节点devnode。这是两个不同的概念和过程,而且设备能够被配置必然发生在Driver Package被预安装之后-即系统上已经存在**匹配(match)**的驱动安装文件,不管这些文件是Windows安装时预置的(inbox),还是我们自己提供的后来预安装上去的。
可以重点看一下 Uninstalling Devices and Driver Packages (Windows Drivers) 类似的,卸载也包括两个方面。一个是Driver Package的卸载,也就是将Windows驱动仓库中的我们的inf,sys等文件移除掉。但注意这不会动到我们自己的安装目录。还有一个就是将系统中注册的devnode卸载掉,这里的卸载不考虑设备此时是否连接在PC上。
如果我们希望定制安装和卸载过程则需要写一个专门的Device Installation Applicaiton。具体怎么写可以参考Writing a Device Installation Application (Windows Drivers)
一个真正商用化的Device Installation Applicaiton必须要兼容Windows的AutoRun机制,这主要是为了支持hardware-first installation过程,在该过程中如果Windows发现无法在本地找到一个匹配的驱动就会进入Found New Hardware Wizard流程并且在此过程中Windows还是无法自动帮助用户找到可安装的驱动,最后势必会提示要求用户提供安装盘,则AutoRun会调用安装盘里预置的Device Installation Applicaiton
同时还要考虑两种典型的用例:
所谓软件优先,指的是,在PC上还未插入过我们驱动需要支持的设备之前,先将Driver Package预安装(PreInstall)到电脑上。这样当下次设备插入时,Windows就会自动根据设备的hardware ID找到我们预先安装的驱动并为我们的设备安装驱动。
所谓硬件优先,指的是:在我们最新的Driver Package还未被预安装到电脑上之前,我们的设备就被插入了。 此时有两种情况:
- 1)Windows发现本地有驱动匹配,那么就立即安装它。这样的驱动主要指的是Windows安装盘自带的inbox驱动或者是通过以前的software-first installation过程Preinstall的驱动。总之一旦本地有可以安装的驱动,Windows就不会尝试提示用户提供安装媒介或者发起Windows Update过程去获取更新的驱动了。
- 2)如果在本地没有发现匹配的驱动,Windows就会激活Found New Hardware Wizard流程。
drvinst示例参考了WDK的例子DIFxCmd和devcon,主要演示了:
- 如何使用[DIFxAPI]-DriverPackageInstall预安装Driver Package,注意缺省情况下如果调用DriverPackageInstall的时候有设备连接在PC上则DriverPackageInstall也会执行设备的配置。这非常方便,因为DriverPackageInstall内部封装了更复杂的逻辑,这些逻辑明显是对一些[SetupAPI]的调用。
- 如何使用[DIFxAPI]-DriverPackageUninstall对Driver Package进行卸载
- 如何使用[SetupAPI]对设备节点进行卸载。
这里重点讲一下DriverPackageInstall在缺省参数情况下的行为(Flags参数为0)。其他参数的用法大家可以自己尝试。
-
- 目前PC上没有连接我们的设备,以前也没有连接过我们的设备。 缺省情况下DriverPackageInstall会将我们的Driver Package预安装到DIFx driver store
-
- 目前PC上没有连接我们的设备, 但以前连接过我们的设备nonpresent device,上次连接安装的驱动比我们要安装的驱动更匹配(match) 缺省情况下DriverPackageInstall会将我们的Driver Package预安装到DIFx driver store,因为上次连接安装的驱动比我们要安装的驱动更match,所以该函数不会设置CONFIGFLAG_REINSTALL标记,这样如果同样的设备连接到它上次连接过的同样的端口上,Windows并不会给它更新我们的驱动。如果我们希望对以后的设备都使用我们新安装的驱动,可以使用DRIVER_PACKAGE_FORCE标志。
-
- 目前PC上没有连接我们的设备, 但以前连接过我们的设备,我们要安装的驱动比上次连接安装的驱动更匹配(match) 缺省情况下DriverPackageInstall会将我们的Driver Package预安装到DIFx driver store,同时对以前连接的设备节点设置CONFIGFLAG_REINSTALL标记,这样如果同样的设备连接到它上次连接过的同样的端口上,Windows会给它更新我们的驱动。
-
- 目前PC上连接有我们的设备, 当前安装的驱动比我们要安装的驱动更匹配(match) 缺省情况下DriverPackageInstall会将我们的Driver Package预安装到DIFx driver store,因为当前安装的驱动比我们要安装的驱动更match,所以该函数不会给连接的设备更新我们的驱动。
-
- 目前PC上连接有我们的设备, 我们要安装的驱动比当前安装的驱动更匹配(match) 缺省情况下DriverPackageInstall会将我们的Driver Package预安装到DIFx driver store,因为我们要安装的驱动比当前安装的驱动更匹配match,所以该函数会给连接的设备更新我们的驱动。