Windows UEFI ファームウェア更新プラットフォームの機能の検証

このドキュメントでは、Windows UEFI ファームウェア更新プラットフォーム機能でサインオフする前に合格する必要がある基本的な検証シナリオを示します。

前提条件

  • EFI システム リソース テーブル (ESRT) エントリごとに、最新のファームウェア バージョン用のカプセルが必要です。 これらのシナリオでは、最新バージョンを X と呼びます。ESRT の各エントリは、一意の GUID を使用して識別されます。
  • 公開されている ESRT の各エントリに対して、手順 1 で作成したパッケージのバージョンをインクリメントしたカプセル パッケージを作成します。 これらのカプセルは X + 1 と呼ばれます。
  • ペイロードが署名されていない、または無効な PK で署名されているなどのエラー条件をシミュレートするのに役立つカプセルであることを確認します。
  • 使用するすべてのカプセルが、OS の観点から適切に署名されていること、カタログ署名されていること、ファームウェア署名されていること、PK 署名されていることを確認します。 ただし、ネガティブな PK 署名のケースを特別にテストする場合は除きます。 カプセルまたはファームウェアドライバーパッケージに署名する方法の詳細については、仕様の 「ファームウェアドライバーパッケージの署名」 を参照してください。

操作方法

新しいカプセルをインストールするか、以前にインストールしたカプセルを再インストールする

  1. デバイス マネージャーを開きます。
  2. ファームウェアを表すデバイスノードを見つけます。通常は、 「ファームウェア」 デバイスの下にあります。
  3. 更新するファームウェア デバイスを右クリックします。
  4. [ドライバー ソフトウェアの更新] を選択します。 「ドライバーソフトウェアの更新-<ファームウェア>」 というポップアップが表示されます。
  5. [コンピューターでドライバー ソフトウェアを参照します] を選択します。
  6. 次のウィンドウで、[コンピューター上のデバイス ドライバーの一覧から選択します] を選択します。
  7. ドライバーが既にインストールされている場合は、[互換性のあるハードウェアを表示] ボックスから選択します。 存在しない場合は、[ディスク使用] を選択し、続行します。 それ以外の場合は、[OK] を選択し、システムを再起動します。
  8. [ディスク使用] を選択した場合は、[ディスクからインストールする] とラベル付けされたポップアップが表示されます。
  9. [参照] を使用して、インストールするファームウェアのカプセルがあるディレクトリに移動します。
  10. そのディレクトリ内の INF ファイルを選択し、[OK] を押してインストールします。
  11. インストール中に、ドライバーが署名されていないというポップアップが表示された場合は、次に進み、このドライバーを使用することに同意してください。
  12. 再起動を求めるメッセージが表示されます。
  13. ファームウェア用にカプセルをインストールしたら、再起動する必要があります。 複数のカプセル パッケージをインストールする場合は、カプセルがすべてインストールされるまで再起動を保留し、最後のカプセルがインストールされたら再起動します。

バージョンと状態の詳細を照会する

スクリプトを実行するには

  1. PowerShell を管理者として実行します。
  2. Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force (これは、1 回だけ行う必要があります。)
  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: エラーが発生すると、ファームウェアの更新で、仕様で定義されている適切な状態コードが返る

状態コードは、 「ESRT最後の試行状態フィールド値」 というタイトルのテーブルの 「UEFIシステムリソーステーブルの定義」 という名前のセクションで定義されています。

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 のシステムに、サポートされているすべてのデバイスのカプセルをインストールします。 特定のデバイスの現在のファームウェアバージョンが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システムファームウェアの場合は、システムファームウェアのESRTエントリの「LowestSupportedFirmwareVersion」がX+1に設定されるように、capsule 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) スクリプト