如何知道设备实例ID是否唯一?

时间:2012-06-12 08:09:09

标签: c# .net usb

我正在使用c#.net 3.5

开发一个Windows应用程序

USB设备应具有唯一的实例ID,以区分设备与计算机上相同类型的其他设备。

如果设备InstanceID不是唯一的,PnP管理器会修改InstanceID,并将其与相应的DeviceTypeID组合,以创建系统中唯一的设备实例ID。

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

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

我的问题是:

  1. 如何在c#.net

  2. 中使用IRP_MN_QUERY_CAPABILITIES
  3. cpp中是否有关于如何使用此查询的示例代码?

  4. 有没有其他方法可以知道实例ID是否不唯一?
  5. 由于

2 个答案:

答案 0 :(得分:0)

设备实例ID不是唯一的,因为世界上没有标准。我一直在研究USB闪存驱动器。但是,设备实例可以显示公司的名称,并将设备与一个公司区分开来。我所知道的唯一唯一数据是从随机数生成器检索的长设备序列号。如果您使用的是Windows,则可以了解WMI及其访问USB设备的能力。

答案 1 :(得分:0)

我找到了一个解决方案,我使用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;
    }