【问题标题】:How to know if the device instance id is unique?如何知道设备实例 id 是否唯一?
【发布时间】:2012-06-12 08:09:08
【问题描述】:

我正在使用 .NET Framework v3.5 开发 C# Windows 应用程序。

每个 USB 设备都应该有一个唯一的实例 ID,以将其与计算机上的其他同类设备区分开来。

如果设备InstanceID不唯一,PnP管理器修改InstanceID,并与对应的DeviceTypeID结合,创建一个系统唯一的设备实例ID。

我需要确定 USB Device Instance Id 在系统范围内是否是唯一的。

我可以使用IRP_MN_QUERY_CAPABILITIES 来检索设备功能, 然后检查 DEVICE_CAPABILITIES 的 UniqueID 成员,以指示实例 ID 在整个系统中是否唯一。

我的问题是:

  1. 如何在c#中使用IRP_MN_QUERY_CAPABILITIES
  2. 是否有关于如何使用此查询的 C++ 示例代码?
  3. 有没有其他方法可以知道实例 id 是否不唯一?

【问题讨论】:

    标签: c# .net usb device-instance-id


    【解决方案1】:

    设备实例 ID 不是唯一的,因为世界范围内没有标准。我曾在 USB 闪存驱动器上工作过。然而,设备实例可以显示公司的名称,从而将设备与一家公司与另一家公司区分开来。我知道的唯一唯一数据是长设备序列号,从随机数生成器中检索。如果您使用的是 Windows,则可以了解 WMI 及其访问 USB 设备的能力。

    【讨论】:

      【解决方案2】:

      我找到了解决方案,我使用了SetupDiGetDeviceRegistryProperty 并要求DEVICE_CAPABILITIES structure

       private static bool IsDeviceIdUnique(IntPtr usbDev, NativeMethods.SP_DEVINFO_DATA devInfoData,string deviceId)
          {
              uint bufferSize;
              uint propertyRegDataType;
              var buffer = new byte[WinConstants.MAX_PATH];
              NativeMethods.SetupDiGetDeviceRegistryProperty(usbDev, ref devInfoData, WinConstants.SPDRP_CAPABILITIES, out propertyRegDataType, buffer, WinConstants.MAX_PATH, out bufferSize);
              var capabilities = BitConverter.ToUInt32(buffer, 0);
              return (capabilities & WinConstants.CM_DEVCAP_UNIQUEID) == WinConstants.CM_DEVCAP_UNIQUEID;
          }
      

      【讨论】:

      • 这还不够。 CM_DEVCAP_UNIQUEID 通常仅表示 USB 设备正在提供序列号。您需要从设备制造商那里找到一份声明,说明在任何具有给定 VID 和 PID 的 USB 设备中编程的序列号是唯一的。
      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2017-09-29
      • 2023-04-01
      相关资源
      最近更新 更多