這很重要
從 Windows 11 版本 22H2 的 WDK 開始,不再支援 WDF 可轉散發共同安裝程式。 若要了解如何因應此變更,請參閱 WDK 已知問題文章中的「WDF 可轉散發共同安裝程式無法運作」。
USB 裝置廠商會使用共同安裝程式來更新使用收件匣 USB 設備驅動器之裝置的裝置韌體。 不過,新的「通用 INF」標準不支援共用安裝程式,而這是 Windows 10 的要求。 這給現有的 USB 裝置韌體更新程式帶來了挑戰。 本文概述在沒有共同安裝程序的情況下更新 USB 裝置韌體的建議方法。
需求
USB 裝置韌體更新程式的主要需求如下:
無用戶互動的無縫韌體更新
可靠的復原機制(例如,避免裝置變成磚塊)
適用於 Windows 7 和更新版本
概觀
UVC 相機等USB裝置會隨現場可更新韌體一起發行。 目前沒有更新韌體的標準方法。 所有現有更新機制通用的一個專案是某些自定義軟體套件在用戶端上執行,並將韌體下載到裝置。 一般而言,在裝置安裝程式中,會安裝韌體更新軟體套件。 共同安裝程序啟動韌體更新程式。 Windows 10 上缺乏共同安裝程式,導致裝置廠商無法在現場更新這些裝置上的韌體。
建議的方法是使用 USB 裝置的低層過濾驅動程式,以啟動韌體更新過程,以規避 USB 裝置韌體更新情境中缺少共同安裝器的問題。 在 AddDevice 呼叫期間,篩選驅動程式會檢查裝置韌體版本,並視需要更新韌體。
韌體更新概觀
當 USB 裝置插入系統時,會為裝置安裝一般收件匣驅動程式。 安裝一般驅動程序之後,OS 會查詢 Windows Update 伺服器是否有任何廠商特定的驅動程式套件可用性,並下載並安裝驅動程式。 已安裝的驅動程式套件會執行韌體更新。
韌體有兩種方式可以更新:
韌體更新篩選驅動程式
- 廠商提供執行韌體更新的較低篩選驅動程式。
韌體更新設備驅動器
廠商提供的篩選驅動程式較低,可讓裝置處於韌體更新模式。
裝置會列舉為韌體更新裝置。
廠商提供的韌體更新驅動程式會針對此裝置載入,並更新韌體。
方法 1:韌體更新篩選驅動程式
在此方法中,用於 USB 裝置驅動程式的較低篩選器驅動程式會作為驅動程式更新流程的一部分進行安裝。 此篩選驅動程式會執行韌體更新。
Windows Update 伺服器上的驅動程式更新套件包含:
韌體更新 WDF 下階篩選驅動程式
用於安裝韌體更新的 WDF 下層篩選器驅動程式的擴充 INF
“firmware.bin” 檔案
安裝驅動程式更新套件時,會呼叫韌體更新 WDF 篩選器驅動程式的 AddDevice 例程。 從這個例程中,WDF 篩選驅動程式會從裝置 HW 登錄機碼取得裝置韌體版本。 裝置韌體應該使用 MSOS 描述元將韌體版本放在裝置 HW 登錄機碼上。
如果裝置韌體版本和篩選驅動程式預期的韌體版本不同,或
裝置硬體註冊表機碼中找不到韌體版本
- 然後,篩選驅動程式透過在 AddDevice 回呼傳回成功,將自己插入裝置堆疊中。
否則,篩選驅動程式不會自行插入裝置堆疊
- 因為不需要更新韌體,因為裝置具有預期的韌體。
當稍後呼叫 WDF 篩選驅動程式的 EVT_WDF_DEVICE_D0_ENTRY 回呼時,篩選驅動程式必須使用 CM_Register_Notification 或 IoRegisterPlugPlayNotification(UMDF 或 KMDF)註冊,以監聽 USB 裝置所註冊的裝置介面類別變更通知。 舉例來說,RGB 相機的韌體更新篩選驅動程式會註冊 KSCATEGORY_VIDEO_CAMERA。 在收到通知時,篩選驅動程式應該張貼會執行韌體更新的工作專案。
UMDF 型韌體更新驅動程式可以使用裝置特定的 API,或直接發出控制傳輸來存取 USB 裝置以執行韌體更新。 例如,相機的 UMDF 型篩選驅動程式會使用相機 API 來執行韌體更新。
KMDF 型韌體更新驅動程式可以傳送廠商特定的命令來執行韌體更新。
完成更新韌體後,裝置必須中斷連線並重新連線到總線。 裝置以新的韌體重新識別。
建議對具有足夠資源可在裝置記憶體中保存兩個完整韌體映像(更新映像和備份映像)的裝置使用「韌體更新篩選驅動程式」。 原因是如果在下載更新的韌體時遇到失敗,裝置可以放棄更新並恢復原始韌體開機。 因此,不要磚化裝置。
方法 2:韌體更新設備驅動器
在此方法中,會安裝一個 USB 裝置的低階篩選驅動程式,作為驅動程式更新過程的一部分。 此篩選驅動程式會將命令傳送至裝置,以在韌體更新模式中重新啟動,其中裝置會公開韌體更新介面。 韌體更新介面的驅動程式會載入並執行韌體更新。
裝置之 Windows Update 伺服器上的驅動程式更新套件包含:
將裝置置於韌體更新模式的 WDF 較低篩選器驅動程式
安裝 WDF 下層篩選驅動程式的擴充功能 INF
除了驅動程式更新套件之外,Windows Update 上還有個別的韌體更新設備驅動器套件,其中包含:
WDF 韌體更新設備驅動程式及其 INF 文件
“firmware.bin” 檔案。
安裝驅動程式更新套件時,會呼叫 WDF 較低的篩選驅動程式 AddDevice 例程。 在此例程中,篩選驅動程式會從裝置 HW 登錄機碼查詢裝置韌體版本。 裝置韌體會利用 MSOS 描述元或 USB 裝置擴充功能 INF,將「韌體版本」放在裝置 HW 註冊機碼上。
如果裝置韌體版本和篩選驅動程式預期的韌體版本不同或
裝置 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"