windows 驱动实例分析系列: libusb驱动分析-应用层源码篇(二)

发布时间:2026/8/30 7:01:38

windows 驱动实例分析系列: libusb驱动分析-应用层源码篇(二)
libusb-win32 应用层源码分析第二篇同步与异步数据传输1. 数据传输总览libusb-win32 应用层支持两类传输接口同步阻塞传输函数调用后阻塞直至传输完成或超时。包括usb_bulk_read/write、usb_interrupt_read/write、usb_control_msg。异步非阻塞传输需调用*_setup_async创建上下文usb_submit_async提交usb_reap_async等待完成。支持批量、中断、等时传输。实际实现中同步传输是异步传输的封装内部创建上下文、提交、等待完成然后释放。所有传输最终通过DeviceIoControl发送IOCTL给内核驱动libusb0.sys。2. 核心 IO 辅助函数2.1_usb_io_sync()位于windows.c。用于执行同步 DeviceIoControl请求。内部创建OVERLAPPED和事件对象。调用DeviceIoControl若返回ERROR_IO_PENDING则WaitForSingleObject等待完成。成功时返回TRUE并通过ret参数返回实际传输字节数。这是所有同步传输控制、版本查询、调试设置的底层工具。2.2_usb_setup_async()创建异步传输上下文usb_context_t。参数设备句柄、控制码、端点地址、等时包大小。校验端点方向与控制码匹配如读端点不能用于写控制码。分配内存初始化OVERLAPPED事件。返回上下文指针。2.3_usb_transfer_sync()同步传输的通用实现。调用_usb_setup_async创建上下文。调用usb_submit_async提交。调用usb_reap_async等待完成超时timeout若为 0 则视为INFINITE。调用usb_free_async释放。返回实际传输字节数或错误码。3. 同步传输函数3.1usb_bulk_read/writeintusb_bulk_read(usb_dev_handle*dev,intep,char*bytes,intsize,inttimeout){return_usb_transfer_sync(dev,LIBUSB_IOCTL_INTERRUPT_OR_BULK_READ,ep,0,bytes,size,timeout);}控制码读LIBUSB_IOCTL_INTERRUPT_OR_BULK_READ写LIBUSB_IOCTL_INTERRUPT_OR_BULK_WRITEpktsize参数为 0由内核驱动根据端点描述符自动确定。3.2usb_interrupt_read/write与 bulk 使用相同的控制码LIBUSB_IOCTL_INTERRUPT_OR_BULK_READ/WRITE。内核驱动会根据端点类型区分。3.3usb_control_msg特殊处理这是最复杂的传输函数因为 Windows 不直接支持标准 USB 控制请求需映射到不同的 IOCTL。流程解析requesttype和request若为USB_TYPE_STANDARD根据request值映射到对应的 IOCTL如USB_REQ_GET_STATUS-LIBUSB_IOCTL_GET_STATUS。若为USB_TYPE_VENDOR或USB_TYPE_CLASS映射到LIBUSB_IOCTL_VENDOR_READ或LIBUSB_IOCTL_VENDOR_WRITE。对于OUT请求requesttype不带USB_ENDPOINT_IN将用户数据附加在libusb_request结构之后通过_usb_io_sync发送in_size为 0。对于IN请求_usb_io_sync将数据填充到用户缓冲区返回实际读取字节数。超时参数通过req.timeout传递。4. 异步传输框架4.1 上下文创建usb_bulk_setup_async(dev, context, ep)usb_interrupt_setup_async(dev, context, ep)usb_isochronous_setup_async(dev, context, ep, pktsize)这些函数调用_usb_setup_async传入对应的控制码Bulk/InterruptLIBUSB_IOCTL_INTERRUPT_OR_BULK_READ/WRITEIsochronousLIBUSB_IOCTL_ISOCHRONOUS_READ/WRITE等时传输需指定pktsize包大小批量/中断则传 0。4.2 提交传输usb_submit_async检查上下文有效性、设备打开状态、配置有效、接口已声明。重置OVERLAPPED事件。调用DeviceIoControllpInBuffer指向c-reqlibusb_request结构nInBufferSizesizeof(libusb_request)lpOutBufferc-bytes用户数据缓冲区nOutBufferSizec-sizelpOverlapped指向c-ol若返回ERROR_IO_PENDING则传输已后台进行其他错误则立即返回错误码。4.3 等待完成4.3.1usb_reap_async(context, timeout)内部调用_usb_reap_async(context, timeout, TRUE)。WaitForSingleObject(c-ol.hEvent, timeout)。若超时调用_usb_cancel_io(c)取消传输返回-ETRANSFER_TIMEDOUT。若完成调用GetOverlappedResult获取实际传输字节数。4.3.2usb_reap_async_nocancel(context, timeout)与reap_async唯一区别超时时不取消传输仅返回超时错误。适用于流水线场景调用者希望保留传输继续执行。4.4 取消传输usb_cancel_async(context)调用_usb_cancel_io(c)。_usb_cancel_io通过_usb_abort_ep发送LIBUSB_IOCTL_ABORT_ENDPOINT给内核同步等待原传输的事件对象完成WaitForSingleObject(ol.hEvent, INFINITE)。原因必须确保用户缓冲区不再被内核访问防止栈溢出如局部数组被异步访问。文档注释中明确指出此行为。4.5 释放上下文usb_free_async关闭事件句柄CloseHandle。释放上下文内存。4.6 异步流水线示例参考benchmark.c可同时保持多个进行中的传输通过多个上下文。提交 N 个传输后使用usb_reap_async_nocancel等待最旧的完成立即重新提交形成环形队列。5. 端点控制函数5.1usb_resetep(dev, ep)发送两个 IOCTLLIBUSB_IOCTL_ABORT_ENDPOINT中止该端点上所有待处理 URB。LIBUSB_IOCTL_RESET_ENDPOINT复位端点数据翻转位清除 halt 状态。实际上是usb_clear_halt的超集。5.2usb_clear_halt(dev, ep)仅发送LIBUSB_IOCTL_RESET_ENDPOINT。根据 USB 规范清除端点 halt 条件。5.3 内部_usb_abort_ep发送LIBUSB_IOCTL_ABORT_ENDPOINT同步等待完成。6. 设备重置6.1usb_reset(dev)发送LIBUSB_IOCTL_RESET_DEVICE执行完整复位端口复位 端口循环。6.2usb_reset_ex(dev, reset_type)V1.2.4.8 新增扩展接口。reset_type可选USB_RESET_TYPE_RESET_PORT仅端口复位。USB_RESET_TYPE_CYCLE_PORT仅端口循环逻辑移除再重新枚举。USB_RESET_TYPE_FULL_RESET两者组合默认。通过LIBUSB_IOCTL_RESET_DEVICE_EX传递reset_type给驱动。7. 版本查询与调试控制7.1usb_get_version()返回全局静态变量_usb_version。在usb_os_init()中已通过 IOCTL 填充驱动版本号。7.2usb_set_debug(level)调用usb_log_set_level(level)。找到第一个可用的 libusb0 设备通过CreateFile试探发送LIBUSB_IOCTL_SET_DEBUG_LEVEL。驱动收到后更新内部调试级别。8. DLL 生命周期管理DllMainwindows.cDLL_PROCESS_ATTACH无操作。DLL_PROCESS_DETACH调用_usb_deinit()递归释放所有总线、设备和虚拟根集线器。确保进程退出时无内存泄漏。9. 关键技术点总结同步基于异步所有传输最终都使用OVERLAPPEDWaitForSingleObject。取消安全性usb_cancel_async同步等待OVERLAPPED完成防止用户栈被破坏。控制传输的复杂映射将标准 USB 请求拆分为多个 Windows 专用 IOCTL。超时处理超时值 0 被解释为INFINITE符合 libusb 语义。设备枚举优化在usb_os_init时尝试打开任意设备以获取驱动版本但实际枚举在usb_find_devices中独立完成。10. 与内核驱动交互的 IOCTL 清单IOCTL 名称用途LIBUSB_IOCTL_GET_VERSION获取驱动版本LIBUSB_IOCTL_SET_DEBUG_LEVEL设置驱动日志级别LIBUSB_IOCTL_GET_CACHED_CONFIGURATION获取缓存配置无 I/OLIBUSB_IOCTL_SET_CONFIGURATION设置配置LIBUSB_IOCTL_CLAIM_INTERFACE声明接口LIBUSB_IOCTL_RELEASE_INTERFACE释放接口LIBUSB_IOCTL_SET_INTERFACE设置备用接口LIBUSB_IOCTL_GET_INTERFACE获取当前备用设置LIBUSB_IOCTL_INTERRUPT_OR_BULK_READ/WRITE批量/中断传输LIBUSB_IOCTL_ISOCHRONOUS_READ/WRITE等时传输LIBUSB_IOCTL_VENDOR_READ/WRITE厂商/类控制传输LIBUSB_IOCTL_GET_DESCRIPTOR获取描述符驱动可缓存LIBUSB_IOCTL_GET_STATUS获取状态LIBUSB_IOCTL_CLEAR_FEATURE清除特性LIBUSB_IOCTL_SET_FEATURE设置特性LIBUSB_IOCTL_RESET_ENDPOINT复位端点LIBUSB_IOCTL_ABORT_ENDPOINT中止端点传输LIBUSB_IOCTL_RESET_DEVICE复位设备LIBUSB_IOCTL_RESET_DEVICE_EX扩展复位LIBUSB_IOCTL_GET_DEVICE_PROPERTY获取设备属性PnPLIBUSB_IOCTL_GET_CUSTOM_REG_PROPERTY获取自定义注册表属性LIBUSB_IOCTL_GET_OBJECT_NAME获取设备对象名称后续文档将详细分析安装工具与注册表操作install.c,registry.c以及动态加载模块libusb_dyn.c。

相关新闻

杨 第四章线性方程组

杨 第四章线性方程组

2026/8/30 7:01:38

A0代表,有非0解,左边不确定rA是否等于rA|bA不等于0代表,只有0解满秩,rA一定相等rA|bSn-r基本概念导出组:线性方程组和行列式克拉默判断解的情况线性方程组和矩阵Axb 和 AXB求x矩阵方程 AXB线性方程组和秩总结:A行满秩必…

字节跳动前端面试全流程复盘:从简历到Offer的实战经验

字节跳动前端面试全流程复盘:从简历到Offer的实战经验

2026/8/30 6:51:38

记一次字节跳动前端面试经历:从简历投递到Offer的全过程复盘今年年中我经历了一次完整的字节跳动前端岗位面试流程,从最初的简历筛选到最终的技术定级,前后持续了将近三周。整体感受是:字节的面试节奏快、考察维度全面、非常关注候…

【关注可白嫖源码】--课程设计--毕业设计--智慧养老服务系统[编号:project64990](案件分析)

【关注可白嫖源码】--课程设计--毕业设计--智慧养老服务系统[编号:project64990](案件分析)

2026/8/30 6:51:38

摘 要目前社会老龄化进程不断加快,传统养老机构人员调配、业务处理等大多依靠人工操作,存在信息传递慢、护理记录容易出错、费用核算繁杂等问题,不能适应规模化、精细化的管理要求。因此设计并实现一个整合资源、优化流程的养老服务系统有重…

基于MAPPO的多无人机三维编队避障:从强化学习原理到PyBullet仿真实践

基于MAPPO的多无人机三维编队避障:从强化学习原理到PyBullet仿真实践

2026/8/30 8:21:43

简介:本资源是一套面向本科毕业设计与人工智能课程实践的多无人机三维协同控制方案,聚焦于复杂动态环境下多机编队保持与实时避障两大核心挑战,采用深度强化学习前沿算法MAPPO实现分布式智能决策。压缩包共6个文件(4个Python脚本、…

三端影视源码实战:基于苹果CMS的自动采集建站与App封装指南

三端影视源码实战:基于苹果CMS的自动采集建站与App封装指南

2026/8/30 8:21:43

简介:这是一套基于苹果CMS开发的三端(PC手机H5App)影视网站源码,面向影视站长、PHP初中级开发者及个人建站爱好者,解决快速搭建自动采集电影电视剧网站的核心需求。资源包共2000个文件,含671个PHP后端逻辑文…

从源码到运营级直播打赏系统:架构、支付安全与高并发实战

从源码到运营级直播打赏系统:架构、支付安全与高并发实战

2026/8/30 8:21:43

简介:这是一套面向Web开发者与平台运营人员的实战型学习资源,聚焦在线打赏系统的设计与支付集成,尤其适用于内容平台、直播社区等需高并发打赏能力的场景。资源包含完整可运行的运营级打赏程序源码及配套视频教程,覆盖环境部署、支…

从1亿到450亿:AI算力军备竞赛背后的技术逻辑与风险启示

从1亿到450亿:AI算力军备竞赛背后的技术逻辑与风险启示

2026/8/30 8:21:43

在科技投资领域,很少有人能像 Leopold Aschenbrenner 这样,把“技术判断”和“巨额资金”绑得如此紧密。一则关于他管理的资金从 1 亿美元增长到 450 亿美元、同时又“几乎爆仓”的讨论,最近在技术圈反复被提起。这件事之所以值得技术人关注&…

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手

2026/8/30 8:21:43

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手 【免费下载链接】minimind 🧠 Train a 64M-parameter LLM from scratch in just 2h! 项目地址: https://gitcode.com/GitHub_Trending/min/minimind 周一上午九点,社区…

电影票房大数据分析全链路:Python爬虫+Spark+可视化

电影票房大数据分析全链路:Python爬虫+Spark+可视化

2026/8/30 8:11:43

在大数据毕业设计中,电影票房数据分析与可视化属于典型的“数据采集 -> 数据存储 -> 数据清洗 -> 数据分析 -> 可视化展示”全链路项目。它覆盖了 Python 爬虫、Hadoop HDFS、Spark SQL、数据库设计和前端图表展示等多个环节,既能体现工程能…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…