问题标签 [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.
windows - 驱动器号到设备实例 ID
如何从驱动器号获取设备实例 ID?
我的流程从设备到达消息开始。我已成功从到达消息中获取驱动器号并打开 DVD 托盘。
我已经搜索了各种 Setup API 项目;但我还没有找到任何可以让我从驱动器号到设备实例 ID 的东西。
C# 或 VB.NET 中的解决方案将是理想的,但我愿意从任何其他语言中找出它,只要我能看到 API 调用。
提前致谢...
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”(在这种情况下就是设备)。
c# - 以编程方式获取 USB 存储设备实例 ID(唯一 ID)
如何以编程方式获取用户刚刚插入的 USB 大容量存储设备的设备实例 ID(唯一 ID)?
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 在系统中是否唯一。
我的问题是:
- 如何在 c# 中使用IRP_MN_QUERY_CAPABILITIES
- 是否有关于如何使用此查询的 C++ 示例代码?
- 有没有其他方法可以知道实例 ID 是否不唯一?
c++ - 如何在给定设备实例 ID 的情况下可靠快速地获取网卡的 MAC 地址
给定网卡的设备实例 ID,我想知道它的 MAC 地址。我的系统上用于集成英特尔千兆位卡的示例设备实例 ID:
到目前为止,我使用的算法如下:
SetupDiGetClassDevs
用调用DIGCF_DEVICEINTERFACE
。- 调用
SetupDiEnumDeviceInfo
以获取返回的设备SP_DEVINFO_DATA
。 - 调用
SetupDiEnumDeviceInterfaces
withGUID_NDIS_LAN_CLASS
以获取设备接口。 - 调用
SetupDiGetDeviceInterfaceDetail
此返回的设备接口。这将设备路径作为字符串获取:\\?\pci#ven_8086&dev_10cc&subsys_00008086&rev_00#3&33fd14ca&0&c8#{ad498944-762f-11d0-8dcb-00c04fc3358c}\{28fd5409-15bd-4c06-b62f-004d3a06f852}
- 至此,我们有了网卡驱动程序接口的地址。
CreateFile
使用#4 的结果打开它。 - 调用
DeviceIoControl
和IOCTL_NDIS_QUERY_GLOBAL_STATS
OIDOID_802_3_PERMANENT_ADDRESS
以获取 MAC 地址。
这通常有效,并且已在相当多的机器上成功使用。但是,似乎极少数机器的网络驱动程序无法正确响应DeviceIoControl
步骤#6 中的请求;即使将网卡驱动程序更新到最新版本,问题仍然存在。这些是较新的基于 Windows 7 的计算机。具体来说,DeviceIoControl
成功完成,但返回零字节而不是包含 MAC 地址的预期六个字节。
MSDN页面上似乎有一条线索IOCTL_NDIS_QUERY_GLOBAL_STATS
:
此 IOCTL 将在以后的操作系统版本中弃用。您应该使用 WMI 接口来查询微型端口驱动程序信息。有关详细信息,请参阅 NDIS 对 WMI 的支持。
——也许更新的网卡驱动不再实现这个 IOCTL?
那么,我应该如何让这个工作?我的方法是否可能存在疏忽,我做错了什么?还是我需要采取更不同的方法?一些替代方法似乎包括:
- 查询
Win32_NetworkAdapter
WMI 类:提供所需信息,但由于性能糟糕而被拒绝。请参阅快速替换 Win32_NetworkAdapter WMI 类以获取本地计算机的 MAC 地址 - 查询
MSNdis_EthernetPermanentAddress
WMI 类:似乎是IOCTL_NDIS_QUERY_GLOBAL_STATS
直接从驱动程序中查询 OID 的 WMI 替代品 - 这个适用于麻烦的网络驱动程序。不幸的是,返回的类实例只提供 MAC 地址和InstanceName
,这是一个本地化字符串,如Intel(R) 82567LM-2 Gigabit Network Connection
. 查询MSNdis_EnumerateAdapter
产生一个与 a 相关的列表InstanceName
,DeviceName
比如\DEVICE\{28FD5409-15BD-4C06-B62F-004D3A06F852}
。我不确定如何从DeviceName
即插即用设备实例 ID (PCI\VEN_8086......
) 转到。 - 调用
GetAdaptersAddresses
或GetAdaptersInfo
(已弃用)。我可以在返回值中找到的唯一非本地化标识符是适配器名称,它是一个类似于 - 的字符串,与 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 返回非零表示成功,但随后返回零字节。
c++ - 从设备实例路径字符串中获取设备实例 DWORD
我得到一个设备实例路径,如
来自IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink。
但是对于CM_Get_Parent,我需要设备的 DEVINST/DWORD,这让我发疯。
我试过例如
和其他一些 SetupDi ... voodoo 没有成功。任何帮助都非常感谢,因为 - 如前所述 - 我已经有好几个小时无法摆脱这种疯狂了,尽管有几十个相反的例子(devid->instance path)我还没有找到任何实例路径->DEVINST。
windows - 如何查找 PCSC 阅读器的设备实例 ID
只有在 Windows >= XP 上使用的 PCSC 阅读器的句柄和上下文winscard
,是否有某种方法可以获取其设备实例 ID 或其他可用于SetupDi*
API 以找出为所述阅读器加载的驱动程序的方法。
SCardGetReaderDeviceInstanceId
仅在 Windows 8 上可用,所以很遗憾不适用于我。
作为方案 B,所有智能卡读卡器都可以在SetupDi
使用智能卡读卡器类 guid 时进行枚举。但是我需要一个独特的属性才能在SCard*
API 和SetupDi*
API 之间关联阅读器。例如,序列号听起来不错,但并非所有制造商都使用它。
有任何想法吗?
windows - 如何使用设备实例句柄获取 USB 设备句柄?
我正在使用 和 API 枚举设备管理CM_Locate_DevNode()
器树CM_Get_Child()
。CM_Get_DevNode_Registry_Property()
我能够获得设备实例句柄。
使用该句柄,我试图获取设备句柄来查询设备的字符串描述符。
设备实例句柄和设备句柄是否相同,或者有什么方法可以从设备实例句柄中获取设备句柄?
usb - 如何解析 USB 设备实例?
我想知道如何制作“设备实例 ID”或如何解析它。
以下面的字符串为例:
据我所知:
USB
告诉这是一个 USB 设备VID_093A
表示其供应商 ID- 同样,
PID_2700
是产品 ID
但是,我不知道其余的。
c# - 获取父设备
我有两个 USB 设备 ID,例如USB\VID_E4F1&PID_0661\00000115FA9CE7750000000000000000
和USB\VID_E4F1&PID_0661&MI_00\7&B5A5DDF&0&0000
如何验证设备 #2 是设备 #1 的直接子设备(实际上它们是同一 USB 复合设备的不同部分)?
在现实生活场景中,它们中的许多将连接到同一个 USB 控制器。此外,它们可能是相同的制造商和型号。这就是为什么我无法验证 VID、PID 并使用Win32_USBControllerDevice
WMI 查询来验证它们是否插入同一个 USB 控制器 - 我需要以某种方式验证父子关系,而不仅仅是它们插入同一个控制器的事实。
如果重要的话,我只需要支持 Windows 8+。