自动安装驱动程序

原文地址:自动安装驱动程序作者:waterpure
关于驱动程序安装,只要你细心看了ddk,就应该知道怎样做
对于即插即用简单地说要对付2种情况
1。在你的设备未安装前,安装驱动程序这叫预先安装。
最简单的方法就是使用SetupCopyOEMInf函数。

具体做法是:
将SetupCopyOEMInf封装在一个动态库里。
用installshield将所有文件copy到一个临时目录。
调用动态库使用SetupCopyOEMInf函数copy临时目录下的inf文件(路径)。
installshield让计算机重启。

插上设备,自动识别。

其实在注册表里添加东西不必大费周张,很简单,installshield就支持对注册表的任意修改。不必用什么函数,即改即用,方便。

还要分:
1。先插入硬件再放入安装盘,这时安装程序要能auto run 且能自动更新驱动
2。先放入安装盘安装再插入硬件。这时好像是用SetupCopyOEMInf。

 

SetupCopyOEMInf 可以在Win98下面使用。

1)将inf文件和sys等文件拷贝到相应目录下面。
然后执行 SetupCopyOEMInf()。这时候,这个函数就会将你的inf文件生成一个pnf文件。
Windows即插即用管理器首先找到pnf文件。
另外,在inf文件中最好不要有copyfile的字段。否则会出现对话框。,
还有,在inf中不使用绝对路径。这样,windows寻找文件的时候,就会在自己的目录下面找了。

我要做一个驱动自动安装的安装程序,要在XP下安装驱动。
我这里共两个文件,一个.inf,一个.sys。
参考了论坛里几位前辈的贴子,谈论的方法都是在InstallShield里,
在某处(比如OnFirstUIAfter函数)加上如下代码:
//==============================================
//...
string szProgram;
string szCmdLine;
//...
szProgram = "rundll32.exe";
szCmdLine = "setupapi.dll,InstallHinfSection 你要执行的section名 132" + "你的.inf文件所在全路径名";
LaunchAppAndWait(szProgram, szCmdLine, WAIT);
//==============================================
其实InstallShield内部的实现是调用Windows API函数orShellExecuteEx(orShellExecute),
于是我就自己写了个程序来实现如上代码效果,以下是我在MFC里写的代码:
//==============================================
::ShellExecute(NULL, "open", "rundll32.exe",
          "setupapi.dll, InstallHinfSection PwSwpDrv.Dev 132     c:\driver\pwswpdrv.inf",
           "c:\driver", SW_SHOWNORMAL);
//==============================================
我的两个文件.inf和.sys放在C盘的自己建的driver目录下。
程序执行的结果是:
1.因为指定了SW_SHOWNORMAL,所以出现了一个将.sys文件拷到c:windowssystem32driver目录下的一个对话框。
2.也是最关键的:我在c:windowsinf目录下发现我的.inf文件已成功地转化为oem13.inf(我机器里是oem13,这个数字是不一定的,视机器而定);在c:windowssystem32driver目录下也发现我的.inf文件,名字没变。
按理说出现了刚才的第2点,安装已经成功,为什么我的驱动还无法正常工作?设备管理器里我的设备还是有个感叹号,而且点查看驱动详细信息时,出现该设备没有安装驱动。
请问大家各路高手,到底该如何实现驱动的自动安装?谢谢!!!
 
inf文件放在windows的inf目录下
sys文件放在system32的drivers目录下
现在我手上有的资料可以使我有两种安装方式,一个是通过InstallShield在安装过程中通过脚本来调用Devcon来实现安装;还有一个是通过在脚本中调用rundll32来实现安装。
顺遍提一下,关于INF文件安装需要调用的函数说明,具体说明请参看Microsoft的MSDN
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/setupapi/setup/installing_from_an_inf_file.asp
编写INF文件时,参看DDK中"Installation Requirements for Network Protocols"。
如果安装失败,请检查%systemroot%setupapi.log文件。
假设用NCPA安装INF文件时碰到如下错误信息:
> Error E000020B in UpdateDriverForPlugAndPlayDevices: ERROR_NO_SUCH_DEVINST
> #E154 类别安装程式失败。 错误 0xe0000208: 操作无法在尚未注册的设备信息元素上运行。
请立即用chkinf.bat(DDK自带工具)检查一下INF文件,此时可能有低级错误
 
主要是用DDK驱动安装函数根据*.inf文件来安装驱动:
在win2000及win2000以上系统:
a.没插上设备,安装驱动:
1.用SetupCopyOEMInf()函数将驱动的安装文件(*.inf)拷贝到inf目录中,并自动生成了oem*.inf预安装文件
2.用msdn中的SetupInstallFilesFromInfSection()函数根据*.inf文件中的安装段,将相应的驱动文件拷贝到系统中.
3.插上设备,系统会弹出"发现新新的硬件向导",只要点击下一步直至完成即可完成设备的驱动安装.
b.插上设备,安装驱动:
1.从*.inf文件中
   ...
   [Manufacturer]
    %WinChipHead% = WinChipHead
   [WinChipHead]
    %CH375.DeviceDesc% = CH375.Install, USBVID_4348&PID_5537
    %CH375HM.DeviceDesc% = CH375.Install, USBVID_4348&PID_55E0
    ...
   获取hardwareid号USBVID_4348&PID_5537,USBVID_4348&PID_55E0;
  2. 用UpdateDriverForPlugAndPlayDevices()自动安装新驱动!
在98,me系统下:只要将inf文件拷贝到inf目录下,用SetupInstallFilesFromInfSection函数将驱动文件拷贝到相应的目录下,更新驱动程序信息,插上设备,系统就会自动安装驱动.(有个更新驱动信息的办法,将inf目录下的drvidx.bin删掉,插上新设备,系统会自动更新驱动信息).
大体上就是这样!
posted @ 2014-12-11 00:16  Max Woods  阅读(2420)  评论(0编辑  收藏  举报