libusb_open 在 Windows 7 上返回“LIBUSB_ERROR_NOT_SUPPORTED”
Posted
技术标签:
【中文标题】libusb_open 在 Windows 7 上返回“LIBUSB_ERROR_NOT_SUPPORTED”【英文标题】:libusb_open returns 'LIBUSB_ERROR_NOT_SUPPORTED' on Windows 7 【发布时间】:2013-06-25 08:51:51 【问题描述】:我一直在 Linux 上使用 LibUSB 开发 USB 驱动程序,但现在我想为 Windows 编译一个驱动程序(这是我第一次这样做)。
我的环境
我正在使用 MinGW 编译器(也使用 Dev-cpp IDE)在 Windows 7 上工作,并且我正在使用从 this link 下载的预编译 libusb 库。
我的设备:这是一款 HID 触控设备。因此,Windows 不需要驱动程序。我有一个额外的端点来获取某些调试数据。
我的代码:
我已编译代码以列出连接到我的机器的所有设备和 USB 设备,并且该代码有效。现在我添加代码来打开设备,以便获得设备句柄并开始通信。但是函数返回-12,即LIBUSB_ERROR_NOT_SUPPORTED。
我该如何解决这个问题?
我在互联网上搜索并没有找到解决此问题的明确解决方案。虽然它的代码在 Linux 上运行良好。
P.S.:我在下面添加了整个代码。 DoList();
函数工作正常,但 GetTRSDevice();
函数在 libusb_open(dev, &handle);
处失败。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libusb.h>
libusb_device_handle* deviceHandle = NULL;
int DoList();
libusb_device_handle* GetTRSDevice(void);
int main()
int ret = libusb_init(NULL);
if (ret < 0)
printf("Failed to init libusb");
return ret;
DoList();
deviceHandle = GetTRSDevice();
if(!deviceHandle)
printf("Failed to locate device");
goto fail_dev_open;
printf("Device opened");
libusb_close(deviceHandle);
fail_dev_open:
libusb_exit(NULL);
return(ret);
int DoList()
libusb_device **devs;
ssize_t cnt;
cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0)
return (int) cnt;
libusb_device *dev;
int i = 0;
while ((dev = devs[i++]) != NULL)
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(dev, &desc);
if (r < 0)
fprintf(stderr, "failed to get device descriptor");
return(-1);
printf("%04x:%04x (bus %d, device %d)\n",
desc.idVendor, desc.idProduct,
libusb_get_bus_number(dev), libusb_get_device_address(dev));
libusb_free_device_list(devs, 1);
return 0;
libusb_device_handle* GetTRSDevice(void)
int i = 0;
ssize_t cnt;
libusb_device *dev;
libusb_device **devs;
libusb_device_handle* handle = NULL;
cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0)
printf("Failed libusb_get_device_list");
return(0);
while ((dev = devs[i++]) != NULL)
struct libusb_device_descriptor desc;
int ret = libusb_get_device_descriptor(dev, &desc);
if (ret < 0)
printf("Failed libusb_get_device_descriptor");
continue;
if(desc.idVendor == 0X238f && desc.idProduct == 1)
int ret = libusb_open(dev, &handle);
if (ret < 0)
printf("Failed libusb_open: %d\n\r",ret);
break;
#ifndef WIN32
libusb_detach_kernel_driver(handle, 0);
#endif
ret = libusb_claim_interface(handle,0);
if (ret < 0)
libusb_close(handle);
handle=NULL;
break;
break;
libusb_free_device_list(devs, 1);
return(handle);
【问题讨论】:
【参考方案1】:您可以通过使用专门为解决此问题而开发的应用程序 Zadig 轻松安装 WinUSB 驱动程序或 libusb 支持的其他驱动程序(libusb-win32 和 libusbK)。 见https://zadig.akeo.ie。
但要记住的一件事是,如果您将大容量存储驱动程序或 HID 驱动程序(Windows 自动安装)替换为 WinUSB,您将只能通过 libusb 访问您的设备,并且无法访问在您卸载 WinUSB 驱动程序之前,以大容量存储或 HID 的形式访问您的设备。
最后,如果您可以控制设备的固件,还可以创建在 Vista 或更高版本上自动安装 WinUSB 驱动程序的设备,这样用户就不必手动安装驱动程序(这可能需要连接到适用于 Windows 7 或更早版本的 Windows 更新,但对于 Windows 8 或更高版本,即使没有互联网连接也应该可以工作)。见https://github.com/pbatard/libwdi/wiki/WCID-Devices。
[免责声明] 我是 Zadig/libwi、WCID wiki 页面的作者,也是 libusb Windows 后端的贡献者。
【讨论】:
我可以让数字化仪或鼠标同时在这个驱动程序上工作吗? Zadig 工作得很好。对我来说,一个问题是我禁用了“Windows Update”服务。 Zadig 需要运行此服务才能在您的设备上安装 WinUSB。 当我点击下载Zadig的链接时,检测到病毒: 您不被允许传输文件“zadig-2.4.exe”,因为它感染了病毒“W32” /Agent.QWHDAR!tr"。 恐怕这是误报。如果您从您使用的防病毒软件供应商那里得到一个人类来确认存在病毒,您会发现他们最终表明这是他们一方的误报。无论如何,如果您确实认为您尝试下载的文件已被感染,您绝对应该联系您的 AV 供应商,以便他们确认或收回它。【参考方案2】:看来你需要安装winusb驱动——libusb可以获取没有这个驱动的设备的信息,但是无法打开它们。
http://libusb.6.n5.nabble.com/LIBUSB-ERROR-NOT-SUPPORTED-td5617169.html:
2012 年 4 月 4 日星期三晚上 11:52,Quân Phạm Minh 写道:
虽然我从不安装winusb驱动但是我使用libusb来获取 我的 USB 信息(金士顿 USB 和已经 系统识别)
是的,这是可能的。但是您无法打开设备并做进一步的事情 事物。对于新用户来说,这是令人困惑的部分 libusb Windows 后端,同样适用于 Mac OS X。 libusb 可以使用不正确的驱动程序获取设备的一些基本信息 (例如:USB 大容量存储设备),但无法打开 设备,而无需将驱动程序更改为受支持的驱动程序。
--小凡
【讨论】:
感谢您的回复。因此,我从您那里了解到,如果我开发此驱动程序并将其作为应用程序的一部分进行分发。那么使用我的应用程序的人是否需要安装这个驱动程序。 看起来是这样,但我只在 Windows 中使用原生 win32 api 完成过 usb。仅供参考,如果您有设备信息并且希望能够在 win32 中打开它以写入它,请在设备“路径”上调用 CreateFileEx,这通常类似于\.\MyHidDevice
(因为它位于 Windows 对象管理器空间中)。如果你好奇的话,就和 WinObj 一起玩吧。
我发现 Windows 中的 libusb 是一个灰色区域,任何人都可以请分享我一些教程、链接等,以便开始使用。可悲的是,让 libusb 在 Linux 上运行只需要几分钟,而人们在 Windows 上也是如此
这很复杂。 SetupDI、HidD_、HidP_ 函数是您应该开始的地方。 HidD_GetHidGuid、SetupDiGetClassDevs、SetupDIEnumDeviceInterfaces、SetupDiGetDeviceInterfaceDetail 是您正在寻找的。span>
我已经有几个经过测试和发布的驱动程序,它们在带有 libusb 的 Linux 上运行良好。我也没有足够的时间在 Windows 中重写驱动程序。因此,任何人都可以向我建议最好的前进方法。 Windows 中的 libusb 让我想起了潘多拉魔盒。【参考方案3】:
我遇到了同样的问题,没有通过使用 Zadig 安装 WinUSB 驱动程序解决。
我发现 libusb_open() 始终返回 LIBUSB_ERROR_NOT_SUPPORTED 当且仅当我将 Logitech Unifying Receiver 插入另一个 USB 端口时。这会导致 pyusb libusb1 后端引发异常,例如“NotImplementedError: Operation not supported or unimplemented on this platform”。
我已经移除了罗技接收器(所以我使用的是有线键盘)并且问题已为我解决。我很想知道 Logitech 接收器为何或如何在另一个 USB 端口上导致此错误,但我不知道。
【讨论】:
【参考方案4】:我遇到了同样的问题,Zadig 无法正常工作。我修复了我将设备直接连接到我的笔记本电脑的问题,而不是通过 USB-C 集线器
【讨论】:
以上是关于libusb_open 在 Windows 7 上返回“LIBUSB_ERROR_NOT_SUPPORTED”的主要内容,如果未能解决你的问题,请参考以下文章
使用 MinGW 在 Windows 上构建 GLEW 1.7.0