共用方式為


使用 Windows Update 更新裝置韌體

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

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

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

因為 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 驅動程式內重複使用更新程式代碼。