本檔列出在 Windows UEFI 韌體更新平臺功能上簽署之前傳遞所需的基本驗證案例。
必要條件
- 針對每個 EFI 系統資源表 (ESRT) 專案,您需要最新韌體版本的膠囊。 這些案例會將最新版本稱為 X。每個 ESRT 專案都是使用唯一 GUID 來識別。
- 針對公開的每個 ESRT 專案,建立一個膠囊套件,其版本會遞增於步驟 1 中建立的套件上方。 這些膠囊將稱為 X+1。
- 有助於模擬失敗狀況的膠囊,例如承載未簽署或簽署無效 PK 的膠囊。
- 請確定所有要使用的膠囊都是從OS觀點、目錄簽署和韌體簽署、PK 簽署的適當簽署。 除非您特別測試負面 PK 簽署案例。 如需如何簽署膠囊或韌體驅動程式套件的詳細資訊,請參閱規格中的。
- 請確定您的系統已系結至PCR7。 如果您的系統已啟用 Bitlocker,但未繫結至PCR7,則會封鎖 UEFI 膠囊更新。 您可以確認 MSinfo32 的系統摘要中是否系結了PCR7 組態。
作法
安裝新的膠囊或重新安裝先前安裝的膠囊
- 開啟設備管理員。
- 尋找代表韌體的裝置節點,通常是在「韌體」裝置底下。
- 以滑鼠右鍵按下您想要更新的韌體裝置。
- 選取 [ 更新驅動程序軟體]。 您會收到一個彈出視窗,指出「更新驅動程式軟體 - <韌體>」。
- 選取 [ 瀏覽我的計算機以取得驅動程序軟體]。
- 在下一個視窗中,選取 [讓我從計算機上的設備驅動器列表中挑選]。
- 如果之前已安裝驅動程式,請從 [顯示相容的硬體 ] 方塊中選取它。 如果不存在,請選取 [ 讓磁盘 繼續]。 否則,請選取 [ 確定 ] 並重新啟動系統。
- 如果您選取 [擁有磁碟],您將會收到標示為 [從磁碟安裝] 的快顯。
- 使用 [瀏覽 ] 移至具有所要安裝韌體膠囊的目錄。
- 選取該目錄中的 INF 檔案,然後按 [確定 ] 進行安裝。
- 在安裝期間,如果您收到顯示驅動程式未簽署的快顯,請繼續接受此驅動程式。
- 系統會要求您重新啟動。
- 安裝韌體膠囊之後,您必須重新啟動。 如果您想要安裝多個膠囊套件,請等候重新啟動,直到安裝所有膠囊,然後在最後一個膠囊上重新啟動。
查詢版本和狀態詳細數據
- 執行 QueryVersionAndStatus.ps1 PowerShell (PS) 腳本來查詢目前的韌體版本、上次嘗試韌體版本和上次嘗試狀態。
執行腳本
- 以系統管理員身分執行 PowerShell。
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
(這只需要完成一次。- 顯示指定 GUID 的版本和狀態詳細數據。 例如:
.\QueryVersionAndStatus.ps1 6bd2efb9-23ab-4b4c-bc37-016517413e9a
- 檢查韌體更新是否成功:請參閱規格檔中的一節。 請確定 [上次嘗試狀態] 和 [目前版本] 符合預期的版本。
- 建議:檢查以確定您正在更新的裝置仍然正常運作。
- 設定回復原則:某些案例可能需要回復韌體。 復原不是生產案例。 若要能夠復原,必須建立登錄原則機碼。 在節點HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{<GUID>} 下建立名稱為 “Policy” 的REG_DWORD密鑰,並將原則密鑰的值設定為 1。 請注意,GUID 應該取代為來自 ESRT 的實際 GUID。
案例
S1:每個 ESRT 專案都可透過膠囊成功更新
針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。
S1 步驟
- 針對每個 ESRT 專案,安裝適用於韌體版本 X 的膠囊。
- 在重新啟動之前,請確定已安裝上述所有膠囊。
S1 預期的結果
每個已更新的 ESRT 專案,韌體更新都應該成功。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X
- 上次嘗試狀態 = 0 (STATUS_SUCCESS)
S2:最新的韌體版本 X 也可更新為 X+1
針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。
S2 步驟
- 完成上述案例 S1。
- 針對每個 ESRT 專案,安裝適用於韌體版本 X+1 的膠囊。
S2 預期的結果
每個已更新的 ESRT 專案,韌體更新都應該成功。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X+1
- 上次嘗試版本 = X+1
- 上次嘗試狀態 = 0 (STATUS_SUCCESS)
S3:失敗時,韌體更新會傳回規格中所定義的正確狀態代碼
狀態代碼定義於名為 「UEFI 系統資源數據表定義」 的區段中,其標題為 「ESRT 上次嘗試狀態域值」。
S3.1 電池不足和 UEFI 系統韌體更新不足
S3.1 步驟
- 將電池電量耗盡到小於 25%,然後插入 AC 電源。
- 安裝 UEFI 系統韌體版本 X+1 的膠囊。 假設目前的版本是 X。
- 重新啟動之前,請確定電池電量小於 25%
S3.1 預期的結果
韌體更新應該會失敗。 針對對應至系統韌體的ESRT專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X+1
- 上次嘗試狀態 = 0xc00002de (STATUS_INSUFFICIENT_POWER)
S3.2 電池和裝置韌體更新不足
S3.2 步驟
- 將電池電量耗盡到小於 25%,然後插入 AC 電源。
- 在具有韌體版本 X+1 的系統中,安裝 ALL 支援的裝置的膠囊。 假設指定裝置的目前韌體版本為 X。
- 重新啟動之前,請確定電池電量小於 25%。
S3.2 預期的結果
韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X+1
- 上次嘗試狀態 = 0xc00002de (STATUS_INSUFFICIENT_POWER)
S3.3 電池不足、UEFI 系統和裝置韌體同時更新
S3.3 步驟
- 將電池電量耗盡到小於 25%,然後插入 AC 電源。
- 安裝 UEFI 系統韌體和所有裝置韌體版本 X+1 的膠囊。
- 重新啟動之前,請確定電池電量小於 25%。
S3.3 預期結果
系統韌體和嘗試更新的所有裝置韌體,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X+1
- 上次嘗試狀態 = 0xc00002de (STATUS_INSUFFICIENT_POWER)
當膠囊未簽署 PK 時,S3.4 韌體更新應該會失敗
針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。
S3.4 步驟
- 針對每個ESRT專案,建立一個膠囊 X+2,該承載未簽署。
- 安裝膠囊 X+2。 假設目前的版本是 X。
S3.4 預期結果
嘗試更新的所有 ESRT 專案,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X+2
- 上次嘗試狀態 = 0xC0000022 (STATUS_ACCESS_DENIED)
使用錯誤的 PK 憑證簽署膠囊時,S3.5 韌體更新應該會失敗
針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。
S3.5 步驟
- 針對每個 ESRT 專案,建立一個膠囊 X+2,使用錯誤的密鑰或憑證簽署承載(例如,在生產裝置上使用偵錯簽署的膠囊)。
- 安裝膠囊 X+2。 假設目前的版本是 X。
S3.5 預期結果
嘗試更新的所有 ESRT 專案,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X+2
- 上次嘗試狀態 = 0xC0000022 (STATUS_ACCESS_DENIED)
當膠囊承載遭到竄改時,S3.6 韌體更新應該會失敗
針對平臺所支援的每個ESRT專案,應該完成下列步驟。 換句話說,針對系統韌體,以及支援透過UpdateCapsule更新韌體的每個裝置韌體。
S3.6 步驟
- 針對每個 ESRT 專案,建立膠囊 X+2,使用正確的密鑰或憑證簽署承載。 然後開啟韌體 bin 檔案,並翻轉檔案中的 1 或多個位,並將檔案儲存回來。
- 重新產生 bin 檔案和 INF 檔案的目錄。
- 安裝膠囊 X+2。 假設目前的版本是 X。
S3.6 預期結果
嘗試更新的所有 ESRT 專案,韌體更新應該會失敗。 針對嘗試更新的所有 ESRT 專案,請驗證:
- 目前的韌體版本 = X
- 上次嘗試版本 = X+2
- 上次嘗試狀態 = 0xC0000022 (STATUS_ACCESS_DENIED) 或 0xC000007B (STATUS_INVALID_IMAGE_FORMAT)
S3.7:韌體不允許復原超過 LowestSupportedFirmwareVersion
對於其他裝置韌體,也應該執行下列步驟(優先順序較低)。
S3.7 步驟
- 針對 UEFI 系統韌體,請建立膠囊 X+1,使系統韌體之 ESRT 專案中的 “LowestSupportedFirmwareVersion” 設定為 X+1。
- 安裝膠囊 X+1,並確定更新成功。
- 建立 UEFI 系統韌體更新膠囊,讓 INF 中的版本是 X+2,但實際的韌體二進位檔是版本 X。
- 安裝膠囊 X+2 並重新啟動系統。
S3.7 預期結果
韌體更新應該會失敗。 針對對應至系統韌體的ESRT專案,請驗證:
- 目前的韌體版本 = X+1
- 上次嘗試版本 = X+2
- 上次嘗試狀態 = 0xC0000059 (STATUS_REVISION_MISMATCH)
S4:無縫復原和韌體更新(如果已實作)
此案例會根據無縫復原的實作,從平臺到平臺而有所不同。 根據實作,驗證可能需要建立不正確的膠囊,以強制系統在更新期間復原或中斷電源,或透過任何其他方法來執行復原流程。
S4 預期結果
系統應該開機進入OS,且韌體更新應標示為失敗。 UEFI 韌體資源裝置所報告的版本不應該變更。
S5:韌體更新遵守用戶體驗 (UX) 需求
S5 步驟
- 在執行上述任何導致韌體更新成功的案例時,可以驗證此案例。
S5 預期的結果
用戶體驗符合規格,請參閱一節。
- 畫面上顯示的唯一文字是「請稍候,我們安裝系統更新」。 文字會顯示在畫面的右側協調處,如規格中所述。
- OEM 標誌會顯示為規格中所述。