0

我正在尝试访问 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 提供的信息。

非常感谢您对这里可能发生的事情的任何想法!

4

1 回答 1

0

知道了!

[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);

结构必须按照此处所述通过引用传递。不确定 Bool 编组是否错误,但我也删除了它。
不敢相信这需要几个小时才能再次弄清楚,一定要喜欢 P/Invoke。希望这对其他人也有帮助。

于 2013-07-02T10:24:11.650 回答