最近用C++写了一款类似android手机助手的产品,其中的一个模块功能是检测与监测android设备的设备ID,根据设备ID检索驱动并进行安装。因此搜索了好多关于驱动安装的资料,现整理如下:
驱动分为WDM式和NT式两种驱动,我所理解的两者区别:
1. WDM由.inf文件加载,NT通过服务手动加载
2. WDM支持即插即用,NT不支持即插即用
3. WDM通过注册表指定挂载那个驱动,NT可通过寻找不同的设备对象指定挂载
进一步可了解:
http://blog.sina.com.cn/s/blog_5371d2790100djku.html
驱动的安装方式大至有二种(方法很多种):
1,在插上设备的时候进行安装,即使用函数UpdateDriverForPlugAndPlayDevice()。我用的就是这种方法
2,在没有物理设备的时候安装,即通常所说的驱动预安装(SetupCopyOEMInf)。
方法3
3. DefaultInstall方法
dos运行 rundll32.exe setupapi.dll,InstallHinfSection DefaultInstall 128 test.inf
具体可查询MSDN,上面说的很详细,也可参考如下资料:
http://www.360doc.com/content/11/0912/14/2406028_147664842.shtml
http://www.52rd.com/Blog/Detail_RD.Blog_xjl20008_8591.html
方法4
4. 把驱动文件都打入安装包,由安装包来自动执行(这个方法我没有详细了解)
需要注意的是:
1. SetupCopyOEMInf()只是生成一个oem*.inf文件和oem*.pnf文件到Windows\inf\文件夹中, 即没有修改任何注册表,也没有复制文件。生成的pnf文件包含源文件路径信息,以便在真正 插上设备的时候能够找到相应的sys等文件。 这个方法是在设备没有插入的情况下,即可执行操作。在设备插入后,系统会弹窗提示用户是否安装驱动,用户选择是后,才会进行该设备驱动的安装
2. UpdateDriverForPlugAndPlayDevice()在没有插上设备的时候是会执行失败的。此方法为静默安装,即在安装过程中,不会弹出任何提示窗口,安装完后,我们可以通过设备管理器看到该设备为可以使用状态。
UpdateDriverForPlugAndPlayDevice()方式源码:
http://blog.sina.com.cn/s/blog_5d51f4e90101afg2.html
这个源码是比较通用的,是根据DDK下面的安装驱动的例子源码一样的。当然,当我们在调用这个源码中的接口时,我们最好是已经确认待安装的设备ID在.inf文件中是存在的,即这个驱动是支持这个设备的。这个确认的过程就需要用到SetupAPI系列函数来进行设备ID的获取和.inf文件的解析,这块网上也有很多源码,如果有需要源码的可以联系我:QQ
24716177
注意事项:
众所周知,windows程序目前主要分为32位和64位两种(在编译器中可以设定),对于64位的PC机,一定要用64位的程序来进行安装,当然了,32位机器一定要用32位的程序来进行安装,否则会安装失败。
例如用UpdateDriverForPlugAndPlayDevice进行安装时,会返回一个非常大的负数-87554...
并且用GetLastError()获取不到错误码。之前在一个网站看到一个老外纠结这个问题纠结了好久,最后竟然说好像是因为inf文件格式不对,看来老外也有这么笨的技术人员。
如果我们不知道用户的PC是多少位的,就应该做64位和32位两个版本的驱动安装程序,在调用安装程序之前,判断一下当前系统的位数,再启用对应位数的安装程序。
上面的注意事项,大家一定要注意!!!
参考过的资料:
http://bbs.csdn.net/topics/320020273
http://bbs.csdn.net/topics/190082352
http://bbs.csdn.net/topics/60192108
http://bbs.csdn.net/topics/60192108
http://bbs.csdn.net/topics/390372266
http://bbs.csdn.net/topics/330055489
http://blog.sina.com.cn/s/blog_5371d2790100djku.html
http://hi.baidu.com/alalmn/item/752818ab8caa2ba928ce9d76
http://www.52rd.com/Blog/Detail_RD.Blog_xjl20008_8591.html
http://www.360doc.com/content/11/0912/14/2406028_147664842.shtml
SetupAPI系列函数大全:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff549791(v=vs.85).aspx