安装驱动程序(1)----驱动预安装

前面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. 
Remarks

UpdateDriverForPlugAndPlayDevices <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。本篇到此结束,下一篇来讨论一下类过滤驱动和多层过滤驱动的安装。

时间: 2024-11-09 04:24:17

安装驱动程序(1)----驱动预安装的相关文章

ubuntu 14.04 如何安装nvidia显卡驱动 [转载]

我的机子装的是64位ubuntu 14.04 LTS系统,显卡是GeForce 405 ,想使用cuda所以需要装NVidia官方驱动,但是总是碰到 nouveau 驱动正在使用的问题.找了好久,网上各种将nouveau加入blacklist的文章都不能用,最终找到这篇文章,成功解决问题 转载[Ubuntu安装NVIDIA官方驱动] 由于NVIDIA显卡的开源驱动在性能和效果上比官方的驱动差之太远,无奈只能自己动手安装官方的驱动.安装NVIDIA驱动的具体流程如下:其实NVIDIA的官网的REA

怎样在ubuntu中查看自己的显卡型号及其对应驱动的安装

1.终端输入: lspci -vnn | grep VGA -A 12 第一行输出便有硬件厂商.型号名称/序列号和PCI  ID. 2.另一种输入: lshw -C display 会显示显卡信号信息 3.输入: sudo lshw -c video | grep coniguration 显示使用的网卡驱动名称 4.输入: modinfo vmwgfx 检查网卡驱动详情 5.输入: glxinfo | grep OpenGL 检查硬件加速.启用基于硬件的3D加速. 6.输入: ubuntu-d

删除DriverStore\FileRepository文件夹后,设备驱动无法安装,提示“没有为设备信息集或元素选择驱动程序(代码 28)”的解决办法

前言: 我前几天手贱,整个FileRepository删除掉了,之后重启就出现了让人蛋疼的这个问题,因为出于各种原因不想重装系统,百度轮番换搜索词无果,虽然驱动装上了但新设备依然无法自动安装驱动等"一堆瑕疵",重启无数次折腾3天之后才在百度一个帖子的一个字眼里发现了解决办法(说此方法的人自己说删了INFCACHE.1后也无效,所以没有引起注意),也因此有了这个随笔: 1.首先你要恢复FileRepository文件夹,至于方法嘛,可以下载完整的WIN7系统镜像后提取出来,如果是原版则用

ubuntu16.04安装I219-V网卡驱动问题解决方法

安装ubuntu16.04 LTS后无网络连接的解决方法: 1.查看是否安装网卡驱动 打开终端,输入ifconfig –a,如果出现"本地环回"字样,说明网卡驱动未安装. 2.查看网卡型号 终端输入lspci,查看网卡型号,本文只针对I219-V网卡驱动. 3.下载e1000e网卡驱动,下载地址https://downloadcenter.intel.com/zh-cn/download/15817?_ga=1.159975677.114505945.1484457019 因官网i21

在wamp中安装sql server驱动的步骤方法

在wamp中安装sql server驱动的方法 配置php+sql server 连接方式,配置成功才能远程访问数据库. PHP自带的MSSQL扩展php_mssql.dll是给SQL Server 2000用的 要使用SQL Server 2005以上版本,就要用到微软为PHP提供的最新第三方扩展SQL Server Driver for PHP才行. 以下是安装的步骤:(前提条件,在wamp安装正确的情况下,图标是粉红色的,打开运行后变成绿色就是正常的) 第一步.下载SQL Server D

Linux 网卡驱动的安装

一.网卡驱动安装的一般思路 1.首先从硬 件安装,检查网卡本身故障 2.检查网卡芯片型号(注意不是硬件品牌) 常见的网卡芯片有Intel RC82545EM/Realtek 8139D/ Broadcom NetXtreme/3Com 3C940/SIS900/VIA VT6105L 通过命令查看本机:lspci 3.查看系统是否包含对应型号的网卡驱动 目录:/lib/modules/release/kernel/drivrs/net 4.检查网卡驱动是否加载 lsmod命令查看当前系统加载的模

在不连接打印机的情况下,为打印机安装驱动程序

大家不知道有没有如下经历:打印机安装在一台XP系统的电脑上,将这台打印机共享出去,其他装有XP系统的局域网用户可以直接从共享找到打印机,通过网络安装驱动程序(其实是COPY那台安装打印机的XP系统电脑上的驱动),就可以使用共享打印机.而如果局域网中有一台电脑安装的是win7或者更高版本windows系统,直接从共享打开打印机时,由于主机上打印机驱动为XP平台的,大多数时候与WIN7(尤其64位)或不兼容,而出现不能安装驱动的情况.这种情况一般是64位的win7或win8系统在连接32位系统的计算

在centos7(EL7.3 即 kernel-3.10.0-514.X )上安装BCM4312无线网卡驱动要注意的问题

我新装的centos7主机无法使用里面自带的网卡,查询后发现网卡型号为BCM4312.我在看资料安装的过程中遇到了些问题,纠结了好久,现在分享下要注意的点,为后来的遇到同样问题的人提供点帮助.现在开始说正事: 若要安装以 Broadcom BCM4311.BCM4312.BCM4313.BCM4321.BCM4322.BCM43224.BCM43225.BCM43227 或 BCM43228 为基础的无线网络卡,请遵照以下的步骤: 第 1 步:辨认无线网络芯片及安装时依赖的组件 首先,请确定你是

Centos7安装nvidia显卡驱动

Centos 7安装Nvidia显卡驱动没有Fedora这种偏图形界面使用的Linux发行版容易.而且在网上搜到的方法都比较复杂,需要进行一定的修改设置.这里提供一种比较简单的方法,适合一些小白或者不想太折腾的使用者. 首先需要添加一个第三方的源ELRepo.这个源支持RED HAT系的Linux系统,主要是提供一些硬件的驱动程序.这个源的主页如下: http://elrepo.org/tiki/tiki-index.php 添加源分两步: 1.导入公共密钥 rpm --import https