如何使用SetupDiGetDeviceInterfaceDetail API检索供应商和产品ID

时间:2014-06-19 06:48:00

标签: c# usb setupapi

我试图找到供应商ID和USB卡的产品ID。为此,我使用 setupapi.dll 。在我的代码中,我使用SetupDiGetDeviceInterfaceDetail调用两次,第二次,函数返回true而没有错误,但我不知道在那之后我能做什么。

我的代码:

result = HidD_GetHidGuid(ref HidGuid);
DeviceInfoSet = SetupDiGetClassDevs(ref HidGuid, IntPtr.Zero, IntPtr.Zero, 18);
do
{
  SP_DEVICE_INTERFACE_DATA MyDeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();
  MyDeviceInterfaceData.cbSize = 28;

  result = SetupDiEnumDeviceInterfaces(DeviceInfoSet, IntPtr.Zero, ref HidGuid,
    MemberIndex, ref MyDeviceInterfaceData);
  if (result != 0)
  {
    result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, ref MyDeviceInterfaceData,
      IntPtr.Zero, 0, out neededSize, IntPtr.Zero);
    //int lastError = Marshal.GetLastWin32Error();
    int requiredSize = (int)neededSize;
    // build a DevInfo Data structure
    SP_DEVINFO_DATA da = new SP_DEVINFO_DATA();
    da.cbSize = Marshal.SizeOf(da);

    SP_DEVICE_INTERFACE_DETAIL_DATA MyDeviceInterfaceDetailData = new
      SP_DEVICE_INTERFACE_DETAIL_DATA();
    if (IntPtr.Size == 8) // for 64 bit operating systems
      MyDeviceInterfaceDetailData.cbSize = 8;
    else
      MyDeviceInterfaceDetailData.cbSize = 4 + Marshal.SystemDefaultCharSize;
        // for 32 bit systems

    IntPtr detailDataBuffer = Marshal.AllocHGlobal(requiredSize);
    Marshal.StructureToPtr(MyDeviceInterfaceDetailData, detailDataBuffer, false);
    result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, ref MyDeviceInterfaceData,
      detailDataBuffer, requiredSize, out neededSize, IntPtr.Zero);
    int lastError = Marshal.GetLastWin32Error();

当我尝试以下代码时,结果是" - " :

string instanceID = Marshal.PtrToStringAuto(detailDataBuffer);

如何获取供应商ID和产品ID?

1 个答案:

答案 0 :(得分:0)

在SP_DEVICE_INTERFACE_DETAIL_DATA结构中,您可以找到DevicePath,类似于\?\ hid#vid_045e& pid_00f0#7& 13ac544b& 0& 0000#{GUID}。只需摆脱vid_045e和pid_00f0部分。