问题标签 [device-instance-id]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3692 浏览

windows - 驱动器号到设备实例 ID

如何从驱动器号获取设备实例 ID?

我的流程从设备到达消息开始。我已成功从到达消息中获取驱动器号并打开 DVD 托盘。

我已经搜索了各种 Setup API 项目;但我还没有找到任何可以让我从驱动器号到设备实例 ID 的东西。

C# 或 VB.NET 中的解决方案将是理想的,但我愿意从任何其他语言中找出它,只要我能看到 API 调用。

提前致谢...

0 投票
3 回答
15337 浏览

c# - 如何从 DEV_BROADCAST_DEVICEINTERFACE 和设备实例 ID 中获取友好的设备名称

我已经使用RegisterDeviceNotification注册了一个窗口,并且可以成功接收DEV_BROADCAST_DEVICEINTERFACE消息。但是,dbcc_name返回的结构中的字段始终为空。我的结构是这样定义的:

我正在使用WM_DEVICECHANGE消息Marshal.PtrToStructure的LParam。

这应该工作吗?

甚至更好......有没有其他方法可以在连接时获取设备名称?

编辑(02/05/2010 20:56GMT):

我发现了如何通过执行以下操作来填充 dbcc_name 字段:

但我仍然需要一种从 int dbcc_name 中获取“友好”名称的方法。它如下所示:

\?\USB#VID_05AC&PID_1294​​&MI_00#0#{6bdd1fc6-810f-11d0-bec7-08002be2092f}

我真的只是想让它说“Apple iPhone”(在这种情况下就是设备)。

0 投票
2 回答
3746 浏览

c# - 以编程方式获取 USB 存储设备实例 ID(唯一 ID)

如何以编程方式获取用户刚刚插入的 USB 大容量存储设备的设备实例 ID(唯一 ID)?

0 投票
2 回答
2209 浏览

c# - 如何知道设备实例 id 是否唯一?

我正在使用 .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 是否不唯一?
0 投票
3 回答
7503 浏览

c++ - 如何在给定设备实例 ID 的情况下可靠快速地获取网卡的 MAC 地址

给定网卡的设备实例 ID,我想知道它的 MAC 地址。我的系统上用于集成英特尔千兆位卡的示例设备实例 ID:

到目前为止,我使用的算法如下:

  1. SetupDiGetClassDevs用调用DIGCF_DEVICEINTERFACE
  2. 调用SetupDiEnumDeviceInfo以获取返回的设备SP_DEVINFO_DATA
  3. 调用SetupDiEnumDeviceInterfaceswithGUID_NDIS_LAN_CLASS以获取设备接口。
  4. 调用SetupDiGetDeviceInterfaceDetail此返回的设备接口。这将设备路径作为字符串获取: \\?\pci#ven_8086&dev_10cc&subsys_00008086&rev_00#3&33fd14ca&0&c8#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{28fd5409-15bd-4c06-b62f-004d3a06f852}
  5. 至此,我们有了网卡驱动程序接口的地址。CreateFile使用#4 的结果打开它。
  6. 调用DeviceIoControlIOCTL_NDIS_QUERY_GLOBAL_STATSOIDOID_802_3_PERMANENT_ADDRESS以获取 MAC 地址。

这通常有效,并且已在相当多的机器上成功使用。但是,似乎极少数机器的网络驱动程序无法正确响应DeviceIoControl步骤#6 中的请求;即使将网卡驱动程序更新到最新版本,问题仍然存在。这些是较新的基于 Windows 7 的计算机。具体来说,DeviceIoControl成功完成,但返回零字节而不是包含 MAC 地址的预期六个字节。

MSDN页面上似乎有一条线索IOCTL_NDIS_QUERY_GLOBAL_STATS

此 IOCTL 将在以后的操作系统版本中弃用。您应该使用 WMI 接口来查询微型端口驱动程序信息。有关详细信息,请参阅 NDIS 对 WMI 的支持。

——也许更新的网卡驱动不再实现这个 IOCTL?

那么,我应该如何让这个工作?我的方法是否可能存在疏忽,我做错了什么?还是我需要采取更不同的方法?一些替代方法似乎包括:

  • 查询Win32_NetworkAdapterWMI 类:提供所需信息,但由于性能糟糕而被拒绝。请参阅快速替换 Win32_NetworkAdapter WMI 类以获取本地计算机的 MAC 地址
  • 查询MSNdis_EthernetPermanentAddressWMI 类:似乎是IOCTL_NDIS_QUERY_GLOBAL_STATS直接从驱动程序中查询 OID 的 WMI 替代品 - 这个适用于麻烦的网络驱动程序。不幸的是,返回的类实例只提供 MAC 地址和InstanceName,这是一个本地化字符串,如Intel(R) 82567LM-2 Gigabit Network Connection. 查询MSNdis_EnumerateAdapter产生一个与 a 相关的列表InstanceNameDeviceName比如\DEVICE\{28FD5409-15BD-4C06-B62F-004D3A06F852}。我不确定如何从DeviceName即插即用设备实例 ID ( PCI\VEN_8086......) 转到。
  • 调用GetAdaptersAddressesGetAdaptersInfo(已弃用)。我可以在返回值中找到的唯一非本地化标识符是适配器名称,它是一个类似于 - 的字符串,与 WMI NDIS 类返回的{28FD5409-15BD-4C06-B62F-004D3A06F852}相同。DeviceName再说一次,我不知道如何将它与设备实例 ID 关联起来。我不确定它是否会在 100% 的时间内工作——例如,对于没有配置 TCP/IP 协议的适配器。
  • NetBIOS 方法:需要在卡上设置特定协议,因此无法 100% 工作。通常看起来像hack-ish,而不是我所知道的与设备实例ID相关的方法。我会拒绝这种方法。
  • UUID 生成方法:拒绝,原因我这里不再详述。

似乎如果我能找到一种方法从设备实例 ID 中获取卡的“GUID”,那么剩下的两种做事方式中的一种我就可以顺利完成。但我还没弄清楚怎么做。否则,WMI NDIS 方法似乎最有前途。

获取网卡和 MAC 地址列表很容易,并且有几种方法可以做到。以一种让我将其与设备实例 ID 关联起来的快速方式进行操作显然很难......

编辑: IOCTL 调用的示例代码,如果它可以帮助任何人(忽略泄露的 hFile 句柄):

代码失败,打印:

因此,DeviceIoControl 返回非零表示成功,但随后返回零字节。

0 投票
2 回答
2831 浏览

c++ - 从设备实例路径字符串中获取设备实例 DWORD

我得到一个设备实例路径,如

来自IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink
但是对于CM_Get_Parent,我需要设备的 DEVINST/DWORD,这让我发疯。
我试过例如

和其他一些 SetupDi ... voodoo 没有成功。任何帮助都非常感谢,因为 - 如前所述 - 我已经有好几个小时无法摆脱这种疯狂了,尽管有几十个相反的例子(devid->instance path)我还没有找到任何实例路径->DEVINST。

0 投票
2 回答
2552 浏览

windows - 如何查找 PCSC 阅读器的设备实例 ID

只有在 Windows >= XP 上使用的 PCSC 阅读器的句柄和上下文winscard,是否有某种方法可以获取其设备实例 ID 或其他可用于SetupDi*API 以找出为所述阅读器加载的驱动程序的方法。

SCardGetReaderDeviceInstanceId仅在 Windows 8 上可用,所以很遗憾不适用于我。

作为方案 B,所有智能卡读卡器都可以在SetupDi使用智能卡读卡器类 guid 时进行枚举。但是我需要一个独特的属性才能在SCard*API 和SetupDi*API 之间关联阅读器。例如,序列号听起来不错,但并非所有制造商都使用它。

有任何想法吗?

0 投票
1 回答
2399 浏览

windows - 如何使用设备实例句柄获取 USB 设备句柄?

我正在使用 和 API 枚举设备管理CM_Locate_DevNode()器树CM_Get_Child()CM_Get_DevNode_Registry_Property()我能够获得设备实例句柄。

使用该句柄,我试图获取设备句柄来查询设备的字符串描述符。

设备实例句柄和设备句柄是否相同,或者有什么方法可以从设备实例句柄中获取设备句柄?

0 投票
2 回答
1659 浏览

usb - 如何解析 USB 设备实例?

我想知道如何制作“设备实例 ID”或如何解析它。

以下面的字符串为例:

据我所知:

  • USB告诉这是一个 USB 设备
  • VID_093A表示其供应商 ID
  • 同样,PID_2700是产品 ID

但是,我不知道其余的。

0 投票
3 回答
3701 浏览

c# - 获取父设备

我有两个 USB 设备 ID,例如USB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000

如何验证设备 #2 是设备 #1 的直接子设备(实际上它们是同一 USB 复合设备的不同部分)?

在现实生活场景中,它们中的许多将连接到同一个 USB 控制器。此外,它们可能是相同的制造商和型号。这就是为什么我无法验证 VID、PID 并使用Win32_USBControllerDeviceWMI 查询来验证它们是否插入同一个 USB 控制器 - 我需要以某种方式验证父子关系,而不仅仅是它们插入同一个控制器的事实。

如果重要的话,我只需要支持 Windows 8+。