【发布时间】:2011-07-04 11:18:20
【问题描述】:
我正在尝试从 C# 应用程序调用 SetupDiGetDriverInfoDetail。调用失败,我得到的 win32 错误是 0x6F8(“提供的用户缓冲区对于请求的操作无效。”)。到目前为止,我已经能够成功调用其他 setupdi 函数,所以我认为问题在于我编组函数或 SP_DRVINFO_DETAIL_DATA 结构的方式。
我不确定,但我认为问题可能出在 SP_DRVINFO_DETAIL_DATA 结构的 HardwareID 成员上。我尝试将 HardwareID 指定为不同的类型(例如,字节数组并在设置大小和调用函数之前分配缓冲区),但总是出现相同的错误。如果有人对此电话有任何经验或有任何指示,我将不胜感激。
下面是我的结构定义、函数导入和代码sn-p。在这个版本中,我使用固定大小的 HardwareID 缓冲区。我还尝试将缓冲区大小指定为 1,期望出现“缓冲区太小”错误,但我总是收到“无效缓冲区”错误。
[DllImport("setupapi.dll", SetLastError = true)]
internal static extern Int32 SetupDiGetDriverInfoDetail(
IntPtr DeviceInfoSet,
SP_DEVINFO_DATA DeviceInfoData,
SP_DRVINFO_DATA DriverInfoData,
ref SP_DRVINFO_DETAIL_DATA DriverInfoDetailData,
Int32 DriverInfoDetailDataSize,
ref Int32 RequiredSize);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct SP_DRVINFO_DETAIL_DATA
{
public Int32 cbSize;
public System.Runtime.InteropServices.ComTypes.FILETIME InfDate;
public Int32 CompatIDsOffset;
public Int32 CompatIDsLength;
public IntPtr Reserved;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String SectionName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String InfFileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String DrvDescription;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public String HardwareID;
};
SetupApiWrapper.SP_DRVINFO_DETAIL_DATA DriverInfoDetailData = new SetupApiWrapper.SP_DRVINFO_DETAIL_DATA();
DriverInfoDetailData.cbSize = Marshal.SizeOf(DriverInfoDetailData);
result = SetupApiWrapper.SetupDiGetDriverInfoDetail(
DevInfo,
DeviceInfoData,
DriverInfoData,
ref DriverInfoDetailData,
DriverInfoDetailData.cbSize,
ref reqSize);
【问题讨论】: