windows USB 设备驱动开发- WinUSB 简介

news2024/11/16 3:26:59

WinUSB 是 Windows 随附的 USB 设备的通用驱动程序。WinUSB 包括:

  • 内核模式驱动程序 (Winusb.sys);
  • 公开 winusb.h 中所述的 WinUSB 函数的用户模式动态链接库 (Winusb.dll)。 借助这些函数,你可以使用用户模式软件管理 USB 设备;

默认情况下,Winusb.sys 作为上层筛选器驱动程序安装在设备的内核模式堆栈中。 应用与设备的 UMDF 函数驱动程序通信,以发出读取、写入或设备 I/O 控制请求。 在此配置中,Winusb.sys 充当设备堆栈的即插即用和电源所有者。还可以安装 Winusb.sys 作为 USB 设备的功能驱动程序。

Windows 7 在基于 x86、基于 x64 和基于 Itanium 的系统上支持 WinUSB。 较新版本的 Windows 在基于 x86 和基于 x64 的系统上支持 WinUSB。WinUSB 支持在 Windows 8 中开始的常时等量传输。

WinUSB 体系结构和模块

WinUSB 由两个主要组件组成:

  • Winusb.sys是一种内核模式驱动程序,可以作为筛选器或函数驱动程序安装,位于 USB 设备的内核模式设备堆栈中的协议驱动程序之上;
  • Winusb.dll是公开 WinUSB 函数的用户模式 DLL。 当Winusb.sys安装为设备的函数驱动程序时,应用程序可以使用这些函数与它进行通信;

对于不需要自定义函数驱动程序的设备,Winusb.sys可以作为函数驱动程序安装在设备的内核模式堆栈中。 然后用户模式进程可以使用一组设备 I/O 控制请求或通过调用 WinUSB 函数来与Winusb.sys通信。

下图显示了包含多个 Winusb.sys 实例的 USB 驱动程序堆栈。

上图显示了一个实现三个设备接口类的示例 WinUSB 配置,每个类都有一个已注册的设备接口:

  • Winusb.sys实例 1 注册设备接口 A,该接口支持用户模式驱动程序 (Usboem.dll) ‘’
  • Winusb.sys的实例 2 注册了设备接口 B,该接口支持使用系统服务 (SVCHOST) 与Winusb.dll通信的扫描程序 (Usbscan.exe) 的用户模式驱动程序。
  • Winusb.sys 实例 3 注册设备接口 C,它支持固件更新实用工具 (Usbfw.exe) ‘’

Winusb.sys只加载了一个实例。 PDO 可以表示非复合设备 (例如关系图) 中的实例 1,也可以表示复合设备上的接口或接口集合 (例如实例 2 和 3) 。 对于 (WMCDC) 设备的 USB 无线移动通信设备类,PDO 甚至可以表示多个接口集合。

任何用户模式应用程序都可以通过加载 WinUSB 动态链接库 (Winusb.dll) 并调用此模块公开的 WinUSB 函数来与 USB 堆栈通信。

面向开发人员的 WinUSB (Winusb.sys) 安装

对于某些通用串行总线 (USB) 设备(例如只能通过单个应用程序访问的设备),你可以在设备的内核模式堆栈中安装 WinUSB (Winusb.sys),将其作为 USB 设备的功能驱动程序,而不是实现驱动程序。
不使用 INF 文件自动安装 WinUSB OEM 或独立硬件供应商 (IHV) 可以构建设备,以便在 Windows 8 及更高版本的操作系统上自动安装 Winusb.sys。 此类设备称为 WinUSB 设备,无需编写引用内置 Winusb.inf 的自定义 INF 文件。

连接 WinUSB 设备时,系统自动读取设备信息并加载 Winusb.sys。

通过指定系统提供的设备类别来安装 WinUSB

连接设备时,你可能会注意到 Windows 自动加载 Winusb.sys,如果 IHV 已将设备定义为 WinUSB 设备。 否则,请按照以下说明加载驱动程序:

  1. 将设备插入主机系统;
  2. 打开设备管理器并找到设备;
  3. 选择并按住(或右键单击)设备,然后从上下文菜单中选择“更新驱动程序软件…”;
  4. 在向导中,选择“浏览我的计算机以查找驱动程序软件”;
  5. 选择“从计算机的设备驱动程序列表中选择”;
  6. 从设备类别的列表中,选择“通用串行总线设备”;
  7. 向导显示“WinUsb 设备”。 选择此项以加载驱动程序;

如果“通用串行总线设备”没有出现在设备类别列表中,则需要使用自定义 INF 安装驱动程序。 前面的过程并没有为应用(UWP 应用或 Windows 桌面应用)添加访问设备的设备接口 GUID。 必须按照此过程手动添加 GUID。

  1. 按照上述过程中的说明加载驱动程序;
  2. 使用 guidgen.exe 等工具生成设备的设备接口 GUID;
  3. 在此项下找到设备的注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<VID_vvvv&PID_pppp>;
  4. 在“设备参数”项下,添加名为“DeviceInterfaceGUID”的字符串注册表项或名为“DeviceInterfaceGUIDs”的多字符串项。 将值设置为你在步骤 2 中生成的 GUID;
  5. 断开设备与系统的连接,然后将其重新连接到同一个物理端口。 注意:如果更改物理端口,则必须重复步骤 1 到步骤 4;
编写用于 WinUSB 安装的自定义 INF

驱动程序包中有一个 .inf 文件,该文件可将 Winusb.sys 安装为 USB 设备的功能驱动程序。

以下示例 .inf 文件显示了对大多数 USB 设备的 WinUSB 安装,并进行了一些修改,例如将节名称中的 USB_Install 更改为适当的 DDInstall 值。 还应根据需要更改版本、制造商和型号部分。 例如,提供适当的制造商的名称、签名的目录文件的名称、正确的设备类别以及设备的供应商标识符 (VID) 和产品标识符 (PID)。

另请注意,安装程序类设置为“USBDevice”。 对于不属于其他类且不是 USB 主机控制器或集线器的设备,供应商可以使用“USBDevice”安装程序类。

如果要将 WinUSB 安装为 USB 复合设备中某个功能的功能驱动程序,则必须在 INF 中提供与该功能关联的硬件 ID。 可以从“设备管理器”中的 devnode 的属性获取该功能的硬件 ID。 硬件 ID 字符串格式为“USB\VID_vvvv&PID_pppp”。

以下 INF 将 WinUSB 作为 OSR USB FX2 板的功能驱动程序安装在基于 x64 的系统上。

从 Windows 10 1709 版开始,Windows 驱动程序工具包提供 InfVerif.exe,你可以使用它来测试驱动程序 INF 文件,以确保没有语法问题并且 INF 文件是通用的。

;
;
; Installs WinUsb
;

[Version]
Signature   = "$Windows NT$"
Class       = USBDevice
ClassGUID   = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider    = %ManufacturerName%
CatalogFile = WinUSBInstallation.cat
DriverVer   = 09/04/2012,13.54.20.543
PnpLockdown = 1

; ========== Manufacturer/Models sections ===========

[Manufacturer]
%ManufacturerName% = Standard,NTamd64

[Standard.NTamd64]
%DeviceName% =USB_Install, USB\VID_0547&PID_1002

; ========== Class definition (for Windows 8 and earlier versions)===========

[ClassInstall32]
AddReg = ClassInstall_AddReg

[ClassInstall_AddReg]
HKR,,,,%ClassName%
HKR,,NoInstallClass,,1
HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"
HKR,,LowerLogoVersion,,5.2

; =================== Installation ===================

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include =winusb.inf
Needs   = WINUSB.NT.Services

[USB_Install.HW]
AddReg=Dev_AddReg

[USB_Install.Wdf]
KmdfService=WINUSB, WinUsb_Install

[WinUsb_Install]
KmdfLibraryVersion=1.11

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"

; [DestinationDirs]
; If your INF needs to copy files, you must not use the DefaultDestDir directive here.
; You must explicitly reference all file-list-section names in this section.

; =================== Strings ===================

[Strings]
ManufacturerName=""
ClassName="Universal Serial Bus devices"
DeviceName="Fx2 Learning Kit Device"
REG_MULTI_SZ = 0x00010000

仅在设备 INF 文件中包含 ClassInstall32 部分,以安装新的自定义设备安装程序类。 已安装类中的设备的 INF 文件(无论系统提供的是设备安装程序类还是自定义类)都不能包含 ClassInstall32 部分。

除特定于设备的值以及以下列表中所述的几个问题之外,还可以使用这些部分和指令来安装适用于任何 USB 设备的 WinUSB。 这些列表项描述了上述 .inf 文件中的 Includes 和 Directives。

  • USB_Install:安装 WinUSB 需要 USB_Install 部分中的 Include 和 Needs 指令。 不应修改这些指令;
  • USB_Install.Services:USB_Install.Services 部分中的 Include 指令包含系统提供的 WinUSB .inf (Winusb.inf)。 如果目标系统上尚未安装此 .inf 文件,则该文件由 WinUSB 辅助安装程序安装。 Needs 指令指定 Winusb.inf 中的部分,其中包含将 Winusb.sys 安装为设备的功能驱动程序所需的信息。 不应修改这些指令;
  • USB_Install.HW:此部分是 .inf 文件中的键。 它指定设备的设备接口全局唯一标识符 (GUID)。 AddReg 指令在标准注册表值中设置指定的接口 GUID。 当 Winusb.sys 作为设备的功能驱动程序加载时,它将读取注册表值 DeviceInterfaceGUIDs 项,并使用指定的 GUID 来表示设备接口。 在此示例中,应将 GUID 替换为专门为设备创建的 GUID。 如果设备的协议发生更改,请创建新的设备接口 GUID;

注意 用户模式软件必须调用 SetupDiGetClassDevs 才能枚举与在 DeviceInterfaceGUIDs 项下指定的某个设备接口类关联的已注册设备接口。 SetupDiGetClassDevs 返回了设备的设备句柄,然后用户模式软件必须将设备句柄传递给 WinUsb_Initialize 例程,以获取设备接口的 WinUSB 句柄。 

以下 INF 将 WinUSB 作为 OSR USB FX2 板的功能驱动程序安装在基于 x64 的系统上。 示例显示了带有 WDF 辅助安装程序的 INF。

  • USB_Install.CoInstallers:此部分包括引用的 AddReg 和 CopyFiles 部分,其中包含安装 WinUSB 和 KMDF 辅助安装程序并将其与设备关联的数据和说明。 大多数 USB 设备无需修改即可使用这些部分和指令。
  • Windows 基于 x86 和基于 x64 的版本具有单独的辅助安装程序。

每个辅助安装程序都有免费版和经过检查的版本。 使用免费版本可在 Windows 免费版本(包括所有零售版)上安装 WinUSB。 使用经过检查的版本(带有“chk”后缀)在经过检查的 Windows 版本上安装 WinUSB。

每次 Winusb.sys 加载时,它都会注册一个设备接口,该设备接口具有在 DeviceInterfaceGUIDs 项下的注册表中指定的设备接口类。

HKR,,DeviceInterfaceGUIDs, 0x10000,"{D696BFEB-1734-417d-8A04-86D01071C512}"

如果使用 Windows XP 或 Windows Server 2003 的可再分发 WinUSB 包,请确保不要在卸载软件包中卸载 WinUSB。 其他 USB 设备可能正在使用 WinUSB,因此其二进制文件必须保留在共享文件夹中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1950012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试产教融合高质量发展论坛举办,开源网安受邀解读国家标准

近年来&#xff0c;在国家政策引导下&#xff0c;横跨教育体系内外的产教融合改革正在进行&#xff0c;推动了教育与产业深度融合、学校与企业协同发展。在软件安全领域&#xff0c;开源网安也一直走在产教融合发展的最前线&#xff0c;与各大高校建立了深度合作&#xff0c;双…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…

mysql字符类型字段设置默认值为当前时间

-- 2024-07-22 10:22:20 select (DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)); ALTER TABLE tablename MODIFY COLUNN CREATE_DATE varchar (23) DEFAULT(DATE_FORMAT(CURRENT_TIMESTAMP, %Y-%m-%d %H:%i:%s)) COMMENT "创建日期;

新校区,新视野——广州六中以太彩光打造智慧教育新高地

广州市第六中学总务处 林继青 广州市第六中学是拥有85年办学历史的著名市重点中学,也是广东省首批一级学校和国家级示范性高中。作为广州市首批智慧校园建设示范单位,广州第六中学在从化、花都新建校区的智慧校园建设中“破旧立新”,让先进的以太全光技术与学校新校区建设同频共…

CVE-2024-39700 (CVSS 9.9):JupyterLab 模板中存在严重漏洞

在广泛使用的 JupyterLab 扩展模板中发现了一个严重漏洞&#xff0c;编号为CVE-2024-39700 。此漏洞可能使攻击者能够在受影响的系统上远程执行代码&#xff0c;从而可能导致大范围入侵和数据泄露。 该漏洞源于在扩展创建过程中选择“测试”选项时自动生成“update-integratio…

基于 HTML+ECharts 实现智慧安防数据可视化大屏(含源码)

构建智慧安防数据可视化大屏&#xff1a;基于 HTML 和 ECharts 的实现 随着科技的不断进步&#xff0c;智慧安防系统已经成为保障公共安全的重要工具。通过数据可视化&#xff0c;安防管理人员可以实时监控关键区域的安全状况、人员流动以及设备状态&#xff0c;从而提高应急响…

TikTok批量养号方法

想要在TikTok平台上批量养号&#xff0c;确保账号的健康与活跃度非常重要&#xff0c;不然等于白干。下面&#xff0c;我们就来详细探讨一下TikTok养号的几个关键步骤。 首先&#xff0c;新注册的账号必须严格遵守一机一号一IP的原则。随着TikTok平台在识别IP技术方面的不断进步…

叶再豪老师-降龙精英课程

文章目录 1.思维认知1.1 稻盛和夫成功公式1.2 龙头主升模式1.3 龙头主升-两种路径1.4 股市新手的炒股思路1.5 龙头案例1.6 降龙心法 2.情绪周期2.1 情绪周期2.1 情绪演绎周期2.2 情绪的四个部分2.2.1 指数的情绪周期2.2.3 热点情绪周期2.2.4 热点情绪演绎周期2.2.5 大热点支线2…

CDGA|数据治理:安全如何贯穿数据供给、流通、使用全过程

随着信息技术的飞速发展&#xff0c;数据已经成为企业运营、社会管理和经济发展的核心要素。然而&#xff0c;数据在带来巨大价值的同时&#xff0c;也伴随着诸多安全风险。因此&#xff0c;数据治理的重要性日益凸显&#xff0c;它不仅仅是对数据的简单管理&#xff0c;更是确…

JAVA基础知识4(static、继承)

JAVA基础知识4 static静态成员变量静态成员方法解释注意点 继承父类&#xff08;基类或超类&#xff09;子类&#xff08;派生类&#xff09;使用继承的示例解释运行结果 成员变量的访问特点成员方法的访问特点构造方法的访问特点 Java项目&#xff0c;包和类之间的联系包的概念…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

[代码审计]记一次简单的java代码审计

如果觉得该文章有帮助的&#xff0c;麻烦师傅们可以搜索下微信公众号&#xff1a;良月安全。点个关注&#xff0c;感谢师傅们的支持。 免责声明 本博客所发布的所有内容&#xff0c;包括但不限于信息、工具、项目以及文章&#xff0c;均旨在提供学习与研究之用。所有工具安全…

《代码大全》读书笔记-第Ⅰ部分 奠定基础

0.欢迎来到软件构建世界 什么是软件构件&#xff1a; 对于非正式及项目&#xff0c;会觉得罗列出来的这些活动太过于繁复。但是这些对于正式项目都是很有必要的(大部分人都没经历过&#xff0c;比如说我)。一般一些小公司主要也就是需求分析、编码、开发人员自测、集成测试这几…

数据库第五次作业

1. 触发器 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 建立触发器&#xff0c;实现功能:客户修改订单&#xff0c;商品…

步入新时代,使用区块链服务API打造创新应用

随着区块链技术的兴起&#xff0c;我们正步入一个全新的数据时代——一个由透明性、安全性和去中心化定义的时代。Blockchain公司的区块链API&#xff0c;作为连接现实世界与区块链世界的桥梁&#xff0c;为全球开发者和企业提供了一种前所未有的方式&#xff0c;以访问、交互并…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况&#xff1a; 其他电脑可以正常访问共享端&#xff0c;但有一台电脑访问提示错误代码0x80004005。 处理检查&#xff1a; 搜索里输入“启用或关闭Windows功能”按回车键&#xff0c;在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后&#xff08;故…

屏幕管控——保护文档内容安全

屏幕管控是保护文档内容安全的重要手段之一&#xff0c;它涉及到对终端屏幕的使用、访问权限、内容展示以及操作行为的监控和管理。专业的企业级防泄密系统&#xff0c;如金刚钻信息&#xff0c;会有一些专业功能针对屏幕这块有对应的防护措施。 一、屏幕水印设置 屏幕水印是…

外卖霸王餐系统推荐,哪家的系统比较稳定呢?

以下是一些较为稳定且有一定用户基础的外卖霸王餐系统&#xff0c;你可以根据自身需求进一步考察和选择&#xff1a; - **饭否霸王餐**&#xff1a;有专门的APP&#xff0c;如在应用宝上其开发商为南京有惠鲸选电子商务有限公司。它覆盖了多个城市&#xff0c;提供美团、饿了么…

从0到1,AI我来了- (1)从AI手写数字识别开始

前两篇我们我们把控制台、Python环境Anaconda 搞定了&#xff0c;接下来&#xff0c;我们快速进入主题&#xff0c;把AI 界的“Hello World” 实现一下&#xff0c;有个感觉&#xff0c;再逐步了解一些AI的概念。 1、Pytorch 安装 1) 什么是Pytorch? 一个深度学习框架&#…

C语言常见字符函数和字符串函数精讲

目录 引言 一、字符函数 1.字符分类函数 2.字符转换函数 二、字符串函数 1.gets、puts 2.strlen 3.strcpy 4.strncpy 5.strcat 6.strncat 7.strcmp 8.strncmp 9.strstr 10.strchr 11.strtok 12.strlwr 13.strupr 引言 在C语言编程中&#xff0c;字符函数…