gpt4 book ai didi

c# - 可以在 Windows 中以编程方式识别设备的物理 USB 端口吗?

转载 作者:可可西里 更新时间:2023-11-01 12:41:34 28 4
gpt4 key购买 nike

我有一个 USB 设备,当命令这样做时,它使用不同的接口(interface)、VID、PID 和序列号进行枚举,我想在发生此更改后跟踪物理设备。我的想法是通过它的枢纽和港口位置来追踪它。

Win32_PnPSignedDriver类有一个看似完美的“位置”字段(例如 Port_#0001.Hub_#0010),但它仅包含首次加载驱动程序时设备的位置。将硬件插入不同的端口不会更新该字段。

但是,由于在通过设备管理器查看设备时,“详细信息”选项卡下有一个“位置信息”字段,因此该信息在某处可用。这些信息可以通过WMI queries找回吗?还是其他一些方法?有没有更好的方法来解决这个问题?

编辑:我知道这听起来很奇怪。这些设备中的微 Controller 包含一个 ROM,可枚举为 CDC 设备(即串行端口)并允许编程。在制造过程中,跟踪设备在制造商的 ROM(唯一的 VID/PID/序列号)和我的自定义固件接口(interface)(不同的 VID/PID/序列号)之间的变化是有益的。

最佳答案

我知道这个答案的任何事件已经有一段时间了,但我正在做一个项目,它也需要与此类似的功能,我可以告诉你这确实是可能的。据我所知,它确实需要 DDK 和 PInvoke,没有用于此信息的 C# 或 WMI 接口(interface)。它需要打开低级 USB 根集线器设备并直接向它们发送驱动程序 IOCTL 命令。

好消息是,Microsoft 提供了一个示例 C++ 应用程序,它可以完全枚举所有 USB 设备并准确显示它们连接到的端口。该应用程序是 USBView sample application .

我想您会发现,如果您编译并运行此应用程序,您会发现它会准确显示您的设备插入的位置,如果您将任何设备插入该端口,它也会显示在同一个位置。如果您创建一个非托管 C++ DLL,它提供一些调用,您的 C# 应用程序可以使用它来获取它需要的信息,也许这可能会更容易。

它的代码中有关于 EnumerateHubPorts() 函数的说明:

Given an handle to an open hub and the number of downstream ports onthe hub, send the hub an IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EXrequest for each downstream port of the hub to get info about thedevice (if any) attached to each port.

为了了解这需要的所有内容(所有内容都必须从顶部开始枚举,即使您只对一个端口感兴趣),这里是 enum.c< 顶部列出的注释 文件中的代码:

/*

This source file contains the routines which enumerate the USB bus
and populate the TreeView control.

The enumeration process goes like this:

(1) Enumerate Host Controllers and Root Hubs
EnumerateHostControllers()
EnumerateHostController()
Host controllers currently have symbolic link names of the form HCDx,
where x starts at 0. Use CreateFile() to open each host controller
symbolic link. Create a node in the TreeView to represent each host
controller.

GetRootHubName()
After a host controller has been opened, send the host controller an
IOCTL_USB_GET_ROOT_HUB_NAME request to get the symbolic link name of
the root hub that is part of the host controller.

(2) Enumerate Hubs (Root Hubs and External Hubs)
EnumerateHub()
Given the name of a hub, use CreateFile() to map the hub. Send the
hub an IOCTL_USB_GET_NODE_INFORMATION request to get info about the
hub, such as the number of downstream ports. Create a node in the
TreeView to represent each hub.

(3) Enumerate Downstream Ports
EnumerateHubPorts()
Given an handle to an open hub and the number of downstream ports on
the hub, send the hub an IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
request for each downstream port of the hub to get info about the
device (if any) attached to each port. If there is a device attached
to a port, send the hub an IOCTL_USB_GET_NODE_CONNECTION_NAME request
to get the symbolic link name of the hub attached to the downstream
port. If there is a hub attached to the downstream port, recurse to
step (2).

GetAllStringDescriptors()
GetConfigDescriptor()
Create a node in the TreeView to represent each hub port
and attached device.
*/

关于c# - 可以在 Windows 中以编程方式识别设备的物理 USB 端口吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6416931/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com