更新プログラムの処理
ファームウェア更新パッケージが適用され、システムが再起動すると、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 のプラットフォーム ファームウェアの実装では、ファームウェアの更新ペイロードを永続的ストレージに保存して、更新プログラムをステージングしたり、復旧ロールバックをサポートしたりできます。