尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

windows 驱动实例分析系列: libusb驱动分析-设计篇

windows 驱动实例分析系列: libusb驱动分析-设计篇 项目简介与历史渊源libusb-win32是著名跨平台 USB 库libusb-0.1在 Microsoft Windows 操作系统上的移植实现。它旨在为 Windows 应用程序提供与 Linux 及其他 POSIX 系统上 libusb 完全兼容的用户态 USB 访问接口同时针对 Windows 内核驱动模型增加了异步传输、设备过滤等增强特性。项目起源libusb 最初由 Johannes Erdfelt 等人于 2000 年左右开发作为 Linux 下用户空间访问 USB 设备的通用库。随着 Windows 平台对 USB 设备开发需求的增长Stephan Meyer 在 2002 年发起 libusb-win32 项目将 libusb-0.1 的 API 移植到 Windows并编写了专用的内核驱动程序libusb0.sys和用户态动态链接库libusb0.dll。项目早期托管于 SourceForge后于 2017 年迁移至 GitHub 并由 Peter Dons Tychsen 和 Xiaofan Chen 等维护至今。维护现状根据 README.md 和 AUTHORS.txt当前项目状态为 supported主要维护者包括Peter Dons Tychsen开发者pdtdontech.dkXiaofan Chen项目经理及技术支持xiaofancgmail.com历史贡献者Stephan Meyer、Johannes Erdfelt、Thomas Sailer、Travis Robinson 等注意:1.这个库是一个经典并大量在商业软件中使用的USB库故它的设计非常优秀稳定性经过了市场的实际验证它是window平台两个经典通用库之一, 可以在任何符合USB标准协议的硬件上运行另一个通用库是WinUSB库。2.libusb给出了一个双模式并存的解决方案既可以做设备驱动也能作为Filter驱动虽然类似的技术并不罕见但类似于libusb这样同时具备通用性、兼容性、稳定性的架构很罕见。目录结构如下项目目录结构libusb-release-1.4.0.2 根目录 ├── ddk_make/ ├── doc/ ├── examples/ │ ├── benchmark.c │ ├── BenchmarkHelp.txt │ ├── benchmark_rc.rc │ ├── bulk.c │ ├── driver_installer_template.iss │ └── testbulk_rc.rc ├── projects/ │ └── vs2019/ │ ├── install-filter/ │ ├── install-filter-win/ │ ├── libusb-dll/ │ ├── libusb0/ │ ├── testlibusb/ │ ├── testlibusb-win/ │ └── libusb-win32.sln ├── src/ │ ├── driver/ │ │ ├── abort_endpoint.c │ │ ├── claim_interface.c │ │ ├── clear_feature.c │ │ ├── dispatch.c │ │ ├── ... │ ├── registry.c │ ├── registry.h │ ├── resource.rc │ ├── usb.c │ ├── usbi.h │ └── windows.c ├── tests/ │ ├── testlibusb.c │ ├── testlibusb_rc.rc │ ├── testlibusb_win.c │ └── testlibusb_win_rc.rc ├── AUTHORS.txt ├── CHANGELOG.txt ├── COPYING_GPL.txt ├── COPYING_LGPL.txt ├── installer_license.txt ├── libusb-win32-bin-README.txt.in ├── libusb0.def ├── libusb0_drv.def ├── Makefile ├── README.in └── README.md设计背景与目标libusb-win32 项目诞生于 2002 年其核心目的是将 Linux 上广受欢迎的 libusb-0.1 用户态 USB 访问接口移植到 Microsoft Windows 操作系统。在 Windows 平台上用户态程序无法直接访问硬件必须通过内核驱动因此项目天然需要分为内核驱动与用户态库两部分。设计目标可以归纳为API 兼容性与 libusb-0.1 保持源代码级兼容使现有 Linux 应用能够在不修改源码的情况下在 Windows 上编译运行。驱动模式灵活既能作为设备的功能驱动独占控制也能作为上层或下层过滤驱动与系统中已有驱动如 HID、串口、WinUSB共存避免强制替换导致其他软件失效。性能与实时性在同步传输基础上提供异步接口支持并发多笔传输和超时控制满足大数据量、实时数据采集等需求。系统兼容性支持从 Windows 7 到 Windows 11 的桌面版和服务器版覆盖 x86、x64、ARM64 架构并满足 x64 系统的驱动数字签名强制要求。易用性提供图形化向导inf-wizard和命令行工具简化驱动的安装、卸载、过滤驱动配置过程。总体架构分层整个项目分为三个逻辑层应用层用户态应用程序调用 libusb0.dll 导出的标准 API 进行设备发现、打开、传输控制等操作。用户态库层libusb0.dll封装所有 API将请求转换为 DeviceIoControl 调用与内核驱动通信同时管理异步上下文、超时、错误状态。内核驱动层libusb0.sys作为 WDM 或 KMDF 驱动响应 PnP、电源、设备控制 IRP构建和提交 URBUSB 请求块给 USB 主机控制器驱动USBD并管理端点管道、配置、接口声明等。关键设计决策双模式驱动功能驱动 vs 过滤驱动驱动在 AddDevice 阶段通过检查设备硬件键下的 “SurpriseRemovalOK” 注册表值来确定自身角色如果该值存在且为 1视为功能驱动即非过滤此时驱动将作为该设备的唯一功能驱动负责设置配置、声明接口并作为电源策略拥有者。否则视为过滤驱动此时驱动插入到设备栈中通常作为上层过滤所有 IRP 转发给下层驱动自身仅拦截特定的控制请求如打开设备、发送 URB实现透明访问。这种设计使得同一个 .sys 文件可以适应两种场景用户只需在 INF 文件中控制注册表项的添加与否。设备描述符与配置缓存为减少不必要的控制传输尤其对于响应较慢的设备驱动在内核空间缓存了设备描述符DEVICE_DESCRIPTOR和当前活动配置描述符CONFIGURATION_DESCRIPTOR。当用户态请求获取这些描述符时若缓存有效则直接返回不再发送 URB。这一设计借鉴了 Linux/macOS 的自动缓存行为同时也提升了性能。异步传输框架虽然 libusb-0.1 仅提供同步阻塞 API但 libusb-win32 扩展了异步接口每个异步传输对应一个“上下文”结构包含 OVERLAPPED、URB 指针、回调等。通过usb_submit_async提交后立即返回传输在后台由内核完成。应用程序可调用usb_reap_async等待完成支持超时取消或使用usb_reap_async_nocancel仅等待而不取消。多个异步传输可以同时进行提高吞吐量尤其适用于等时传输和批量大数据传输。自动拆分大传输在内核驱动中对于 BULK 和 INTERRUPT 端点若请求的数据长度超过端点支持的最大传输尺寸MaximumTransferSize驱动会自动将传输拆分为多个 URB 顺序提交并在完成例程中串联。这一机制对用户态透明简化了应用开发。电源管理策略在功能驱动模式下驱动作为电源策略拥有者响应系统电源 IRP并将设备状态同步到 D0-D3。在过滤模式下驱动不参与电源决策只是简单地向下传递电源 IRP避免干扰原有驱动的电源管理。同时通过注册表项SurpriseRemovalOK允许设备安全移除。设备接口注册从 V1.2.4.6 开始驱动支持在 INF 文件中指定DeviceInterfaceGUIDs驱动在启动时会调用IoRegisterDeviceInterface注册设备接口使得用户态程序可以通过 SetupAPI 枚举设备无需遍历所有总线。同时驱动会在注册表中写入LUsb0值内部设备编号方便快速打开设备。兼容性与稳定性考虑驱动在 AddDevice 阶段会跳过 USB 集线器设备避免影响系统关键设备。会检查已附加的驱动若发现 WDF如 WinUSB、WUDF则禁止自身成为电源策略拥有者防止蓝屏。对于非过滤模式驱动不会自动配置设备除非 INF 中明确指定InitialConfigValue减少非预期配置。安装与部署设计项目提供了多种安装方式inf-wizard.exe图形化向导内嵌了驱动二进制文件可生成自定义 INF 并直接安装。install-filter.exe/install-filter-win.exe专门用于管理过滤驱动的命令行/图形化工具支持添加或移除针对特定设备或整个设备类的过滤驱动。用户态库导出usb_install_driver_np、usb_install_service_np等函数供第三方安装程序调用实现静默安装。这些工具利用 Windows Setup API 和 CfgMgr32 API 操作注册表实现驱动的复制、服务创建、设备重启等步骤。总结libusb-win32 的设计充分考虑了 Windows 内核驱动模型的特殊性同时保持了与跨平台 API 的兼容性。其双模式驱动、异步传输、描述符缓存、自动拆分、设备接口注册等特性使其成为 Windows 下 USB 设备开发的强大基础库。设计始终围绕易用性、性能、兼容性三点历经多年版本迭代已非常成熟稳定。
返回列表