前面toaster驱动程序的安装都是通过手动安装的方式,把sys/inf等文件安装到系统中。说实话,这么复杂的过程除了开发者,其他人能流畅的安装上驱动还真是天方夜谭了。如果读者曾在电脑城买过电脑配件,如无线网卡,蓝牙适配器,应该有印象:到手的除了这么设备本身,还会附带一张提供安装程序的小光盘和一份安装说明。安装说明一般都会要求先运行安装程序,然后重启插入设备,之后设备就可以正常使用了。这张光盘就是所谓的预安装光盘,里面的程序就是驱动预安装程序,这正是本篇的主题--驱动预安装程序。

winddk示例目录src/setup/devcon提供了预安装驱动的方法。编译后,可以通过devcon install path_to_inffile hwid的方式安装驱动程序或通过devcon update path_to_inffile hwid的方式更新驱动,前者是后者的扩展。devcon update调用newdev.dll!UpdateDriverForPlugAndPlayDevices函数实现驱动程序的更新。调用时传入inf文件的路径和inf文件中的DeviceId即可。但是按ms文档的说明,UpdateDriverForPlugAndPlayDevices只能为已存在的设备更新驱动,也就所谓的Hardware-first安装方式。

HardwareId [in]A pointer to a NULL-terminated string that supplies the hardware identifier to match <span style="color:#FF0000;">existing devices</span> on the computer. 
RemarksUpdateDriverForPlugAndPlayDevices <span style="color:#FF0000;">scans the devices on the system</span> and attempts to install the drivers specified by
FullInfPath for any devices that match the specified HardwareId value. 

以toaster驱动为例,在底层总线驱动BusEnum.sys已经成功安装的情况下,执行devcon update会提示安装失败,而执行devcon install 能成功预安装驱动:

c:\studio><span style="color:#FF0000;">devcon update</span> C:\studio\toaster\wdm\inf\amd64\simple.inf {b85b7c50-6a0
1-11d2-b841-00c04fad5171}\MsToaster
Updating drivers for {b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster from C:\st
udio\toaster\wdm\inf\amd64\simple.inf.
<span style="color:#FF0000;">devcon failed.</span>
c:\studio><span style="color:#FF0000;">devcon install</span> C:\studio\toaster\wdm\inf\amd64\simple.inf {b85b7c50-6a
01-11d2-b841-00c04fad5171}\MsToaster
Device node created. Install is complete when drivers are installed...
Updating drivers for {b85b7c50-6a01-11d2-b841-00c04fad5171}\MsToaster from C:\st
udio\toaster\wdm\inf\amd64\simple.inf.
<span style="color:#FF0000;">Drivers installed successfully.</span>


截图显示,devcon install安装驱动后,toaster设备实例为ROOT\TOASTER\0000。从结果来看,驱动虽然安装了,但并没有安装在BusEnum总线下,而出现在root总线下,换句话说toaster驱动并没有运行只是静静的蹲在角落里;当真正的toaster设备接入系统后,由pnp管理器为该设备匹配devcon install预安装的驱动程序。

既然说道UpdateDriverForPlugAndPlayDevices是Hardware-first安装方式,如果先运行enum.exe -p 1(由于没有驱动程序,会在设备管理器下出现带黄色感叹号的Unknow Device),再以devcon update方式后安装设备驱动,也能使前面虚拟出来的toaster设备正常工作。再继续新的内容前,容我先总结一下UpdateDriverForPlugAndPlayDevices函数的作用:本质上,安装驱动需要依靠UpdateDriverForPlugAndPlayDevices这个函数,执行这个函数相当于在设备管理器右键菜单上点击"扫描检测硬件改动"。它会查找当前已经添加到系统中但还没有安装驱动程序的硬件设备,并为之安装驱动。

前面介绍的cmdUpdate函数并不能实现驱动程序预安装,接下来的篇幅我们来看看它的加强版----cmdInstall,它是如何实现驱动程序预安装的。在设备插入系统前,系统没有设备信息,因此cmdInstall所做的是虚拟出一个设备(在root下虚拟一个设备),并将它注册到系统注册表中去。

cmdInstall先调用SetupDiGetINFClass,从inf文件中获取设备类GUID。然后将获得的设备类Guid传递给SetupDiCreateDeviceInfoList用以创建设备信息块列表和SetupDiCreateDeviceInfo创建设备信息块。这个很好理解,windows将属性相近的设备归入同一个设备类,如usb类,hid类。系统应该用一个列表维护设备类中的各个设备,除此之外系统中应该还有一个像面向对象语言中基类一样的描述符,用以描述设备类的属性(我按代码猜的,毕竟windows的pnp管理器没公开)。现在要在这个设备类下创建一个新设备,那必定要获得设备类的描述符,并添加新设备属性---这个设备的HardwareID(就如派生类除了有基类的公共属性还有自己特有的属性),然后往设备类列表中添加新设备。SetupDiSetDeviceRegistryProperty完成新设备的注册工作。一切完成后,还要调用类安装器做设备类安装时的相似工作(如设置注册表,拷贝文件等),这个动作反应到代码中就是调用SetupDiCallClassInstaller。现在虚拟的设备已经存在了,就可以调用UpdateDriverForPlugAndPlayDevices更新驱动了。这些过程完成了我们的目标----预安装驱动程序。

cmdInstall函数很强大,可以预安装总线驱动/功能驱动和简单的过滤驱动,如果inf文件中提供了hardwareID。本篇到此结束,下一篇来讨论一下类过滤驱动和多层过滤驱动的安装。

最后附上参考文档

安装驱动程序(1)----驱动预安装相关推荐

  1. 驱动预安装成功,串口出不来解决办法

    经常在论坛看到有人安装USB转串口驱动,提示"预安装成功",但是找不到串口的问题,正好有些心得,记录在这. 驱动预安装成功,表示驱动文件已经放入系统,此时USB设备只要正常与主机交 ...

  2. win7驱动预安装分享【xp/win8/win10的可以参考】

    说实在的,说道window的驱动预安装,感觉是个很简单的事情,但是如果不了解window驱动预安装的一些原理,分分钟让你导出碰壁.废话不多说,直入正题! 我们都知道windows有一个叫做window ...

  3. adb的安装,手机驱动的安装

    adb的安装,手机驱动的安装 ​ 1.首先在官网下载adb的压缩包:adb 下载地址: https://adbdownload.com/ 2.解压到根目录下,windows系统: 然后设置环境变量: ...

  4. 这台计算机上没有安装驱动程序,电脑打印机显示没有安装驱动怎么办啊

    1. 为什么已安装打印机,电脑显示没有装,怎么解决 1.你的安装的打印机没有被设置成为默认打印机,将打印机设置成默认打印机就好了: 2.提示打印机未能安装,多数是电脑系统里面没有这台打印机的驱动,从官 ...

  5. linux带can驱动程序,PCAN驱动的安装和Python-can的使用(Linux)

    PCAN驱动的安装和Python-can的使用(Linux) 1. Download PCAN 需要peak can driver 和 PCAN-Basic for Linux 进行. 注: 可以继续 ...

  6. c226打印机驱动安装_打印机驱动正确安装方法

    打印机 在我们的办公区域实用性是非常强的,不仅可以提高办公的效率,而且还能节省用户时间,是一款非常不错的办公小助手.长时间使用, 打印机驱动程序无法使用 ,怎么回事呢?用户一定要做出详细了解,是否需要 ...

  7. c226打印机驱动安装_打印机驱动无法安装怎么办 打印机驱动安装方法【介绍】...

    在进行打印的时候,往往会遇到各种问题,例如 打印机 驱动无法安装 等.那么遇到此类的情况应该怎样去解决呢?首先要做的就是判断问题的来源是在哪里,之后再寻找办法进行解决.接下来的内容中IT百科小编就为大 ...

  8. c226打印机驱动安装_打印机驱动怎么安装图文详解

    打印机驱动该怎么安装呢?打印机需要打印文件的时候一般是连接到电脑上的,电脑必须安装对应打印机的驱动才能进行打印,不同的打印机驱动安装方法是大同小异的.下面,小编就将打印机驱动安装的方法传授给大家. 打 ...

  9. c226打印机驱动安装_打印机驱动怎么安装?国产操作系统安装打印驱动方法图文步骤详解...

    接下来为大家分享的是关于国产操作系统安装打印驱动的操作方法. 机型:VA机器除外 操作步骤: 步骤1:驱动压缩包解压并提取 步骤2:添加打印驱动 (1)打开打印机设置 (开始-控制面板-打印机) (2 ...

最新文章

  1. Hadoop自学笔记(二)HDFS简单介绍
  2. apply的调用 http://bbs.51js.com/thread-82017-1-3.html
  3. 一个可以直接使用的可用iptables配置的stateless NAT实现
  4. twitter bbs
  5. linux df -h卡成狗
  6. apache ignite_从In Memory Data Grid,Apache Ignite快速入门
  7. 《Python Cookbook 3rd》笔记(3.11):随机选择
  8. react的导出是怎么实现的_从零开始开发一个 React
  9. Hexo 简明入门教程(一)
  10. 谷粒学院111111
  11. GAN:两者分布不重合JS散度为log2的数学证明
  12. 股票软件c++源代码
  13. 胡因梦 :自我觉察是一切智慧的基础
  14. Excel如何一次性显示所有隐藏工作表
  15. java获取汉字拼音_Java获取汉字对应的拼音(全拼或首字母)
  16. 在windows和ubuntu下安装Syncthing
  17. linux虚拟机查询用户列表,linux基础(用户管理)
  18. 寻找第(前)k大的数的方法总结
  19. 大佬们都在用的几款简单易用的文本编辑器
  20. 大数据和人工智能之间,主要是什么关系?

热门文章

  1. 微信打开网页不能下载的解决
  2. VMware虚拟机与主机之间传输文件
  3. 刷脸支付实现支付工具安全与便捷的统一
  4. IBM小型机AIX操作系统总结13–网络配置
  5. 毕业论文参考文献的快速插入
  6. 产品手册怎么做?用什么软件?
  7. 安全路上慢慢走,持续更新
  8. buu部分ctf crypto题解
  9. 分析kMeans、二分K-Means算法及肘部法则
  10. 客座编辑:孙茂松(1962-),清华大学计算机科学与技术系教授,博士生导师,党委书记。...