共用方式為


驗證 Windows UEFI 韌體更新平臺功能

本檔列出在 Windows UEFI 韌體更新平臺功能上簽署之前傳遞所需的基本驗證案例。

必要條件

  • 針對每個 EFI 系統資源表 (ESRT) 專案,您需要最新韌體版本的膠囊。 這些案例會將最新版本稱為 X。每個 ESRT 專案都是使用唯一 GUID 來識別。
  • 針對公開的每個 ESRT 專案,建立一個膠囊套件,其版本會遞增於步驟 1 中建立的套件上方。 這些膠囊將稱為 X+1。
  • 有助於模擬失敗狀況的膠囊,例如承載未簽署或簽署無效 PK 的膠囊。
  • 請確定所有要使用的膠囊都是從OS觀點、目錄簽署和韌體簽署、PK 簽署的適當簽署。 除非您特別測試負面 PK 簽署案例。 如需如何簽署膠囊或韌體驅動程式套件的詳細資訊,請參閱規格中的。
  • 請確定您的系統已系結至PCR7。 如果您的系統已啟用 Bitlocker,但未繫結至PCR7,則會封鎖 UEFI 膠囊更新。 您可以確認 MSinfo32 的系統摘要是否系結了PCR7 組態。

作法

安裝新的膠囊或重新安裝先前安裝的膠囊

  1. 開啟設備管理員。
  2. 尋找代表韌體的裝置節點,通常是在「韌體」裝置底下。
  3. 以滑鼠右鍵按下您想要更新的韌體裝置。
  4. 選取 [ 更新驅動程序軟體]。 您會收到一個彈出視窗,指出「更新驅動程式軟體 - <韌體>」。
  5. 選取 [ 瀏覽我的計算機以取得驅動程序軟體]。
  6. 在下一個視窗中,選取 [讓我從計算機上的設備驅動器列表中挑選]。
  7. 如果之前已安裝驅動程式,請從 [顯示相容的硬體 ] 方塊中選取它。 如果不存在,請選取 [ 讓磁盘 繼續]。 否則,請選取 [ 確定 ] 並重新啟動系統。
  8. 如果您選取 [擁有磁碟],您將會收到標示為 [從磁碟安裝] 的快顯。
  9. 使用 [瀏覽 ] 移至具有所要安裝韌體膠囊的目錄。
  10. 選取該目錄中的 INF 檔案,然後按 [確定 ] 進行安裝。
  11. 在安裝期間,如果您收到顯示驅動程式未簽署的快顯,請繼續接受此驅動程式。
  12. 系統會要求您重新啟動。
  13. 安裝韌體膠囊之後,您必須重新啟動。 如果您想要安裝多個膠囊套件,請等候重新啟動,直到安裝所有膠囊,然後在最後一個膠囊上重新啟動。

查詢版本和狀態詳細數據

執行腳本

  1. 以系統管理員身分執行 PowerShell。
  2. Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force (這只需要完成一次。
  3. 顯示指定 GUID 的版本和狀態詳細數據。 例如:.\QueryVersionAndStatus.ps1 6bd2efb9-23ab-4b4c-bc37-016517413e9a
  4. 檢查韌體更新是否成功:請參閱規格檔中的一節。 請確定 [上次嘗試狀態] 和 [目前版本] 符合預期的版本。
  5. 建議:檢查以確定您正在更新的裝置仍然正常運作。
  6. 設定回復原則:某些案例可能需要回復韌體。 復原不是生產案例。 若要能夠復原,必須建立登錄原則機碼。 在節點HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{<GUID>} 下建立名稱為 “Policy” 的REG_DWORD密鑰,並將原則密鑰的值設定為 1。 請注意,GUID 應該取代為來自 ESRT 的實際 GUID。

案例

S1:每個 ESRT 專案都可透過膠囊成功更新

針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。

S1 步驟

  1. 針對每個 ESRT 專案,安裝適用於韌體版本 X 的膠囊。
  2. 在重新啟動之前,請確定已安裝上述所有膠囊。

S1 預期的結果

每個已更新的 ESRT 專案,韌體更新都應該成功。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X
  • 上次嘗試狀態 = 0 (STATUS_SUCCESS)

S2:最新的韌體版本 X 也可更新為 X+1

針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。

S2 步驟

  1. 完成上述案例 S1。
  2. 針對每個 ESRT 專案,安裝適用於韌體版本 X+1 的膠囊。

S2 預期的結果

每個已更新的 ESRT 專案,韌體更新都應該成功。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X+1
  • 上次嘗試版本 = X+1
  • 上次嘗試狀態 = 0 (STATUS_SUCCESS)

S3:失敗時,韌體更新會傳回規格中所定義的正確狀態代碼

狀態代碼定義於名為 「UEFI 系統資源數據表定義」 的區段中,其標題為 「ESRT 上次嘗試狀態域值」。

S3.1 電池不足和 UEFI 系統韌體更新不足

S3.1 步驟

  1. 將電池電量耗盡到小於 25%,然後插入 AC 電源。
  2. 安裝 UEFI 系統韌體版本 X+1 的膠囊。 假設目前的版本是 X。
  3. 重新啟動之前,請確定電池電量小於 25%

S3.1 預期的結果

韌體更新應該會失敗。 針對對應至系統韌體的ESRT專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X+1
  • 上次嘗試狀態 = 0xc00002de (STATUS_INSUFFICIENT_POWER)

S3.2 電池和裝置韌體更新不足

S3.2 步驟

  1. 將電池電量耗盡到小於 25%,然後插入 AC 電源。
  2. 在具有韌體版本 X+1 的系統中,安裝 ALL 支援的裝置的膠囊。 假設指定裝置的目前韌體版本為 X。
  3. 重新啟動之前,請確定電池電量小於 25%。

S3.2 預期的結果

韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X+1
  • 上次嘗試狀態 = 0xc00002de (STATUS_INSUFFICIENT_POWER)

S3.3 電池不足、UEFI 系統和裝置韌體同時更新

S3.3 步驟

  1. 將電池電量耗盡到小於 25%,然後插入 AC 電源。
  2. 安裝 UEFI 系統韌體和所有裝置韌體版本 X+1 的膠囊。
  3. 重新啟動之前,請確定電池電量小於 25%。

S3.3 預期結果

系統韌體和嘗試更新的所有裝置韌體,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X+1
  • 上次嘗試狀態 = 0xc00002de (STATUS_INSUFFICIENT_POWER)

當膠囊未簽署 PK 時,S3.4 韌體更新應該會失敗

針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。

S3.4 步驟

  1. 針對每個ESRT專案,建立一個膠囊 X+2,該承載未簽署。
  2. 安裝膠囊 X+2。 假設目前的版本是 X。

S3.4 預期結果

嘗試更新的所有 ESRT 專案,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X+2
  • 上次嘗試狀態 = 0xC0000022 (STATUS_ACCESS_DENIED)

使用錯誤的 PK 憑證簽署膠囊時,S3.5 韌體更新應該會失敗

針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。

S3.5 步驟

  1. 針對每個 ESRT 專案,建立一個膠囊 X+2,使用錯誤的密鑰或憑證簽署承載(例如,在生產裝置上使用偵錯簽署的膠囊)。
  2. 安裝膠囊 X+2。 假設目前的版本是 X。

S3.5 預期結果

嘗試更新的所有 ESRT 專案,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X+2
  • 上次嘗試狀態 = 0xC0000022 (STATUS_ACCESS_DENIED)

當膠囊承載遭到竄改時,S3.6 韌體更新應該會失敗

針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。

S3.6 步驟

  1. 針對每個 ESRT 專案,建立膠囊 X+2,使用正確的密鑰或憑證簽署承載。 然後開啟韌體 bin 檔案,並翻轉檔案中的 1 或多個位,並將檔案儲存回來。
  2. 重新產生 bin 檔案和 INF 檔案的目錄。
  3. 安裝膠囊 X+2。 假設目前的版本是 X。

S3.6 預期結果

嘗試更新的所有 ESRT 專案,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:

  • 目前的韌體版本 = X
  • 上次嘗試版本 = X+2
  • 上次嘗試狀態 = 0xC0000022 (STATUS_ACCESS_DENIED) 或 0xC000007B (STATUS_INVALID_IMAGE_FORMAT)

S3.7:韌體不允許復原超過 LowestSupportedFirmwareVersion

對於其他裝置韌體,也應該執行下列步驟(優先順序較低)。

S3.7 步驟

  1. 針對 UEFI 系統韌體,請建立膠囊 X+1,使系統韌體之 ESRT 專案中的 “LowestSupportedFirmwareVersion” 設定為 X+1。
  2. 安裝膠囊 X+1,並確定更新成功。
  3. 建立 UEFI 系統韌體更新膠囊,讓 INF 中的版本是 X+2,但實際的韌體二進位檔是版本 X。
  4. 安裝膠囊 X+2 並重新啟動系統。

S3.7 預期結果

韌體更新應該會失敗。 針對對應至系統韌體的ESRT專案,請驗證:

  • 目前的韌體版本 = X+1
  • 上次嘗試版本 = X+2
  • 上次嘗試狀態 = 0xC0000059 (STATUS_REVISION_MISMATCH)

S4:無縫復原和韌體更新(如果已實作)

此案例會根據無縫復原的實作,從平臺到平臺而有所不同。 根據實作,驗證可能需要建立不正確的膠囊,以強制系統在更新期間復原或中斷電源,或透過任何其他方法來執行復原流程。

S4 預期結果

系統應該開機進入OS,且韌體更新應標示為失敗。 UEFI 韌體資源裝置所報告的版本不應該變更。

S5:韌體更新遵守用戶體驗 (UX) 需求

S5 步驟

  • 在執行上述任何導致韌體更新成功的案例時,可以驗證此案例。

S5 預期的結果

用戶體驗符合規格,請參閱一節。

  • 畫面上顯示的唯一文字是「請稍候,我們安裝系統更新」。 文字會顯示在畫面的右側協調處,如規格中所述。
  • OEM 標誌會顯示為規格中所述。

Windows UEFI 韌體更新平臺

UEFI 驗證選項 ROM 驗證指引

QueryVersionAndStatus.ps1 PowerShell (PS) 腳本