libusb_open 在 Windows 7 上返回“LIBUSB_ERROR_NOT_SUPPORTED”

     2023-04-17     130

关键词:

【中文标题】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 集线器

【讨论】:

在 Windows 7 上模拟

】在Windows7上模拟【英文标题】:Impersonationonwindows7【发布时间】:2013-07-1515:31:51【问题描述】:我一直在开发一些通过本地域复制文件的应用程序。当我尝试使用WindowsXP上的应用程序复制文件时,使用一个完全没有权限的帐户... 查看详情

如何使端口 80 可用?在 Windows 7 上安装 xampp 1.7.7?

】如何使端口80可用?在Windows7上安装xampp1.7.7?【英文标题】:Howtomakeport80available?Installingxampp1.7.7onwindows7?【发布时间】:2012-06-1014:28:47【问题描述】:我正在尝试在Windows7上安装/运行xampp,但它失败了,因为它说端口80正在使用... 查看详情

按钮在 Windows 7 上具有黑色背景

】按钮在Windows7上具有黑色背景【英文标题】:ButtonhasblackbackgroundonWindows7【发布时间】:2017-01-1614:48:04【问题描述】:我目前正在将针对WIndowsXP和Server2003的应用程序迁移到Windows7(及更高版本)。大多数应用程序运行良好,但某... 查看详情

在 Windows 7 上信任 Java 7 的自签名证书

】在Windows7上信任Java7的自签名证书【英文标题】:Trustingselfsignedcertificateforjava7onwindows7【发布时间】:2013-03-1203:35:26【问题描述】:我正在尝试使用Java7(在Windows7上)中的HttpsURLConnection连接到远程Web服务器并发送发布请求。除... 查看详情

使用 MinGW 在 Windows 上构建 GLEW 1.7.0

】使用MinGW在Windows上构建GLEW1.7.0【英文标题】:BuildingGLEW1.7.0onWindowsusingMinGW【发布时间】:2012-05-1013:11:52【问题描述】:之前有人问过很多问题:如何在Windows上使用MinGW编译GLEW1.7.0源代码?目标是动态链接来自c++项目的库。更多... 查看详情

如何在 Windows 7 上记录网络带宽?

】如何在Windows7上记录网络带宽?【英文标题】:HowtolognetworkbandwidthonWindows7?【发布时间】:2019-07-1217:58:25【问题描述】:[在谷歌上搜索了几个小时/几天后,我不敢相信这样的基本任务没有一个开箱即用的“helloworld”。]在Windows... 查看详情

32 位 Windows 服务无法在 64 位 Windows 7 上启动

】32位Windows服务无法在64位Windows7上启动【英文标题】:32-bitwindowsservicedonotstarton64-bitwindows7【发布时间】:2011-12-0816:53:41【问题描述】:我有一个32位的windows.exe。它将作为Windows服务运行。此.exe可作为windows2000/xp32位版本的服务正... 查看详情

在 Windows 7 上更改/重置 postgresql 用户密码

】在Windows7上更改/重置postgresql用户密码【英文标题】:Change/resetpostgresqluserpasswordonwindows7【发布时间】:2013-09-0610:02:09【问题描述】:几天前,我在本地计算机上安装了postgesql9.2版本。(操作系统视窗7)现在我忘记了密码,无... 查看详情

是否可以在 Windows 7 上安装 dlib?

】是否可以在Windows7上安装dlib?【英文标题】:IsitpossibletoinstalldlibonWindows7?【发布时间】:2019-06-2916:55:07【问题描述】:我正在尝试创建一个人脸识别系统,但大多数方法都需要dlib库..是否可以在windows上安装dlib?【问题讨论】... 查看详情

在 Windows 7 上崩溃但在 XP 上运行

】在Windows7上崩溃但在XP上运行【英文标题】:CrashonWindows7butrunningonXP【发布时间】:2011-03-2111:38:31【问题描述】:我使用c++、Qt和VisualStudio2010编写了一个小型应用程序。它在WindowsXP(32位)上运行,但在Windows7(64位)上启动后立... 查看详情

如何在 Windows (7) 上更改 Java 运行时版本?

】如何在Windows(7)上更改Java运行时版本?【英文标题】:HowcanIchangetheJavaRuntimeVersiononWindows(7)?【发布时间】:2011-03-2023:58:48【问题描述】:如何在Windows上更改Java运行时版本。我为一些测试安装了Java7,现在我需要旧的java6作为系... 查看详情

无法在 Windows 10 上安装 Windows SDK 7.1

】无法在Windows10上安装WindowsSDK7.1【英文标题】:CannotinstallWindowsSDK7.1onWindows10【发布时间】:2015-11-1212:32:12【问题描述】:我是一名使用Windows10电脑的软件开发人员。我必须支持一些使用WindowsSDK7.1在VisualStudio2010中编写的旧软件... 查看详情

Azure Service Fabric 集群在 Windows 7 单机上运行 Windows 容器

】AzureServiceFabric集群在Windows7单机上运行Windows容器【英文标题】:AzureServiceFabricclustertorunwindowscontainersonwindows7singlemachine【发布时间】:2019-11-1910:54:32【问题描述】:我想使用ServiceFabric在我的Windows7机器上运行Windows容器。我的机... 查看详情

Process.Start() 在 Windows 7 上立即退出

】Process.Start()在Windows7上立即退出【英文标题】:Process.Start()exitsrightawayonWindows7【发布时间】:2017-10-2110:23:10【问题描述】:Process.Start("d:/test.txt");//simple.txtfile在Windows8及更高版本上运行良好,但在Windows7(x64)上它会启动进... 查看详情

在 Windows 7 机器上更正 Typescript 的版本

】在Windows7机器上更正Typescript的版本【英文标题】:CorrectingVersionofTypescriptonWindows7Machine【发布时间】:2018-06-2107:13:27【问题描述】:我正在尝试在Windows7机器上更新我的TypeScript版本。在命令行上,tsc--version给我:版本1.0.3.0我去... 查看详情

如何在 Windows 7 上关闭无头图形环境

】如何在Windows7上关闭无头图形环境【英文标题】:HowcanIturnoffheadlessgraphicsenvironmentonwindows7【发布时间】:2012-04-1816:09:58【问题描述】:我设法破坏了一个正在运行的应用程序,但不知道如何修复它。我有一个javaweb应用程序,它... 查看详情

XCode 在 Windows 7 上安装了软件? [复制]

】XCode在Windows7上安装了软件?[复制]【英文标题】:XCodeinstalledsoftwareonwindows7?[duplicate]【发布时间】:2012-12-0512:05:27【问题描述】:可能重复:Whyisn’tthereXcodeforWindows?我想使用XCode软件进行iPhone开发。我没有mac电脑,有没有办法... 查看详情

在 Windows 7 上将窗口设置为始终保持在桌面上

】在Windows7上将窗口设置为始终保持在桌面上【英文标题】:Setwindowtostaysalwaysondesktoponwindows7【发布时间】:2010-05-1723:18:35【问题描述】:我正在尝试将我的窗口设置为桌面的子窗口,我正在这样做:HWNDProgmanHwnd=::FindWindowEx(::FindW... 查看详情