Windows API DiInstallDevices导致异常

Windows API DiInstallDevices causes Exception

本文关键字:异常 DiInstallDevices API Windows      更新时间:2023-10-16

我正在尝试访问Win32 API,以便在设备上安装驱动程序。我正在使用setupapi.h中的一组函数,所有这些函数都能很好地工作。在这段代码中,我使用它们来获取调用此安装函数(它不是setupapi.h的一部分,而是newdev.h的一部分)所需的参数(即设备和驱动程序的名称/指针)
下面是我的P/Invoke和实际的方法调用。我已经使用调试器进行了调查,我非常确信从SetupAPI中获得的信息是正确的。(也就是说,参数很好,我的意思是它们确实包含了所需的信息。)

IntPtr deviceInfoSet;
Win32SetupApi.SP_DEVINFO_DATA devInfoData;
GetDeviceHandleFromMatch(deviceInfo, out deviceInfoSet, out devInfoData);
Win32SetupApi.SP_DRVINFO_DATA drvInfoData;
GetDriverHandleFromMatch(driverInstance, deviceInfoSet, devInfoData, out drvInfoData);
try
{
   bool needReboot = false;
   Win32SetupApi.DiInstallDevice(
      IntPtr.Zero,
      deviceInfoSet,
      devInfoData,
      drvInfoData,
      0,
      ref needReboot);
}
catch (Exception ex)
{
   throw;
}
[DllImport("newdev.dll", SetLastError = true)]
  public static extern bool DiInstallDevice(
     IntPtr hParent, 
     IntPtr lpInfoSet, 
     SP_DEVINFO_DATA DeviceInfoData,
     SP_DRVINFO_DATA DriverInfoData,
     UInt32 Flags, 
     [MarshalAs(UnmanagedType.Bool)] ref bool NeedReboot);

我得到的异常是"尝试读取/写入受保护的内存",通过LastWin32Error没有可用的信息。

任何关于这里可能发生的事情的想法都将不胜感激!

明白了!

[DllImport("newdev.dll", SetLastError = true)]
public static extern bool DiInstallDevice(
    IntPtr hParent, 
    IntPtr lpInfoSet, 
    ref SP_DEVINFO_DATA DeviceInfoData,
    ref SP_DRVINFO_DATA DriverInfoData,
    UInt32 Flags, 
    ref bool NeedReboot);

结构必须通过引用传递,如本文所述。不确定布尔编组是否错误,但我也删除了它。
真不敢相信这又花了几个小时才弄清楚,我很喜欢P/Invoke。希望这也能帮助到其他人。