您的位置:首页 > 其它

vista 64无法正常安装驱动的问题--

2009-08-19 17:29 489 查看
vista 64无法正常安装驱动的问题--SetupCopyOEMInf

2009-08-10 18:42:28
 标签:vista 驱动   [推送到技术圈]

SetupCopyOEMInf这个函数很好,可以原装驱动,也就是在设备插入之前运行这个函数。那么当设备插入电脑的时候,系统就可以自动安装驱动。

起参数也比较简单。

BOOL WINAPI SetupCopyOEMInf( PCTSTR SourceInfFileName, PCTSTR OEMSourceMediaLocation, DWORD OEMSourceMediaType, DWORD CopyStyle, PTSTR DestinationInfFileName, DWORD DestinationInfFileNameSize, PDWORD RequiredSize, PTSTR DestinationInfFileNameComponent);
 

大致说一下,比较简单

SourceInfFileName,就是驱动inf的全路径。

OEMSourceMediaLocation,这个也是路径,但是其具体含义有后面的参数来制定。(windows的参数很多就是这样。连个参数。一个是类型,一个是内容。内容又类型来决定)

OEMSourceMediaType。SPOST_NONE:忽略OEMSourceMediaLocation的内容。SPOST_PATH:代表OEMSourceMediaLocation为真正驱动文件的地址,一般为驱动文件sys的地址。(如果你的sys文件跟inf在一个地方,那么OEMSourceMediaLocation可以为NULL),SPOST_URL,这个代表OEMSourceMediaLocation为一个网址,即驱动在internet上。

CopyStyle:这个很重要,但是一般我们用到的就SP_COPY_REPLACEONLY,替换,一般是升级时用。SP_COPY_NOOVERWRITE,系统是否已经预存了inf文件。SP_COPY_NEWER_OR_SAME,inf文件比系统的inf新或者一样时进行更新。

DestinationInfFileName,一般inf文件系统为例保证不冲突,会进行改名字,所以,这个是系统最终的inf的名字,也就是系统改完名字后,的inf的名字一般为oemXX.inf.

DestinationInfFileNameSize,DestinationInfFileName这个文件的大小。

RequiredSize,没什么用。输出

DestinationInfFileNameComponent没什么用,输出。

我一般就这样用:

SetupCopyOEMInf(inffilename, NULL, SPOST_PATH, SP_COPY_NEWER_OR_SAME,NULL, 0, NULL,NULL);

一个inffilename的路径,copy就用SP_COPY_NEWER_OR_SAME。

 

今天犯了一个错误,调试了一天才找到问题。记录下一共后人参考。

我在传递参数CopyStyle时,用的SP_COPY_NOOVERWRITE,考虑到如果有驱动那么就不去copy了,本来是好心,但是发现在vista上出现了问题。

因为,我在卸载驱动时,是在设备管理里面卸载驱动,同时选择上了。如下图中的 删除此设备的驱动程序软件





这样一来导致系统把驱动的相关sys文件删掉了。但是inf没有删掉,还是存在的。

所以下一次安装时,SetupCopyOEMInf返回false。也就是不拷贝inf,因为已经有了inf。所以导致驱动无法安装上。

现在我把这个参数CopyStyle改为SP_COPY_NEWER_OR_SAME,就可以,因为这个函数是会拷贝inf的,就算系统已经有了inf。

 

这个小小的差别导致,我今天调试了一天,才明白。

差之毫厘,谬以千里啊!

本文出自 51CTO.COM技术博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐