找回密码
 加入
搜索
查看: 17000|回复: 14

[系统综合] [已解决]如何通过INF文件安装驱动?

 火.. [复制链接]
发表于 2010-12-1 10:24:32 | 显示全部楼层 |阅读模式
本帖最后由 yhxhappy 于 2010-12-10 15:38 编辑

我想做一个自动安装RAID卡驱动的小程序,通常RAID卡的驱动都是INF形式的,使用了论坛上搜索到的如下方法安装失败,执行后没有任何反应,刷新设备管理器还是未安装驱动状态。但是在设备管理器里面,点击硬件手动更新驱动,然后指定路径到INF文件却是可以安装上的,现请教各位有没有别的方法能安装上的,或者是我的操作方法有问题。

Run("rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\xxx.inf")
或者:Run(@ComSpec & " /c " & 'rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 .\xxx.inf', "", @SW_HIDE)


另外,以前发帖的时候,P版提到过如下内容,第三种方式不适用,对于第一及第二种安装方式,P版能不能讲解一下呢?

SetupAPI.au3 提供3种驱动更新方式:
1、_CM_Install_DevInst_Ex,与设备管理器安装驱动的方式相同,可以指定光盘安装,也可以手动选择。
2、_CM_Install_Device_Driver,除了兼容第一种方式外,还可以指定多种更新标识,比如 静默安装。
3、_CM_Update_PnP_Device,指定ini文件,ini中定义安装参数。你所说的应该适于用这种方式安装。

_CM_Update_PnP_Device原型:
_CM_Update_PnP_Device($sDeviceID, $sInfPath, $iFlags, $hWnd = 0)

$sDeviceID - 要更新驱动的设备的硬件ID。
$sInfPath - INF路径。
$iFlags - 安装标识,一般指定为0即可。更多选项请参考http://msdn.microsoft.com/en-us/library/ff553534(VS.85).aspx
$hWnd - 父窗口句柄,可以指定为0。

硬件ID不同于设备范例ID,要获取一个设备的硬件ID,调用_CM_Get_DevNode_Registry_Property,传递CM_DRP_HARDWAREID属性值。

_CM_Update_PnP_Device,只能更新即插即用设备,对于非即插即用设备,用上面2种方法。



帖子放太久了,现在关闭。解决方法在10楼
发表于 2010-12-1 12:26:16 | 显示全部楼层
rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 xxx.inf
 楼主| 发表于 2010-12-1 12:42:33 | 显示全部楼层
回复 2# lixiaolong


    谢谢指点,我试了试,确实有反应了,但提示“安装失败” 不知为何?
发表于 2010-12-1 17:38:59 | 显示全部楼层
回复 3# yhxhappy

路径有问题.

试试这个,指定INF文件的完整路径
Run(@ComSpec & ' /c rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 ' & @DesktopDir & '\xxx.inf', "", @SW_HIDE)

文件名有空格也没关系.
Run(@ComSpec & ' /c rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 ' & @DesktopDir & '\x xx.inf', "", @SW_HIDE)
 楼主| 发表于 2010-12-1 18:38:36 | 显示全部楼层
后来我也发现了是路径不对才会提示 安装错误
我也用了楼上的方法加上完整路径,还是没有任何反应,代码运行耗时零点几秒。
同样我也试了以下几种方法,还是没有效果。
ShellExecuteWait("Rundll32.eXe","SetupAPI,InstallHinfSection DefaultInstall 132 .\xxx.Inf")
Run("rundll32 setupapi,InstallHinfSection DefaultInstall 128 .\xxx.inf")
现在写的程序卡在这一步上了。也不知道如果安装成功的话会是什么一个过程,会有提示吗?安装进程会在调用后就退出还是安装成功后才退出?
希望知道的朋友指点一下!
发表于 2010-12-1 19:32:20 | 显示全部楼层
回复 5# yhxhappy

如果安装成功的话没有什么提示,只是桌面闪一下.

在桌面建立一个INF文件,内容是以下 (文件右键添加‘To RAR’ (扩展名改成rar)
)   
[Version]
signature="$Windows NT$"

Provider=kajaa@eastday.com, 2002

[DefaultInstall]
; DelReg=rar_DelReg
AddReg=rar_AddReg

[rar_DelReg]

[rar_AddReg]

hkcr,"*\shell\To RAR\command",,,"cmd /c ren ""%%1"" ""*.rar"""

[Strings]


然后实行以下代码
Run(@ComSpec & ' /c rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 ' & @DesktopDir & '\xxx.inf', "", @SW_HIDE)

如果成功,桌面闪一下.
然后在文件上点击右键看看有没有“To RAR” ?

评分

参与人数 1金钱 +10 贡献 +5 收起 理由
yhxhappy + 10 + 5 今天才知道我也可以评分了,先感谢lixiaolo ...

查看全部评分

 楼主| 发表于 2010-12-1 19:40:40 | 显示全部楼层
回复 6# lixiaolong


    感谢热心的 lixiaolong,我试了成功。为什么我用来装驱动就不行呢,难道驱动的INF文件有问题?可为什么我通过设备管理器来添加驱动就可以安装上,会不会是驱动没有通过WHQL认证的缘故?
这种方法有局限性吗?是任何含有INF文件的驱动都可以安装吗?
发表于 2010-12-1 20:11:10 | 显示全部楼层
回复 7# yhxhappy

这就不知道了,因该可以安装吧。。。

我只能给你另一个命令
rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 完整路径.安装.inf
 楼主| 发表于 2010-12-2 14:43:18 | 显示全部楼层
自己顶起来。
那位高手有通过INF文件安装成功过吗,不是自己写的那种驱动哦,比如INTEL芯片组驱动。给展示一个啊

谷歌搜了一下,找到下面一些资料,得到些启发,但看了很多INF文件,安装节不知道定义,很多文件都不是老老实实用 DefaultInstall

rundll32 setupapi.dll,InstallHinfSection DefaultInstall 128 完整路径.安装.inf
注意:
1、其中DefaultInstll是指INF文件中的安装节,必须替换为自己INF中的INSTALL节名,例如节名是USBCamera.Dev,则代码要要改为:
rundll32 setupapi.dll,InstallHinfSection USBCamera.Dev 132 完整路径.安装.inf
 楼主| 发表于 2010-12-10 15:36:28 | 显示全部楼层
最近到处从网上找,发现有一个微软出的小工具 DPInst.exe, 可以通过INF文件安装驱动

DPInst.exe: 安装和卸载驱动程序
缺省情况下,该工具搜索当前目录并安装所有找到的驱动程序
用法: DPInst.exe [/U INF-file] [/S | /Q] [/LM] [/P] [/F] [/SH] [/SA] [/A] [/PATH Path] [/EL] [/L LanguageID] [/C] [/D] [/LogTitle Title] [/SW] [/? | /h | /help]

/U INF-file:到.INF文件的路径
/S | /Q:以安静模式卸载一个驱动程序(.INF文件),不显示设备安装向导,阻止操作系统弹出任何对话框
/LM:选择遗产代码模式(进行安装),允许安装无签名的驱动程序和文件不完整的驱动程序。这些驱动程序将无法在最新版本的Windows操作系统上安装
/P:如果要安装的驱动程序不比已安装的好,提示用户
/F:要安装的驱动程序不比已安装的好时,强制(执行当前的)安装(过程)
/SH:扫描硬盘,仅为已存在的设备安装驱动程序。(该选项)仅对即插即用(设备的)驱动(程序)有效
/SA:在 添加/删除程序 (列表)中不显示当前安装的驱动程序
/A:全部安装 或 全不安装
/PATH Path:在指定的路径下搜索驱动程序
/EL:支持所有在.XML文件中未明确列出的语言
/L LanguageID:在所有的用户接口(UI)中使用指定的语言。在 本地化测试 时很有用
/SE:不显示“最终用户许可协议”
/C:将登陆信息输出到控制台(仅在 Windows XP或以上 操作系统上可用)
/D:卸载时删除驱动程序的二进制代码
/SW:不显示设备安装向导,操作系统任然可以弹出对话框
/? | /h | /help:显示此 帮助(信息)

以下是简单的应用(au3源码)

seek("c:\drivers")
Func seek($dir)
If StringRight($dir, 1) <> "\" Then $dir = $dir "\"
$FileList = _FileListToArray($dir, "*", 2)
If UBound($FileList) > 1 Then
  For $i = 1 To $FileList[0]
   $FileList[$i] = $dir $FileList[$i]
   RunWait(@ComSpec ' /c DPInst.exe /LM /SH /SA /PATH '&$FileList[$i]&' /SE /SW',"",@SW_HIDE)
   seek($FileList[$i])
  Next
EndIf
EndFunc   ;==>seek

评分

参与人数 1贡献 +1 收起 理由
lixiaolong + 1 学习了

查看全部评分

发表于 2011-1-13 00:25:45 | 显示全部楼层
谢谢你的分享,但是我金钱不够下不到
 楼主| 发表于 2011-1-13 08:35:45 | 显示全部楼层
回复 11# zyj001991


    DPInst.exe 用百度或GOOGLE搜这个,都可以下到的
发表于 2011-2-6 05:39:23 | 显示全部楼层
顶你一个。。。。
发表于 2014-6-24 16:08:09 | 显示全部楼层
谢谢 楼主呢。。。。。。。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-27 11:12 , Processed in 0.072671 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表