裝置韌體更新 適用於不使用共同安裝程式的USB裝置
重要
從 Windows 11 版本 22H2 的 WDK 開始,不再支援 WDF 可轉散發共同安裝程式。 若要瞭解如何解決此問題,請參閱 WDF 可轉散發共同安裝程式無法在 WDK 已知問題一文中運作。
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 登錄機碼上。
如果裝置韌體版本和篩選驅動程式預期的韌體版本不同,或
裝置 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 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"