C# SetupCopyOEMInf安装驱动并返回DestinationInfFileNameComponent

最近用C#写安装usb驱动,必须得调用API SetupCopyOEMInf:

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

于是在C#里这么写了:

        [DllImport("setupapi.dll", SetLastError = true)]
        private static extern bool SetupCopyOEMInf(

            string SourceInfFileName,
            string OEMSourceMediaLocation,
            OemSourceMediaType OEMSourceMediaType,
            OemCopyStyle CopyStyle,
            out string DestinationInfFileName,
            int DestinationInfFileNameSize,
            int RequiredSize,
            out string DestinationInfFileNameComponent

        );

其中DestinationInfFileName代表驱动成功安装后,inf文件在C:\Windows\inf目录下的绝对路径,这个inf文件名字和原inf文件不一样,但是内容是一模一样的,不知道为啥inf驱动安装成功后会把inf文件换一个名字然后copy到C:\Windows\inf目录下?有高人解答下吗?

DestinationInfFileNameComponent代表copy到C:\Windows\inf目录下的那个inf的名字,这个很有用,调用SetupUninstallOEMInf卸载驱动的时候要用到这个名字。

然后我在C#中这么调用SetupCopyOEMInf:

            unsafe
            {
                success = SetupCopyOEMInf(infPath, "", OemSourceMediaType.SPOST_PATH, OemCopyStyle.SP_COPY_NEWER, out destinationInfFileName, 260,
                                0, out destinationInfFileNameComponent);
            }

260是文件目录的最大长度,查看log,C:\Windows\inf\setupapi.dev.log,可以成功安装,success为true,但是接下来的问题困扰了我好久,destinationInfFileNameComponent和destinationInfFileName始终都没有值,按照https://msdn.microsoft.com/en-us/library/aa376990.aspx上的说话,成功执行后会返回这俩值,destinationInfFileNameComponent是调用SetupUninstallOEMInf卸载驱动的必传参数,没有值就无法卸载了,google了半天没有解决,最后看别人用C++写的SetupCopyOEMInf,destinationInfFileName传的是一个长度为260的TCHAR数组,于是我把C#的SetupCopyOEMInf原型改为:

        [DllImport("setupapi.dll", SetLastError = true)]
        private static extern bool SetupCopyOEMInf(

            string SourceInfFileName,
            string OEMSourceMediaLocation,
            OemSourceMediaType OEMSourceMediaType,
            OemCopyStyle CopyStyle,
            out char[] DestinationInfFileName,
            int DestinationInfFileNameSize,
            int RequiredSize,
            out string DestinationInfFileNameComponent

        );

然后把destinationInfFileName声明为一个260长度的char数组,但是调用会报executionexception的异常。后来把原型参数char[] destinationInfFileName前面的out去掉,destinationInfFileNameComponent的值终于正确得到了!!!!!!!!

但是destinationInfFileName依然无法得到,好歹有了一个,终于可以做卸载了,具体为什么可以了也不太清楚,为什么PTSTR DestinationInfFileName传递C#的string不对?传递char数组才可以,但是无法使用out,估计destinationInfFileNameComponent是在destinationInfFileName的基础上得到的,所以传递string类型的destinationInfFileNameComponent是可以的吧,糊涂了!

请问大神,在C#里如何调用SetupCopyOEMInf可以正确获得destinationInfFileNameComponent和destinationInfFileName这俩值!

参考:

http://www.pinvoke.net/default.aspx/setupapi.SetupCopyOEMInf

https://msdn.microsoft.com/en-us/library/aa376990.aspx

http://stackoverflow.com/questions/18404660/how-to-use-setupcopyoeminf-during-installer

时间: 2024-11-08 16:30:36

C# SetupCopyOEMInf安装驱动并返回DestinationInfFileNameComponent的相关文章

VC安装驱动详细解释

最近用C++写了一款类似android手机助手的产品,其中的一个模块功能是检测与监测android设备的设备ID,根据设备ID检索驱动并进行安装.因此搜索了好多关于驱动安装的资料,现整理如下: 驱动分为WDM式和NT式两种驱动,我所理解的两者区别: 1. WDM由.inf文件加载,NT通过服务手动加载 2. WDM支持即插即用,NT不支持即插即用 3. WDM通过注册表指定挂载那个驱动,NT可通过寻找不同的设备对象指定挂载 进一步可了解: http://blog.sina.com.cn/s/bl

redhat Linux 5.0 如何识别网卡和安装驱动

如何查看网卡是否安装 1  ifconfig -a 如果没有ethX 就很可能是网卡没有安装,至少可以断定网卡没有自动加载. 如果这时输入 ifconfig eth0 xxxx.xxxx.xxxx.xxxx 系统会提示没有eth0 该设备. 2  可以用 dmesg | grep ethx 来查看系统能不能检查到该模块.如果能会返回 ATL2: eth0NIC Link  is up <100M full duplex> 否则没反应 3  用lsmod 查看开机时是否有加载如果有的,会有atl

Window 8.1 安装驱动出现 “文件的哈希值不在指定的目录文件中。。。”

如图: 解决方法: 按下键盘组合键 Win + C,然后点击"设置"-->"更改电脑设置" 进入电脑设置之后,点击"更新和恢复"-->"恢复"-->"立即重启" 等一会,会出现几个选项,点击"疑难解答"--> "高级"-->"重启" 重启之后,会出现一个列表,选择"禁用强制驱动程序签名"(对应那个数

子进程 已安装 pre-removal 脚本 返回了错误号 1或2 与 子进程 已安装 post-installation 脚本 返回了错误号 1或2

今天在ubuntu kylin上安装了virtualbox, 后来我想删除了再装个新一点的,结果正常的情况下删除不了,我就把找到的virtualbox的目录全部都删除了, 再通过apt-get remove等命令就删除不了了,出现标题所示的错误 子进程 已安装 pre-removal 脚本 返回了错误号 1 在网上找了一圈,费了好大的劲才找到以下的解决方案,记录一下, http://www.xuebuyuan.com/2153374.html sudo gedit /var/lib/dpkg/s

Arduino在64位WIN7下无法安装驱动的解决办法

1.获取权限 打开C:\Windows\System32\DriverStore\FileRepository,对着FileRepository文件夹,右键 >>属性 >>安全,选中Everyone ,点击编辑,选中完全控制选项框,设置如下: 2.复制文件 将mdmcpq.inf_amd64_neutral_fbc4a14a6a13d0c8文件拷贝至该目录下,下载地址. 3.安装驱动 计算机 >>管理 >>设备管理器 ,选中未知设备,更新驱动

2016031901 - ubuntu15.1安装驱动

个人使用u盘安装的ubuntu15.1,安装后找不到无线,主要是驱动没有安装的问题. 解决方案如下: 01.wife无法找到 02.pool文件夹内都是驱动,我们需要的网络驱动也在内 03.网络驱动包 此时你点击安装,缺少必要的依赖包.如果无法通过其他方式联网的话. 04.必要的安装包 笨方法安装驱动依赖包,那就打开main包,将见到的软件包安装一遍.最后安装网络包,就会出现周围的wife可以连接

Beaglebone Black开发板安装驱动

Beaglebone Black开发板安装驱动 Beaglebone Black开发板安装驱动,在使用Beaglebone Black开发板子做任何事情之前首先需要安装驱动.下面的内容就了展示在Windows.Mac OS X以及Linux操作系统下Beaglebone Black开发板驱动的安装方式.使用USB连接的Beaglebone Black在电脑中显示为一个存储设备,如图1.2所示.   图1.2  Beaglebone Black作为可移动存储设备 这其中包括了你要开始使用Beagl

电脑安装驱动报错解决办法,个人实践证明可以解决

1. 安装串口类型的驱动时,有可能会出现驱动安装不了的情况,报错:找不到相应文件或者找到文件,安装出错,如下图: 2.遇到此类问题,解决方法如下: 1>检查C盘路径下是否有“mdmcpq.inf”   "usbser.sys"文件,如果没有下载相应系统的文件, mdmcpq.inf 文件放在 c:\window\inf 下 usbser.sys 放在 c:\window\system32\dirver\下 重新安装驱动,如果不成功,请参考下面的方法. 2> 把usbser.

JZ2440开发板学习 1. 刚接触开发板, 安装驱动

一. jtag和串口驱动 1. 驱动下载 http://pan.baidu.com/s/1pJkAHJH 2. 驱动安装 禁用win10的驱动数字签名 http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=14237 3. 连接OpenJtag和安装驱动 4. 装PL2303驱动. 二. 烧写软件