3

这似乎应该是一个简单的问题,但我不确定如何最好地解决它。我看过一些关于如何检测连接的设备是 USB 2 还是 USB 3 的帖子,但我需要知道 USB 3 端口是否可用,即使没有连接任何设备。

一种解决方案是遍历注册表中的“SYSTEM\CurrentControlSet\Services”键,并与已知 USB3 服务的预设列表进行比较。我希望有更准确的东西,比如 IOCTL 调用。

我可以实现 C++(首选)或 C#。

提前感谢您的帮助。

4

2 回答 2

1

这是我如何实现它的。不是我正在寻找的解决方案。这基本上会告诉我系统上是否存在 USB 3.0 驱动程序。它不会检测系统上的硬件是否包括 USB 3.0 端口。更喜欢 C++ 中较低级别的东西。

如果有人能告诉我如何为此检测硬件(而不仅仅是渣而不是贡献),我将不胜感激。谢谢!

    private bool IsUsb3()
    {
        string val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\USBXHCI", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\USBHUB3", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\usb3Hub", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\UCX01000", "ImagePath", 0);
        if (val != null) return true;   // Microsoft
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\nusb3hub", "ImagePath", 0);
        if (val != null) return true;   // Renesas
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\nusb3xhc", "ImagePath", 0);
        if (val != null) return true;   // Renesas
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\iusb3xhc", "ImagePath", 0);
        if (val != null) return true;   // Intel
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\iusb3hub", "ImagePath", 0);
        if (val != null) return true;   // Intel
        val = (string)Microsoft.Win32.Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\iusb3hcs", "ImagePath", 0);
        if (val != null) return true;

        return false;
    }
于 2013-08-31T22:10:11.983 回答
0

这正是我想要的:

http://read.pudn.com/downloads105/sourcecode/windows/vxd/432626/USBLib/USB.cs__.htm

然后我添加了以下代码:

        // Get USB information
        bool supportsUsb3 = false;
        System.Collections.ObjectModel.ReadOnlyCollection<USB.USBController> hostlist = null;
        hostlist = USB.GetHostControllers();
        mControllerCount = hostlist.Count;

        foreach (USB.USBController host in hostlist)
        {
            USB.USBController controller = new USB.USBController();
            controller.ControllerDevicePath = host.ControllerDevicePath;
            USB.USBHub roothub = controller.GetRootHub();

            System.Collections.ObjectModel.ReadOnlyCollection<USB.USBPort> portlist = null;
            portlist = roothub.GetPorts();
            foreach (USB.USBPort port in portlist)
            {
                USB.USBHub hub = port.GetHub();
                if (port.PortSpeed == USBLib.USB.USB_DEVICE_SPEED.UsbSuperSpeed.ToString())
                {
                    supportsUsb3 = true;
                    break;
                }
            }
            if (supportsUsb3)
                break;
        }

我现在可以确定用户的 PC 是否有 USB 3.0 端口。如果他们只有 2.0 端口,那么我可以使用前面的代码来确定是否安装了 USB 3 驱动程序。

于 2013-09-03T06:11:39.543 回答