1

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

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

在设备InstanceID不唯一的情况下,PnP管理器修改InstanceID,并将其与对应的DeviceTypeID结合,创建一个在系统中唯一的设备实例ID。

我需要确定 USB设备实例 ID在系统范围内是否唯一。

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

我的问题是:

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

2 回答 2

0

我找到了一个解决方案,我使用了 SetupDiGetDeviceRegistryProperty并要求提供DEVICE_CAPABILITIES 结构

 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;
    }
于 2012-10-22T13:17:16.843 回答
0

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

于 2012-06-12T08:18:17.727 回答