出差时发现一些大公司使用DpInst工具安装驱动,当时觉得这种方式安装驱动相当方便,出于好奇回来后自己也尝试这种安装方式。


DpInst.exe工具位于ddk目录redist\DIFx\dpinst\EngMui下,同时M$在src\setup\DPInst目录下提供了定制DpInst驱动安装包的样例。一个基本的驱动安装包至少要包含cat,sys(已签名,测试签名也可以,​​为cat和sys做测试签名的方法可以参考这里​​)和inf这些文件,除此之外可能需要dll(CoIntall)文件。DpInst安装这样的驱动包后,控制面板-程序和功能面板中会出现一项,如下图是我安装toaster后在程序和功能面板中多出的项:


使用DpInst安装驱动程序_redis

(图1)

src\setup\DPInst:提供一个DpIn.xml,里面指定需要定制的图标文件等。


    DpInst安装驱动包后,会在C:\WINDOWS\system32\DRVSTORE目录下产生一个形如"驱动程序名_xxxx"(图2)的文件夹,里面包含了cat/sys/inf等文件(图3)。



使用DpInst安装驱动程序_驱动安装_02

(图2)



使用DpInst安装驱动程序_安装包_03

(图3)


当系统检测到有新设备插入时,PNP管理器会到这个目录匹配HDIW,如果HWID和inf文件中指定的HWID恰能匹配,则为新设备安装驱动。


    怎样,是不是觉得DpInst是一个方便的驱动安装工具?开始时,我的确这样觉得,但在测试中我发现了一些不足:没法为已存在的设备栈再安装过滤驱动。仍然以toaster驱动为例:用DpInst安装如下的两个驱动包:1.toaster功能驱动驱动包(simple.inf/toaster.sys/toaster.cat);2.filter过滤驱动驱动包(filter.inf/devupper.sys/toaster.cat)。虽然DpInst都能成功安装驱动,但最多只有功能驱动能正常工作,如图4



使用DpInst安装驱动程序_安装包_04


(图4)


从图中可以看到DRVSTORE目录下的确已经存在两个驱动包,但是模拟设备插入后仅安装了simple.inf指定的设备。另外,注册表信息也反应了toaster设备堆栈上并没有插入过滤驱动:

使用DpInst安装驱动程序_redis_05


(图5)


如果将DpInst替换为熟悉的devcon.exe工具,倒可以将过滤驱动安装到设备栈中,如图5:




使用DpInst安装驱动程序_安装包_06



(图5)



使用DpInst安装驱动程序_redis_07



(图6)


虽然devcon需要通过install/update的一系列复杂动作才能把过滤驱动装到设备栈中,但至少比DpInst装不了第三方驱动要好点,为此我问过日本同事DpInst为什么不能做到安装第三方过滤驱动的原因,他的解释是Pnp管理器在DrvStore目录中匹配到了符合条件的HWID(simple驱动包),因此就不会再安装filter过滤驱动包。当然,我们也可以通过用SetupDi接口将过滤驱动安装到合适的位置。