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

本檔列出在 Windows UEFI 韌體更新平臺功能上登出之前必須傳遞的基本驗證案例。

必要條件

  • 針對每個 EFI 系統資源資料表 (ESRT) 專案,您需要最新韌體版本的擷取套件。 這些案例會將最新版本稱為 X。每個 ESRT 專案都是使用唯一 GUID 來識別。
  • 針對公開的每個 ESRT 專案,建立其版本在步驟 1 中所建立套件上方遞增的封裝。 這些擷取器稱為 X+1。
  • 可協助模擬失敗狀況的封裝,例如承載未簽署或簽署無效 PK 的封裝。
  • 請確定從 OS 觀點、目錄簽署和韌體簽署、PK 簽署,適當簽署所有要使用的擷取套件。 除非您特別測試負面的 PK 簽署案例。 如需如何簽署擷取或韌體驅動程式套件的詳細資訊,請參閱規格中的。

作法

安裝新的擷取子,或重新安裝先前安裝的擷取器

  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 System Resource Table Definition」 的區段中,其標題為 「ESRT Last Attempt Status Field Values」。

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)

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

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

S3.4 步驟

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

S3.4 預期的結果

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

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

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

平臺所支援的每個 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) 腳本