You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUsb_Initialize调用返回0且错误码31的问题排查

WinUsb_Initialize调用失败(错误码31)排查方案

问题描述

使用Python结合winusbpy调用WinUsb_Initialize时始终返回0,获取到Windows错误码31(ERROR_GEN_FAILURE),已更新常量定义(如GENERIC_WRITE、FILE_FLAG_OVERLAPPED等),但问题依旧。

错误码31的含义

错误码31对应Windows系统错误ERROR_GEN_FAILURE,描述为"A device attached to the system is not functioning.",通常和设备驱动绑定、访问权限、API参数正确性相关。

排查与解决步骤

1. 确认设备已绑定WinUSB驱动

WinUsb_Initialize仅对绑定了WinUSB驱动的设备有效:

  • 打开设备管理器,找到目标USB设备,查看其驱动程序是否为"WinUSB"
  • 如果是厂商自定义驱动,使用驱动替换工具将设备驱动切换为WinUSB(注意选择正确的设备接口)

2. 调整CreateFile参数

尝试移除重叠IO标记,改用同步模式测试:

# 移除FILE_FLAG_OVERLAPPED,使用同步IO
handle_file = api.exec_function_kernel32("CreateFileW", path, GENERIC_WRITE | GENERIC_READ,
                                         FILE_SHARE_WRITE | FILE_SHARE_READ, None, OPEN_EXISTING,
                                         FILE_ATTRIBUTE_NORMAL, None)

另外,可尝试仅申请GENERIC_WRITE或GENERIC_READ权限,部分设备可能不允许同时申请读写权限。

3. 验证设备路径的正确性

确保找到的设备路径对应WinUSB接口:

  • 设备可能包含多个接口(如HID、批量传输接口),is_device(vid, pid, path)仅验证VID/PID,无法确认是否为WinUSB接口
  • 通过设备管理器查看设备的"设备实例路径",和代码中输出的path对比,确保路径指向正确的接口

4. 以管理员权限运行脚本

访问USB设备通常需要管理员权限,右键点击Python脚本或终端,选择"以管理员身份运行"。

5. 修正WinUsb_Initialize的参数类型

确保handle_winusb使用正确的类型定义:

from ctypes import *
# 明确WINUSB_INTERFACE_HANDLE类型
WINUSB_INTERFACE_HANDLE = c_void_p
handle_winusb = WINUSB_INTERFACE_HANDLE()

result = api.exec_function_winusb("WinUsb_Initialize", handle_file, byref(handle_winusb))

关键代码修改示例

调整后的CreateFile与WinUsb初始化代码:

# 以管理员权限运行脚本
# 调整CreateFile参数,移除重叠IO
handle_file = api.exec_function_kernel32("CreateFileW", path, GENERIC_WRITE | GENERIC_READ,
                                         FILE_SHARE_WRITE | FILE_SHARE_READ, None, OPEN_EXISTING,
                                         FILE_ATTRIBUTE_NORMAL, None)

if INVALID_HANDLE_VALUE == handle_file:
    print("Error Creating File")
else:
    print("File handle created successfully")
    # 使用正确的句柄类型
    WINUSB_INTERFACE_HANDLE = c_void_p
    handle_winusb = WINUSB_INTERFACE_HANDLE()
    result = api.exec_function_winusb("WinUsb_Initialize", handle_file, byref(handle_winusb))
    
    if result != 0:
        print("WinUsb initialized successfully")
        # 后续设备操作...
    else:
        error_code = api.exec_function_kernel32("GetLastError")
        print(f"WinUsb Initialize Error: {error_code}")

内容的提问来源于stack exchange,提问作者user19212551

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:43:10