windows USB 设备驱动开发-创建安装 Winusb.sys 的驱动程序包

news2025/2/24 13:06:46

要将 WinUSB 用作设备的功能驱动程序,请创建一个驱动程序包。 驱动程序包必须包含以下文件:

  • WinUSB 辅助安装程序 (Winusbcoinstaller.dll);
  • KMDF 辅助安装程序 (WdfcoinstallerXXX.dll);
  • 一个 .inf 文件,用于将 Winusb.sys 安装为设备的功能驱动程序;
  • 包的已签名目录文件。 从 Vista 开始,在 Windows x64 版本上安装 WinUSB 时需要此文件;
    3fa52cffa7b94f17a2f8cc562023bfa3.png

确保驱动程序包的内容符合这些要求:

  • 必须从相同版本的 Windows 驱动程序工具包 (WDK) 获取 KMDF 和 WinUSB 辅助安装程序文件‘;
  • 必须从最新版本的 WDK 获取辅助安装程序文件,以便驱动程序支持所有最新的 Windows 版本;
  • 必须使用 Winqual 版本签名对驱动程序包的内容进行数字签名;

Windows 开发人员中心硬件站点上的内核模式代码签名演练方式如下:

  1. 下载 Windows 驱动程序工具包 (WDK) 并安装此包;
  2. 在连接 USB 设备的计算机上创建驱动程序包文件夹。 例如,c:\UsbDevice;
  3. 将 WinUSB 辅助安装程序 (WinusbcoinstallerX.dll) 从 WinDDK\<BuildNumber>\redist\winusb 文件夹复制到驱动程序包文件夹;
    WinUSB 辅助安装程序 (Winusbcoinstaller.dll) 根据需要在目标系统上安装 WinUSB。 WDK 包括三个版本的辅助安装程序,具体取决于以下系统体系结构:基于 x86 的系统、基于 x64 的系统和基于 Itanium 的系统。 它们都命名为 WinusbcoinstallerX,并且位于 WinDDK\<BuildNumber>\redist\winusb 文件夹的相应子目录中;
  4. 将 KMDF 辅助安装程序 (WdfcoinstallerXXX.dll) 从 WinDDK\<BuildNumber>\redist\wdf 文件夹复制到驱动程序包文件夹。
    KMDF 辅助安装程序 (WdfcoinstallerXXX.dll) 根据需要在目标系统上安装适当的 KMDF 版本。 WinUSB 辅助安装程序的版本必须与 KMDF 辅助安装程序匹配,因为基于 KMDF 的客户端驱动程序(例如 Winusb.sys)要求在系统上正确安装相应版本的 KMDF 框架。 例如,Winusbcoinstaller2 需要 KMDF 版本1.9,该版本由 Wdfcoinstaller01009 安装。 WdfcoinstallerXXX 的 x86 和 x64 版本都包含在 WinDDK\<BuildNumber>\redist\wdf 文件夹下的 WDK 中。 下表显示了要在目标系统上使用的 WinUSB 辅助安装程序和关联的 KMDF 辅助安装程序。使用此表可确定 WinUSB 辅助安装程序和关联的 KMDF 辅助安装程序;
    09c80e7958124a96904a5a57e6db045f.png
  5. 编写一个 .inf 文件,用于将 Winusb.sys 安装为 USB 设备的功能驱动程序;
  6. 创建包的已签名目录文件。 在 Windows x64 版本上安装 WinUSB 时需要此文件;
  7. 将 USB 设备连接到计算机;
  8. 打开“设备管理器”,以安装驱动程序。 按照“更新驱动程序软件”向导中的说明进行操作,然后选择手动安装。 你需要提供驱动程序包文件夹的位置才能完成安装;

WinUSB 设备

在本文中,你将了解 Windows 如何识别 WinUSB 设备。

如果你是 OEM 或独立硬件供应商, (IHV) 开发想要使用 Winusb.sys 作为函数驱动程序的设备,并且想要在不提供自定义 INF 的情况下自动加载驱动程序,则本文中的信息适用于你。

什么是 WinUSB 设备

WinUSB 设备是通用串行总线 (USB) 设备,其固件定义某些 Microsoft 操作系统 (OS) 功能描述符,将兼容 ID 报告为“WINUSB”。

WinUSB 设备的目的是使 Windows 能够加载 Winusb.sys 作为设备的功能驱动程序,而无需自定义 INF 文件。 对于 WinUSB 设备,无需为设备分发 INF 文件,从而使最终用户的驱动程序安装过程变得简单。 相反,如果需要提供自定义 INF,则不应将设备定义为 WinUSB 设备,并在 INF 中指定设备的硬件 ID。

Microsoft 提供 Winusb.inf,其中包含安装 Winusb.sys 作为 USB 设备的设备驱动程序所需的信息。

在Windows 8之前,若要将 Winusb.sys 加载为函数驱动程序,需要提供自定义 INF。 自定义 INF 指定特定于设备的硬件 ID,还包括内置 Winusb.inf 中的部分。 这些部分是实例化服务、复制收件箱二进制文件和注册应用程序查找设备并与之通信所需的设备接口 GUID 所必需的。

在Windows 8中,内置 Winusb.inf 文件已更新,使 Windows 能够自动将 INF 与 WinUSB 设备匹配。

使用内置 Winusb.inf 安装 WinUSB 设备

在 Windows 8 中,已更新内置 Winusb.inf 文件。 INF 包含一个安装部分,该部分引用名为“USB\MS_COMP_WINUSB”的兼容 ID。

[Generic.Section.NTamd64]
%USB\MS_COMP_WINUSB.DeviceDesc%=WINUSB,USB\MS_COMP_WINUSB

新后的 INF 还包括名为“USBDevice”的新安装类。

“USBDevice”安装类适用于 Microsoft 未提供内置驱动程序的设备。 通常,此类设备不属于定义完善的 USB 类(如音频、蓝牙等),并且需要自定义驱动程序。 如果你的设备是 WinUSB 设备,则很可能该设备不属于 USB 类。 因此,设备必须安装在“USBDevice”安装类下。 更新的 Winusb.inf 有助于满足该要求。

关于使用 USBDevice 类

不要对未分类的设备使用“USB”安装类。 该类保留用于安装控制器、中心和复合设备。 误用“USB”类可能会导致严重的可靠性和性能问题。 对于未分类的设备,请使用“USBDevice”。

在 Windows 8,若要使用“USBDevice”设备类,只需将此添加到 INF:

[Version]
  ...
  Class=USBDevice
  ClassGuid={88BAE032-5A81-49f0-BC3D-A4FF138216D6}
  ...

在设备管理器你将看到一个新节点 USB 通用串行总线设备,并且你的设备显示在该节点下。

在 Windows 7 中,除了上述行外,还需要在 INF 中创建以下注册表设置:

;---------- Add Registry Section ----------
  [USBDeviceClassReg]
  HKR,,,,"Universal Serial Bus devices"
  HKR,,NoInstallClass,,1
  HKR,,SilentInstall,,1
  HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"

在设备管理器中,你将看到设备显示在 USB 通用串行总线设备下。 但是,设备类说明派生自 INF 中指定的注册表设置。

请注意,“USBDevice”类不限于 WinUSB。 如果你有适用于设备的自定义驱动程序,则可以使用自定义 INF 中的“USBDevice”安装类。

在设备枚举期间,USB 驱动程序堆栈从设备读取兼容 ID。 如果兼容 ID 为“WINUSB”,则 Windows 将其用作设备标识符,并在更新的内置 Winusb.inf 中查找匹配项,然后加载 Winusb.sys 作为设备的函数驱动程序。

此映像适用于定义为 WinUSB 设备的单个接口 MUTT 设备,因此 Winusb.sys 加载为设备的函数驱动程序。

88fd0665dd3446d4a898422557f667eb.png

对于早于 Windows 8 的 Windows 版本,可通过Windows 更新获取更新后的 Winusb.inf。 如果计算机配置为自动获取驱动程序更新,则使用新的 INF 包将安装 WinUSB 驱动程序,而无需任何用户干预。

如何更改 WinUSB 设备的设备说明

对于 WinUSB 设备,设备管理器显示“WinUsb 设备”作为设备说明。 该字符串派生自 Winusb.inf。 如果有多个 WinUSB 设备,则所有设备都会获得相同的设备说明。

为了在 设备管理器 中唯一标识和区分设备,Windows 8在设备类上提供一个新属性,该属性指示系统在其 iProduct 字符串描述符) 中将设备描述 (报告的设备说明优先于 INF 中的说明。 Windows 8 中定义的“USBDevice”类将设置此属性。 换句话说,当设备安装在“USBDevice”类下时,系统会查询设备以获取设备说明,并将设备管理器字符串设置为查询中检索到的任何内容。 在这种情况下,将忽略 INF 中提供的设备说明。 请注意上图中的设备说明字符串:“MUTT”。 字符串由 USB 设备在其产品字符串描述符中提供。

早期版本的 Windows 不支持新的类属性。 若要在早期版本的 Windows 上获得自定义设备说明,必须编写自己的自定义 INF。

如何配置 WinUSB 设备

若要将 USB 设备标识为 WinUSB 设备,设备固件必须具有 Microsoft OS 描述符。

支持扩展功能描述符

为了使 USB 驱动程序堆栈知道设备支持扩展功能描述符,设备必须定义存储在字符串索引0xEE的 OS 字符串描述符。 在枚举期间,驱动程序堆栈会查询字符串描述符。 如果描述符存在,则驱动程序堆栈假定设备包含一个或多个 OS 功能描述符以及检索这些功能描述符所需的数据。

检索到的字符串描述符具有 bMS_VendorCode 字段值。 值指示 USB 驱动程序堆栈必须用于检索扩展功能描述符的供应商代码。

设置兼容 ID

扩展的兼容 ID OS 功能描述符,用于匹配内置 Winusb.inf 并加载 WinUSB 驱动程序模块。

扩展的兼容 ID OS 功能描述符包括标头部分,后跟一个或多个功能部分,具体取决于设备是复合设备还是非复合设备。 标头部分指定整个描述符的长度、函数节数和版本号。 对于非复合设备,标头后跟一个与设备的唯一接口关联的函数部分。 该部分的 compatibleID 字段必须指定“WINUSB”作为字段值。 对于复合设备,有多个功能部分。 每个函数节的 compatibleID 字段必须指定“WINUSB”。

注册设备接口 GUID

注册其设备接口 GUID 所需的扩展属性 OS 功能描述符。 需要 GUID 才能从应用程序或服务中查找设备、配置设备以及执行 I/O 操作。

在早期版本的 Windows 中,设备接口 GUID 注册是通过自定义 INF 完成的。 从 Windows 8 开始,设备应使用扩展属性 OS 功能描述符报告接口 GUID。

扩展属性 OS 功能描述符包括标头部分,后跟一个或多个自定义属性节。 标头部分描述整个扩展属性描述符,包括其总长度、版本号和自定义属性节数。 若要注册设备接口 GUID,请添加自定义属性部分,将 bPropertyName 字段设置为“DeviceInterfaceGUID”, 并将 wPropertyNameLength 设置为 40 字节。 使用 GUID 生成器生成唯一的设备接口 GUID,并将 bPropertyData 字段设置为该 GUID,例如“{8FE6D4D7-49DD-41E7-9486-49AFC6BFE475}”。 GUID 指定为 Unicode 字符串,字符串的长度为 78 字节, (包括 null 终止符) 。

b80c904f39ad4d13b06a4a460789ea11.png
在设备枚举期间,USB 驱动程序堆栈随后从扩展属性 OS 功能描述符中检索 DeviceInterfaceGUID 值,并在设备的硬件密钥中注册设备。 应用程序可以使用 SetupDiXxx API 检索值 (请参阅 SetupDiOpenDevRegKey) 。 

启用或禁用 WinUSB 电源管理功能

在Windows 8之前,若要配置 WinUSB 的电源管理功能,必须在 HW 中编写注册表项值。自定义 INF 的 AddReg 部分。

在Windows 8及更高版本中,可以在设备中指定电源设置。 可以通过扩展属性 OS 功能描述符报告值,这些描述符在 WinUSB 中为该设备启用或禁用功能。 可以配置两个功能:选择性挂起和系统唤醒。 选择性挂起允许设备在空闲时进入低功耗状态。 系统唤醒是指设备在系统处于低功耗状态时唤醒系统的能力。

fbcfa64f83c04f669245f7ca1f11b2c7.png

例如,若要在设备上启用选择性挂起,请添加一个自定义属性部分,用于将 bPropertyName 字段设置为 Unicode 字符串“DeviceIdleEnabled”和 wPropertyNameLength 为 36 字节。 将 bPropertyData 字段设置为“0x00000001”。 属性值存储为小字节序 32 位整数。

在枚举期间,USB 驱动程序堆栈读取扩展属性功能描述符,并在此项下创建注册表项:

\ HKEY_LOCAL_MACHINE系统\CurrentControlSet\枚举\Usb\<设备标识符>\<实例标识符>\设备参数

此图显示了 WinUSB 设备的示例设置。

b2ec5054ff4e49178baf07c318743b27.png

 

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

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

相关文章

MYSQL 第三次作业

1、第三次作业 01、SELECT * FROM student; SELECT * FROM score; 02、SELECT * FROM student LIMIT 1, 3; 03、SELECT * FROM student WHERE department IN (计算机系, 英语系); 04、SELECT * FROM student WHERE birth_year > 1998; 05、SELECT department, COUNT(*) as c…

Corel VideoStudio 会声会影2023旗舰版视频软件

使用新版 Corel VideoStudio 会声会影2023是 一次激活永久使用。 享受有趣轻松的视频编辑体验。通过数百种滤镜、效果、标题、过渡和图形 — 包括新增面部追踪贴纸 — 探索拖放创意。运用直观的工具和即时项目模板&#xff0c;几分钟即可创建出色的视频&#xff01;探索有趣简单…

【JUC】CAS(轻量级加锁)

文章目录 原子类没有CAS之前使用CAS之后CAS是什么&#xff1f;compareAndSet 源码 CAS底层原理&#xff1f;谈谈对Unsafe类的理解&#xff1f;Unsafei是线程不安全的&#xff0c;AtomicInteger.getAndIncrement()如何保证原子性&#xff1f; 源码分析底层汇编语言面试回答 原子…

OriginPro 2024b (学习版) 绘制3D坐标下 边际直方图

OriginPro 2024b (学习版) 绘制3D坐标下 边际直方图 时间 2024年7月27日 1.导入数据 需要3列数据&#xff0c;分别作为x,y,z, 其中z值随便设置。快速设置z值的方法&#xff1a;在第4行“F(x)”输入1&#xff0c;这一列的值全设置为1了。 设置x,y,z的方法如下&#xff1a;点击…

【机器学习】周志华《机器学习》西瓜书勘误:按章节排序整理(截至2024年1月第45次印刷)

文章目录 按章节排序第 1 章 绪论第 2 章 模型评估与选择第 3 章 线性模型第 4 章 决策树第 5 章 神经网络第 6 章 支持向量机第 7 章 贝叶斯分类器第 8 章 集成学习第 9 章 聚类第10章 降维与度量学习第11章 特征选择与稀疏学习第12章 计算学习理论第13章 半监督学习第14章 概…

使用两台虚拟机分别部署前端和后端项目

使用两台虚拟机分别部署前端和后端项目 1 部署方案2 准备两台虚拟机&#xff0c;并配置网络环境3 部署后端项目3.1 打包服务3.2 上传jar包到服务器3.3 集成Systemd3.3.1 移动端服务集成Systemd3.3.2 后台管理系统集成Systemd 4 配置域名映射5 部署前端项目5.1 移动端5.1.1 打包…

JVM系列(二) -类的加载过程

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件&#xff0c;然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件&#xff1f;如何加载class文件&#xff1f;class文件进入到虚拟机后发…

ARCH和GARCH模型★★

该博客为个人学习清风建模的学习笔记&#xff0c;部分课程可以在B站&#xff1a;【强烈推荐】清风&#xff1a;数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 该节是针对时间序列分析中对证券指数分析不能使用传统时间序列模型做出的模型&a…

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表&#xff08;尽量使用列表初始化&#xff09; 二. static成员 2.1static成员初始化 三.友元 3.1友元&#xff1a;提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫…

数据结构第三讲:单链表的实现

数据结构第三讲&#xff1a;单链表的实现 1.什么是单链表2. 节点3.单链表的实现3.1节点的结构3.2打印单链表3.3申请一个新节点3.4单链表尾部插入3.5单链表头部插入3.6单链表的尾部删除3.7单链表头部删除3.8查找3.9在指定位置之前插入数据3.10在指定位置之后插入数据3.11删除pos…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理

Java httpclient请求form-data格式,并设置boundary代码实现

文章目录 form-data 数据请求格式样例报错信息: **MissingServletRequestParameterException**解决方法报错信息: **no multipart boundary was found** 解决方法Java代码实现【错误】使用 UrlEncodedFormEntity 、BasicNameValuePair 请求失败&#xff08;error&#xff09;【…

【计算机毕业设计】850汽车售后服务信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

《Windows API每日一练》20.1 动态链接库

本节将介绍如何编写动态链接库&#xff0c;并更全面地探讨动态链接库的使用方法&#xff0c;包括以不同的方法装入动态链接库和以不同的方法调用其中的函数等。 本节必须掌握的知识点&#xff1a; 动态链接库的概念 第157练&#xff1a;编写动态链接库DLL 第158练&#xff1a;…

Java从入门到精通(十二)~ 动态代理

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 主要作用和功能&#xff1a; 应用场景&#xff1a; 二、代理概念 1.静态代理 2.动态代理 2.1 概念介绍 …

MSPM0G3507将系统时钟改为80M

这款板卡手册上写着最高80M的主频&#xff0c;不过要达到80M需要自己配置时钟树分频倍频。 第一步&#xff1a;打开SysConfig工具&#xff0c;那个方框原本是没有勾选的&#xff0c;这里我们把它勾选 第二步&#xff1a; 点击时钟树配置 第三步&#xff1a; 主要是改变这几个…

nodejs - MongoDB 学习笔记

一、简介 1、MongoDB 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 2、数据看是什么 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的应用程序。 3、数据库的作用 主要作用是 管理数据…

docker命令大全(新手必备)-my write

一、命令图谱 二、基本命令 docker version #显示版本信息 docker info #显示系统信息,包括镜像、容器数量 docker 命令 --help #帮助 三、镜像命令 3.1 docker images 查看本地主机上的镜像 docker images [OPTIONS] [REPOSITORY[:TAG]] 选项:-a …

【JavaEE初阶】Thread类及常见方法

目录 &#x1f4d5; Thread类的概念 &#x1f4d5; Thread 的常见构造方法 &#x1f4d5; Thread 的几个常见属性 &#x1f4d5; start()-启动一个线程 &#x1f4d5; 中断一个线程 &#x1f6a9; 实例一 &#x1f6a9; 实例二 &#x1f6a9; 实例三 &#x1f4d5; jo…

Pytorch深度学习实践(8)多分类任务

多分类问题 多分类问题主要是利用了Softmax分类器&#xff0c;数据集采用MNIST手写数据集 设计方法&#xff1a; 把每一个类别看成一个二分类的问题&#xff0c;分别输出10个概率 但是这种方法存在一种问题&#xff1a;不存在抑制问题&#xff0c;即按照常规来讲&#xff0c…