共用方式為


使用 Windows Update 更新裝置韌體

本文說明如何使用 Windows Update (WU) 服務來更新卸載式或底座內裝置的韌體。 如需更新系統韌體的相關信息,請參閱 Windows UEFI 韌體更新平臺

若要使用 Windows Update 更新裝置韌體,請提供包含韌體承載的裝置驅動程式。 如果您為裝置提供函式驅動程式,您可以將韌體更新邏輯和承載新增至現有的驅動程式,也可以提供個別的韌體更新驅動程式套件。 如果您的裝置使用Microsoft提供的驅動程式,您必須提供個別的韌體更新驅動程式套件。 在這兩種情況下,韌體更新驅動程式套件必須是通用。

如需通用驅動程式的詳細資訊,請參閱 使用通用 INF 檔案。 驅動程式二進位檔可以使用 KMDFUMDF 2Windows 驅動程式模型

因為 WU 無法執行軟體,因此韌體更新驅動程式必須將韌體交給隨插即用 (PnP) 進行安裝。

韌體更新驅動程序動作

韌體更新驅動程式通常是實作下列程式的輕量型設備驅動器:

  • 在裝置啟動時,或在驅動程式 的EVT_WDF_DRIVER_DEVICE_ADD 回呼函式中:

    1. 識別驅動程式所連結的裝置。
    2. 判斷驅動程式的韌體版本是否比目前在裝置硬體上閃爍的韌體版本還新。
    3. 如果需要韌體更新,請設定事件定時器來排程更新。
    4. 否則,請勿執行任何動作,直到驅動程式再次啟動為止。
  • 在系統執行時間期間:

    1. 如果更新已排入佇列,請等候滿足一組條件。
    2. 符合條件時,請在裝置上執行韌體更新。

韌體更新驅動程序內容

韌體更新驅動程式套件通常包含下列專案:

  • 通用驅動程式 INF
  • 驅動程序目錄
  • 函式驅動程式 (.sys 或 .dll)
  • 韌體更新承載二進位檔

將韌體更新套件作為獨立的驅動程式提交項目提交。

將韌體更新邏輯新增至廠商提供的驅動程式

現有的函式驅動程式可以實作韌體更新機制,如下圖所示:

使用 Windows Update 透過現有的函式驅動程式傳遞韌體更新。

或者,如果您想要個別更新函式驅動程式和韌體更新驅動程式,請建立第二個裝置節點,以安裝韌體更新驅動程式。 下圖顯示一個裝置如何有兩個不同的裝置節點:

使用 Windows Update 透過個別裝置節點傳遞韌體更新。

函式和韌體裝置節點必須有不同的硬體標識碼,才能獨立設定目標。

有幾種方式可以建立第二個裝置節點。 某些裝置類型能夠在一個實體裝置上公開第二個裝置節點,例如USB。 您可以使用這項功能來建立可由WU設為目標的裝置節點,並在其上安裝韌體更新驅動程式。 不過,許多裝置類型不允許單一實體裝置列舉多個裝置節點。

在此情況下,請使用指定 AddComponent 指示詞的擴充 INF 來建立以 Windows Update 為目標的裝置節點,並在其上安裝韌體更新驅動程式。 INF 檔案中的下列代碼段示範如何執行此動作:

[Manufacturer]
%Contoso%=Standard,NTamd64
[Standard.NTamd64]
%DeviceName%=Device_Install, PCI\DEVICE_ID
[Device_Install.Components]
AddComponent=ComponentName,,AddComponentSection
[AddComponentSection]
ComponentIDs = ComponentDeviceId

在 INF 範例中, ComponentIDs = ComponentDeviceId 表示子裝置的硬體識別碼 SWC\ComponentDeviceId為 。 安裝時,此 INF 會建立下列裝置階層:

父裝置、主要裝置、AddComponent 裝置。

針對未來的韌體更新,請更新包含韌體承載的 INF 和二進位檔。

將韌體更新邏輯新增至Microsoft提供的驅動程式

若要更新使用Microsoft提供驅動程式之裝置的韌體,請建立第二個裝置節點,如下所示。

最佳做法

  • 在您的韌體更新驅動程式 INF 中,指定 DIRID 13 ,讓 PnP 在 DriverStore 的驅動程式套件中保留檔案:

    [Firmware_AddReg]
    ; Store location of firmware payload
    HKR,,FirmwareFilename,,"%13%\firmware_payload.bin"
    

    PnP 會在安裝裝置時解析此位置。 驅動程式接著可以開啟此登錄機碼,以判斷承載的位置。

  • 韌體更新驅動程式會指定下列 INF 條目:

    Class=Firmware
    ClassGuid={f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
    
  • 若要找出另一個裝置節點,韌體驅動程序應該以相對於本身的方式走裝置樹狀結構,而不是列舉符合的所有裝置節點。 使用者可能已插入裝置的多個實例,而韌體驅動程序應該只更新其相關聯的裝置。 一般而言,要找到的裝置節點是安裝韌體驅動程式之裝置節點的父節點或同層級節點。 例如,在具有兩個裝置節點的圖表中,韌體更新驅動程式可以尋找同層級裝置來尋找函式驅動程式。 在下一個圖表中,韌體驅動程式可以尋找父裝置,以尋找它需要通訊的主要裝置。

  • 驅動程式應該對系統上的多個裝置實例具有強固性,可能具有多個不同的韌體版本。 例如,可能有一個裝置實例已連線並更新數次。 一個全新的裝置可能會被接入,但其韌體版本是較舊的。 這表示狀態(例如目前的版本)必須儲存在裝置上,而不是儲存在全域位置。

  • 例如,如果有更新韌體的現有方法(例如 EXE 或共同安裝程式),您基本上可以在 UMDF 驅動程式內重複使用更新程式代碼。