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

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.mzph.cn/news/875660.shtml

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

相关文章

12 位运算符

位运算符只能用于整数&#xff0c;其内部执行过程为&#xff1a;首先将整数转换为二进制数&#xff0c;然后右对齐&#xff0c;必要时左侧补0&#xff0c;按位进行运算&#xff0c;最后再把计算结果转换为十进制数字返回。 ① 左移&#xff1a;高位丢弃&#xff0c;低位补0&…

Exponential Moving Average (EMA) in Stable Diffusion

1.Moving Average in Stable Diffusion (SMA&EMA) 1.Moving average 2.移动平均值 3.How We Trained Stable Diffusion for Less than $50k (Part 3) Moving Average 在统计学中&#xff0c;移动平均是通过创建整个数据集中不同选择的一系列平均值来分析数据点的计算。 …

数据结构与算法-插入排序

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、插入排…

unity ui toolkit的使用

UIToolkitExamples (github)样例 GitHub - ikewada/UIToolkitExamples: チュートリアル動画「使ってみようUI Toolkit」のためのサンプルプロジェクトです官网 Unity - Manual: UI Toolkit视频教程 使用 UI Toolkit - 上集_哔哩哔哩_bilibili 使用 UI Toolkit - 下集_哔哩哔哩_…

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…

赋能未来教育,3DCAT助力深圳鹏程技师学院打造5G+XR实训室

随着国家对教育行业的重视&#xff0c;实训室建设已成为推动教育现代化的关键。《教育信息化2.0行动计划》、《职业教育示范性虚拟仿真实训基地建设指南》等政策文件&#xff0c;明确指出了加强虚拟仿真实训教学环境建设的重要性。 在这一大背景下&#xff0c;教育行业对于实训…

初识C++ · AVL树(1)

目录 前言&#xff1a; 1 AVL树的创建 2 部分成员函数 2.1 查找 2.2 中序遍历 2.3 插入 2.4 左旋转 2.5右旋转 前言&#xff1a; 上文&#xff0c;上上文提到了map set&#xff0c;二叉搜索树&#xff0c;其实都是为了近两文做铺垫的&#xff0c;虽然map的底层是红黑树…

openFeign配置okhttp

原来的项目出现了性能问题&#xff0c;老大不知道怎么的&#xff0c;让我改openFeign线程池为okhttp&#xff0c;说原生的不支持线程池性能比较差。 原openFeign配置文章地址 一、pom文件 <dependency><groupId>org.springframework.cloud</groupId><arti…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的跳格子游戏(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

手写spring简易版本,让你更好理解spring源码

首先我们要模拟spring&#xff0c;先搞配置文件&#xff0c;并配置bean 创建我们需要的类&#xff0c;beandefito&#xff0c;这个类是用来装解析后的bean&#xff0c;主要三个字段&#xff0c;id&#xff0c;class&#xff0c;scop&#xff0c;对应xml配置的属性 package org…

第二讲:NJ网络配置

Ethernet/IP网络拓扑结构 一. NJ EtherNet/IP 1、网络端口位置 NJ的CPU上面有两个RJ45的网络接口,其中一个是EtherNet/IP网络端口(另一个是EtherCAT的网络端口) 2、网络作用 如图所示,EtherNet/IP网络既可以做控制器与控制器之间的通信,也可以实现与上位机系统的对接通…

MySQL --- 表的操作

在对表进行操作时&#xff0c;需要先选定操作的表所在的数据库&#xff0c;即先执行 use 数据库名; 一、创建表 create table 表名( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎 ; 说明&#xff1a…

从零入门 AI for Science(AI+药物) #Datawhale AI 夏令营

使用平台 我的Notebook 魔搭社区 https://modelscope.cn/my/mynotebook/preset 主要操作 运行实例&#xff0c;如果有时长尽量选择方式二&#xff08;以下操作基于方式二的实例实现&#xff09; 创建文件夹&#xff0c;并重命名为 2.3siRNA 上传两个文件 到文件夹&#…

BGP路由反射器

原理概述 缺省情况下&#xff0c;路由器从它的一个 IBGP对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体&#xff0c;这个原则称为BGP水平分割原则&#xff0c;该原则的根本作用是防止 AS内部的BGP路由环路。因此&#xff0c;在AS内部&#xff0c;一般需要每台…

【Android】数据存储方案——文件存储、SharedPreferences、SQLite数据库用法总结

文章目录 文件存储存储到文件读取文件 SharedPreferences存储存储获取SharedPreferences对象Context 类的 getSharedPreferences() 方法Activity 类的 getPreferences() 方法PreferenceManager 类中的 getDefaultSharedPreferences() 方法 示例 读取记住密码的功能 SQLite数据库…

4.Java Web开发模式(javaBean+servlet+MVC)

Java Web开发模式 一、Java Web开发模式 1.javaBean简介 JavaBeans是Java中一种特殊的类&#xff0c;可以将多个对象封装到一个对象&#xff08;bean&#xff09;中。特点是可序列化&#xff0c;提供无参构造器&#xff0c;提供getter方法和setter方法访问对象的属性。名称中…

JAVA代码审计JAVA0基础学习(需要WEB基础知识)DAY2

JAVA 在 SQL执行当中 分为3种写法&#xff1a; JDBC注入分析 Mybatis注入分析 Hibernate注入分析 JDBC 模式不安全JAVA代码示例部分特征 定义了一个 sql 参数 直接让用户填入id的内容 一个最简单的SQL语句就被执行了 使用安全语句却并没有被执行 Mybatis&#xff1a; #…

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent&#xff08;ProductManager&#xff09;2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…

【OpenCV C++20 学习笔记】调节图片对比度和亮度(像素变换)

调节图片对比度和亮度&#xff08;像素变换&#xff09; 原理像素变换亮度和对比度调整 代码实现更简便的方法结果展示 γ \gamma γ校正及其实操案例线性变换的缺点 γ \gamma γ校正低曝光图片矫正案例代码实现 原理 关于OpenCV的配置和基础用法&#xff0c;请参阅本专栏的其…

五、工厂方法模式

文章目录 1 基本介绍2 案例2.1 Drink 抽象类2.2 Tea 类2.3 Coffee 类2.4 DrinkFactory 抽象类2.5 TeaFactory 类2.6 CoffeeFactory 类2.7 Client 类2.8 Client 类运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 Product ( 抽象产品 )3.1.2 ConcreteProduct ( 具体产品 )3.1…