以编程方式为特定设备安装特定驱动程序(以及预安装失败时)

时间:2011-12-19 18:52:59

标签: c# device-driver setupapi

我有一个已签名的驱动程序,我需要使用C#以编程方式为特定的USB设备安装它(针对Vista和7 64位)。

我发现在DIFx API中使用DriverPackagePreinstall函数非常容易(here是如何P / Invoke它):通过在设备插入USB之前调用它,Windows是能够在检测到驱动程序后将驱动程序与设备关联。

在未预先安装驱动程序的情况下将设备插入USB时会出现问题。可能会发生为该设备安装另一个驱动程序(在一台测试PC中,我发现已安装了通用驱动程序,并且该设备列在“设备管理器”中的“其他设备”下)。

尝试解决此问题,到目前为止,我已经能够使用SetupDiGetClassDevsSetupDiEnumDeviceInfoSetupDiGetDeviceRegistryProperty函数检测设备是否在那里通过其VID和PID(供应商和产品标识符)识别设备。现在我的设备有SP_DEVINFO_DATA,我想我要调用InstallSelectedDriver函数,不是吗?如果是的话,你能告诉我如何P / Invoke该功能(我在pinvoke.net上找不到它)以及如何通过指定我想为我的设备安装的驱动程序来使用它(假设我有INF路径) ?

1 个答案:

答案 0 :(得分:3)

我找到了一个我正在搜索here的样本。 InstallSelectedDriver的P / Invoke适用于我:

[DllImport("newdev.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
protected static extern bool InstallSelectedDriver(
      IntPtr HwndParent,
      IntPtr DeviceInfoSet,
      string Reserved,
      [MarshalAs(UnmanagedType.Bool)] bool Backup,
      out UInt32 Reboot);