更新プログラムの処理

ファームウェア更新パッケージが適用され、システムが再起動すると、Windows OS ローダーは、すべてのファームウェア ペイロード ファイル (この例では、firmware.bin) を物理メモリに読み込みます。 Windows OS ローダーは、各更新プログラムの対応する ESRT エントリからの情報を使用してカプセル ヘッダーを作成します。これにより、UEFI UpdateCapsule を呼び出すときに使用する GUID とフラグが記述されます。 各カプセル ヘッダーのフラグ フィールドを設定する場合、Windows OS ローダーは常に CAPSULE_FLAGS_PERSIST_ACROSS_RESET と CAPSULE_FLAGS_INITIATE_RESET を設定します。 ドライバー パッケージの INF でカプセル フラグが指定されている場合、Windows OS ローダーは、DEVICE_FIRMWARE ファームウェアの種類の CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE を追加で設定できます。 独自のカプセル フラグは INF で指定することもできます。指定すると、UEFI UpdateCapsule を呼び出すときに追加で含まれます

ESRT テーブル定義の ESRT の例と、更新ドライバー パッケージの作成におけるファームウェア リソース更新ドライバー パッケージ INF の例を参照すると、Windows OS ローダーが UpdateCapsule に渡すために作成するカプセル ヘッダーは次のようになります。

フィールド コメント
CapsuleGuid {SYSTEM_FIRMWARE} 該当する ESRT リソース エントリの FirmwareClass から。
HeaderSize ... ページ アライン firmware.bin スタートに埋め込まれます。
Flags 0x50000 全体に永続化し、開始、リセットします。
CapsuleImageSize ... カプセル ヘッダー サイズ + firmware.bin のサイズ。

この例では、ESRT テーブルで定義されている 2 つのデバイスのうち 1 つだけで、新しいファームウェア リソース更新ドライバー パッケージがインストールされていることに注意してください。 テーブル 2 の 2 番目のデバイス用にファームウェア リソース更新ドライバー パッケージが作成され、対応するファームウェア リソース デバイスにインストールされた場合、次のように 2 つ目のカプセル ヘッダーが作成されます。

フィールド コメント
CapsuleGuid {DEVICE_FIRMWARE} 該当する ESRT リソース エントリの FirmwareClass から。
HeaderSize ... ページアライン DEVICE.BIN スタートに埋め込まれます。
Flags 0x50000 システム テーブル全体に永続化し、システム テーブルを開始、リセット、および設定します。OR は、対応する ESRT リソース エントリの CapsuleFlags からの0x8010を使用します。
CapsuleImageSize ... カプセル ヘッダー サイズ + DEVICE.BIN のサイズ。

Windows OS ローダーは、保留中のすべてのファームウェア更新プログラムを読み込み、それらを記述するために必要なデータ構造を作成してから、ExitBootServices を呼び出す前に UpdateCapsule ランタイム サービスを呼び出します。

プラットフォーム ファームウェアがストレージ デバイスを含むすべてのデバイスを排他的に制御している場合、UpdateCapsule は ExitBootServices の前に呼び出されます。 UpdateCapsule のプラットフォーム ファームウェアの実装では、ファームウェアの更新ペイロードを永続的ストレージに保存して、更新プログラムをステージングしたり、復旧ロールバックをサポートしたりできます。

ESRT テーブル定義

プラグ アンド プレイ デバイス

更新プログラム ドライバー パッケージの作成

UEFI 環境からのデバイス I/O

シームレスな危機防止と回復

ファームウェア更新の状態