重要
从 WDK for Windows 11 版本 22H2 开始,不再支持 WDF 可再发行的辅助安装程序。 要了解如何解决此更改,请参阅 WDK 已知问题文章中的 WDF 可再发行组件辅助安装程序不起作用。
USB 设备供应商使用共同安装程序为使用收件箱 USB 设备驱动程序的设备更新设备固件。 但是,新的“通用 INF”标准不支持共同安装程序,这是 Windows 10 上的要求。 这给现有的 USB 设备固件更新过程带来了挑战。 本文概述了在没有共同安装程序的情况下更新 USB 设备固件的建议方法。
要求
USB 设备固件更新过程的主要要求包括:
无缝固件更新,无需用户交互
可靠的恢复机制(例如,不会导致设备变砖)
适用于 Windows 7 及更高版本
概述
UVC 相机等 USB 设备发布时配有可现场更新的固件。 目前没有更新固件的标准方法。 所有现有更新机制通用的一项是,某些自定义软件套件在客户端上运行,并将固件下载到设备。 通常,作为设备安装过程的一部分,将安装固件更新软件套件。 共同安装程序启动固件更新过程。 Windows 10 上没有共同安装程序会阻止设备供应商在现场更新这些设备上的固件。
为解决 USB 设备固件更新中没有共同安装程序的问题,建议使用一个低级过滤驱动程序来触发固件更新过程。 在 AddDevice 调用期间,筛选器驱动程序会检查设备固件版本,并在必要时更新固件。
固件更新概述
将 USB 设备插入系统后,将为设备安装通用收件箱驱动程序。 安装通用驱动程序后,OS 会查询 Windows 更新服务器以获取任何供应商特定的驱动程序包可用性,并下载并安装驱动程序。 已安装的驱动程序包执行固件更新。
可通过两种方式更新固件:
固件更新筛选器驱动程序
- 供应商提供用于执行固件更新的低级过滤器驱动程序。
固件更新设备驱动程序
供应商提供了较低的筛选器驱动程序,使设备处于固件更新模式。
设备被识别为固件更新设备。
供应商提供的固件更新驱动程序会加载到该设备上并更新固件。
方法 1:固件更新筛选器驱动程序
在这种方法中,USB 设备驱动程序的低级过滤驱动程序在驱动程序更新过程中安装。 此筛选器驱动程序执行固件更新。
Windows 更新服务器上的驱动程序更新包包含:
固件更新用于 WDF 下层过滤驱动程序
用于安装固件更新 WDF 较低筛选器驱动程序的扩展 INF
“firmware.bin”文件
安装驱动程序更新包时,将调用固件更新 WDF 筛选器驱动程序的 AddDevice 例程。 在此例程中,WDF 筛选器驱动程序从设备 HW 注册表项获取设备固件版本。 设备固件应使用 MSOS 描述符将固件版本放置在设备 HW 注册表项上。
如果设备固件版本和筛选器驱动程序预期的固件版本不同,或者
设备 HW 注册表项中不提供固件版本
- 然后,筛选器驱动程序通过将成功返回到 AddDevice 回调,将自身插入到设备堆栈中。
否则,筛选器驱动程序不会将自身插入到设备堆栈中
- 由于无需更新固件,因为设备具有预期的固件。
稍后调用 WDF 筛选器驱动程序的 EVT_WDF_DEVICE_D0_ENTRY 回调时,筛选器驱动程序必须使用 CM_Register_Notification 或 IoRegisterPlugPlayNotification(UMDF 或 KMDF)注册设备接口更改通知,以监视 USB 设备注册到的设备接口类。 Ror 示例,RGB 相机的固件更新筛选器驱动程序将注册KSCATEGORY_VIDEO_CAMERA。 收到通知时,筛选器驱动程序应发布将执行固件更新的工作项。
基于 UMDF 的固件更新驱动程序可以使用特定于设备的 API 或直接发出控制传输来访问 USB 设备以执行固件更新。 例如,相机的基于 UMDF 的筛选器驱动程序将使用相机 API 来执行固件更新。
基于 KMDF 的固件更新驱动程序可以发送供应商特定的命令来执行固件更新。
固件刷写完成后,设备必须断开连接并重新连接到总线。 设备已使用新的固件重新枚举。
对于具有足够资源的设备,建议使用“固件更新筛选器驱动程序”的方法在设备内存中保存两个完整的固件映像(更新映像和备份映像)。 原因是,如果下载更新固件时发生故障,设备可以终止更新并重启到其原始固件。 因此,不要使设备变砖。
方法 2:固件更新设备驱动程序
在此方法中,在驱动程序更新过程中安装一个用于 USB 设备的下层筛选驱动程序。 此筛选器驱动程序将命令发送到设备以在固件更新模式下重启,其中设备公开固件更新接口。 固件更新接口的驱动程序加载并执行固件更新。
设备的 Windows 更新服务器上的驱动程序更新包包含:
将设备置于固件升级模式的 WDF 底层筛选驱动程序
用于安装 WDF 下层过滤器驱动程序的扩展 INF
除了驱动程序更新包,Windows 更新中还存在单独的固件更新设备驱动程序包,其中包含:
WDF 固件更新设备驱动程序和其 INF 文件,以及
“firmware.bin”文件。
安装驱动程序更新包时,将调用 WDF 低级筛选器驱动程序的添加设备函数。 在此例程中,筛选器驱动程序从设备硬件注册表项中查询设备固件版本。 设备固件使用 MSOS 描述符或 USB 设备的扩展 INF,将“固件版本”放置在设备硬件注册表项上。
如果设备固件版本和筛选器驱动程序预期的固件版本不同或
设备 HW 注册表项中不提供固件版本
然后,WDF 筛选器驱动程序将自身插入到设备堆栈中。
否则,WDF 筛选器驱动程序不会将自身插入到设备堆栈中
当稍后调用 WDF 筛选器驱动程序 的EVT_WDF_DEVICE_D0_ENTRY 回调时,筛选器驱动程序会向设备发出特定于供应商的命令,该命令将其置于固件更新模式。 设备断开连接并重新连接,公开固件更新接口。
系统枚举设备的固件更新接口。 供应商提供的自定义固件更新 WDF 驱动程序将在固件更新包中被加载,用于此固件更新接口。 此驱动程序更新固件。
在稍后某个时刻调用 WDF 固件更新驱动程序的 EVT_WDF_DEVICE_D0_ENTRY 回调时,驱动程序必须发布一个工作项来执行固件更新。
固件刷写完成后,设备必须断开连接并重新连接到总线。 设备已使用新的固件重新枚举。
对于由于设备上的内存不足而无法保存更新和原始固件映像的设备,建议使用此方法。 原因是下载更新固件期间出现故障,设备可以放弃更新,并再次启动设备固件更新模式,并重试固件更新。 因此,不要使设备变砖。
恢复
固件更新过程可能会因各种原因而失败。 如果发生这种情况,当再次枚举设备时,固件更新驱动程序可能会再次尝试更新固件,并且可能会再次失败,并且此更新过程最终可能会循环。 固件更新驱动程序必须对可以执行的重试次数施加上限。 当固件更新重试超过阈值(例如,三次重试),则筛选器驱动程序不应尝试再次更新固件,直到从 WU 下载新版本的驱动程序。 固件更新驱动程序可以使用注册表来保留重试状态。
在设备固件更新结束时,我们建议设备重置自身并重新枚举。
固件更新的这两种方法都必须停止设备功能,然后才能执行固件更新。 这可确保设备没有未关闭的句柄,并避免任何操作系统重启的要求。
示例 INF
;==============================================================================
; Microsoft Extension INF for USB Camera Firmware Update UMDF Filter Driver
; Copyright (C) Microsoft Corporation. All rights reserved.
;==============================================================================
[Version]
Signature="$WINDOWS NT$"
Class=Extension
ClassGUID={e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider=%CONTOSO%
ExtensionId={BC6EE554-271C-48C8-B713-8078833962BD} ; replace with your own GUID
CatalogFile.NT=SampleExtension.cat
DriverVer=08/28/2017,10.0.1700.000
PnpLockdown=1
[SourceDisksFiles]
ContosoFirmwareUpdateFilterDriver.dll=1
ContosoFirmware.bin=1
[SourceDisksNames]
1 = %MediaDescription%
[DestinationDirs]
UMDriverCopy=13
ContosoFirmwareCopy=13
DefaultDestDir = 13
[UMDriverCopy]
ContosoFirmwareUpdateFilterDriver.dll
[ContosoFirmwareCopy]
ContosoFirmware.bin
[Manufacturer]
%CONTOSO% = ContosoFirmwareUpdateFilterDriver,NTamd64.10.0...22000
[ContosoFirmwareUpdateFilterDriver.NTamd64.10.0...22000]
; replace with your camera device VID PID
%ContosoCamera.DeviceDesc% = ContosoFirmwareUpdateFilterDriver_Win11Install, USB\VID_1234&PID_1234&REV_1234
[ContosoFirmwareUpdateFilterDriver_Win11Install]
Include=wudfrd.inf
Needs=wudfrd.NT
CopyFiles=UMDriverCopy, ContosoFirmwareCopy
[ContosoFirmwareUpdateFilterDriver_Win11Install.HW]
Include=wudfrd.inf
Needs=wudfrd.NT.HW
[ContosoFirmwareUpdateFilterDriver.AddReg]
; Load the redirector as an lower filter on this specific device.
; 0x00010008 - FLG_ADDREG_TYPE_MULTI_SZ | FLG_ADDREG_APPEND
HKR,,"LowerFilters",0x00010008,"WUDFRd"
[ContosoFirmwareUpdateFilterDriver_Win11Install.Services]
Include=wudfrd.inf
Needs=WUDFRD.NT.Services
[ContosoFirmwareUpdateFilterDriver_Win11Install.Wdf]
UmdfService=ContosoFirmwareUpdateFilterDriver, ContosoFirmwareUpdateFilterDriver.UmdfFilter
UmdfServiceOrder=ContosoFirmwareUpdateFilterDriver
[ContosoFirmwareUpdateFilterDriver.UmdfFilter]
UmdfLibraryVersion=2.0.0
ServiceBinary= "%13%\ContosoFirmwareUpdateFilterDriver.dll"
[Strings]
CONTOSO = "Contoso Inc."
ContosoCamera.DeviceDesc = "Contoso Camera Extension"
MediaDescription="Contoso Camera Firmware Update Filter Driver Installation Media"
WudfRdDisplayName = "WDF Reflector Driver"