我正在尝试访问Win32 API以在设备上安装驱动程序。我正在使用setupapi.h
中的一堆函数,所有函数都运行良好。在这段代码中,我使用它们来获取调用此安装函数所需的参数(即/指向设备和驱动程序的名称)(这不是setupapi.h
的一部分,而是{{{ 1}})。
以下是我的P / Invoke和实际的方法调用。我已经使用调试器进行调查,我非常确定从SetupAPI获得的信息是正确的。 (即,参数很好,我的意思是它们确实包含了所需的信息。)
newdev.h
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;
}
我得到的例外是“尝试读取/写入受保护的内存”,LastWin32Error没有可用的信息。
任何关于可能爆炸的想法都非常感谢!
答案 0 :(得分: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);
结构必须通过引用传递,如here所述。不确定Bool编组是否错误,但我也删除了它。
不敢相信这花了几个小时再弄清楚,得爱P / Invoke。希望这也会帮助其他人。