我要做一个驱动自动安装的安装程序,要在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:\windows\system32\driver目录下的一个对话框。
2.也是最关键的:我在c:\windows\inf目录下发现我的.inf文件已成功地转化为oem13.inf(我机器里是oem13,这个数字是不一定的,视机器而定);在c:\windows\system32\driver目录下也发现我的.inf文件,名字没变。按理说出现了刚才的第2点,安装已经成功,为什么我的驱动还无法正常工作?设备管理器里我的设备还是有个感叹号,而且点查看驱动详细信息时,出现该设备没有安装驱动。请问大家各路高手,到底该如何实现驱动的自动安装?谢谢!!!
我这里共两个文件,一个.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:\windows\system32\driver目录下的一个对话框。
2.也是最关键的:我在c:\windows\inf目录下发现我的.inf文件已成功地转化为oem13.inf(我机器里是oem13,这个数字是不一定的,视机器而定);在c:\windows\system32\driver目录下也发现我的.inf文件,名字没变。按理说出现了刚才的第2点,安装已经成功,为什么我的驱动还无法正常工作?设备管理器里我的设备还是有个感叹号,而且点查看驱动详细信息时,出现该设备没有安装驱动。请问大家各路高手,到底该如何实现驱动的自动安装?谢谢!!!
sys文件放在system32的drivers目录下
我也怀疑过.inf文件的格式。
所以,另一个问题就是为什么由Windows自动带的安装程序来装为什么却可以安装成功?
我的.inf文件的我发布一下,请帮忙指点哦!感激不尽!~
;=====================================================================
; pwswpdrv.inf Pinewave Fingerprint Reader
;
;=====================================================================[Version]
Signature="$CHICAGO$"
Class=Fingerprint
ClassGUID={BB199E33-22A8-483e-A206-61A29EC93EE4}
provider=%PineWave%
DriverVer=01/20/2005,1.0.0.0[ClassInstall32]
Addreg=DeviceClass[ClassInstall]
Addreg=DeviceClass[DeviceClass]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-18"[Manufacturer]
%PineWave%=PineWave[PineWave]
%AES2500REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2500
%AES2501REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2501[DestinationDirs]
PwSwpDrv.Files.Ext = 10,System32\Drivers
DefaultDestDir = 11[PwSwpDrv.Dev]
CopyFiles=PwSwpDrv.Files.Ext
AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT]
CopyFiles=PwSwpDrv.Files.Ext
AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT.Services]
Addservice = Pwswpdrv, 0x00000002, PwSwpDrv.AddService[PwSwpDrv.AddService]
DisplayName = %PwSwpDrv.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\pwswpdrv.sys
LoadOrderGroup = Base[PwSwpDrv.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,pwswpdrv.sys[PwSwpDrv.Files.Ext]
pwswpdrv.sys[Strings]
PineWave="Shanghai PineWave"AES2500REFBoard="Fingerprint Reader (AES2500)"
AES2501REFBoard="Fingerprint Reader (AES2501)"PwSwpDrv.SvcDesc="PineWave Fingerprint USB Driver (pwswpdrv.sys)"
Disk1Name="Fingerprint Device CD-ROM"
DeviceClassName="Fingerprint
你说的是指安装完成后才会这样的。
安装之前我的.inf和.sys文件可以放其他地方的啊
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,pwswpdrv.sys这两行代码对注册表进行了什么操作?
; pwswpdrv.inf Pinewave Fingerprint Reader
; 改成这样试一下
;=====================================================================[Version]
Signature="$CHICAGO$"
Class=Fingerprint
ClassGUID={BB199E33-22A8-483e-A206-61A29EC93EE4}
provider=%PineWave%
DriverVer=01/20/2005,1.0.0.0[ClassInstall32]
Addreg=DeviceClass[ClassInstall]
Addreg=DeviceClass[DeviceClass]
HKR,,,,%DeviceClassName%
HKR,,Icon,,"-18"[Manufacturer]
%PineWave%=PineWave[PineWave]
%AES2500REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2500
%AES2501REFBoard%=PwSwpDrv.Dev, USB\VID_08FF&PID_2501[DestinationDirs]
PwSwpDrv.Files.Ext = 10,System32\Drivers
PwSwpDrv.Files.Inf = 10,INF[PwSwpDrv.Dev]
CopyFiles=PwSwpDrv.Files.Ext
AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT]
CopyFiles=PwSwpDrv.Files.Ext
AddReg=PwSwpDrv.AddReg[PwSwpDrv.Dev.NT.Services]
Addservice = Pwswpdrv, 0x00000002, PwSwpDrv.AddService[PwSwpDrv.AddService]
DisplayName = %PwSwpDrv.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\pwswpdrv.sys
LoadOrderGroup = Base[PwSwpDrv.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,pwswpdrv.sys[PwSwpDrv.Files.Ext]
pwswpdrv.sys[PwSwpDrv.Files.Inf];----------------------------------[SourceDisksNames.x86]
1 = %DiskId1%,,,""[SourceDisksFiles]
; Files for disk PineWave. Installation Disk #1 (System)
pwswpdrv.sys = 1
pwswpdrv.inf = 1[Strings];
; Non-Localizable Strings
;REG_SZ = 0x00000000
REG_MULTI_SZ = 0x00010000
REG_EXPAND_SZ = 0x00020000
REG_BINARY = 0x00000001
REG_DWORD = 0x00010001
SERVICEROOT = "System\CurrentControlSet\Services"PineWave="Shanghai PineWave"AES2500REFBoard="Fingerprint Reader (AES2500)"
AES2501REFBoard="Fingerprint Reader (AES2501)"PwSwpDrv.SvcDesc="PineWave Fingerprint USB Driver (pwswpdrv.sys)"
DiskId1="Fingerprint Device CD-ROM"
DeviceClassName="Fingerprint"
DDK中的GenInf就可以满足你的要求。
我换成你的.inf文件,结果还是老样子,用Windows自带的安装程序正常,但是以我那样安装还是出现老问题,同样生成oem*.inf的。
关键是为什么驱动没起作用?你看看注册表里面的键值正确吗?
另外你是用GenInf产生的Inf文件吗?
另外,查看了注册表下的
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
然后根据我的ClassGUID找到我的那些条目,有0000, 0001,发现这两个内容是一样的
而且我查看了用Windows自带安装成功后的这些条目信息和自己做的安装程序安装后的这些条目信息是一样的。
我那个设备是USB设备,我在MSDN里查“HKR”,出来结果:
[section name]: cannot handle HKRSee Also
MessagesThe registry key is used by an .inf file that is not a Plug and Play device .inf file.ResolutionContact Microsoft Product Support Services to gain access to the appropriate registry key for the Plug and Play device.似乎是说HKR不支持即插即用设备?
里面的信息,应该正确才是。
有兴趣自己去看看,我就不罗嗦啦。 现在我手上有的资料可以使我有两种安装方式,一个是通过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
假设用NCPA安装INF文件时碰到如下错误信息:> Error E000020B in UpdateDriverForPlugAndPlayDevices: ERROR_NO_SUCH_DEVINST> #E154 类别安装程式失败。 错误 0xe0000208: 操作无法在尚未注册的设备信息元素上运行。请立即用chkinf.bat(DDK自带工具)检查一下INF文件,此时可能有低级错误出现,比
如"AddReg项不在正确的节内"。
在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, USB\VID_4348&PID_5537
%CH375HM.DeviceDesc% = CH375.Install, USB\VID_4348&PID_55E0
...
获取hardwareid号USB\VID_4348&PID_5537,USB\VID_4348&PID_55E0;
2. 用UpdateDriverForPlugAndPlayDevices()自动安装新驱动!
在98,me系统下:只要将inf文件拷贝到\inf目录下,用SetupInstallFilesFromInfSection函数将驱动文件拷贝到相应的目录下,更新驱动程序信息,插上设备,系统就会自动安装驱动.(有个更新驱动信息的办法,将\inf目录下的drvidx.bin删掉,插上新设备,系统会自动更新驱动信息).
大体上就是这样!