ESRT で説明されている各ファームウェア リソースの更新ペイロードをバンドルし、独自のドライバー パッケージで配布し、同じ周期で更新できない可能性がある他のファームウェア リソースの更新プログラムに関連付けることなく、独自のバージョン管理スキームを維持できるようにする必要があります。
次の例では、表 2 の ESRT の例から {SYSTEM_FIRMWARE} リソースを対象とするファームウェア リソース更新プログラムのドライバー パッケージ INF ファイル定義のサンプルを提供し、バージョン 1 からバージョン 2 に更新します。 参考のため、SYSTEM_FIRMWARE リソースに割り当てられた GUID が 6bd4efb9-23cc-4b4a-ac37-016517413e9a であると仮定します。
[Version]
Signature = "$WINDOWS NT$"
Provider = %Provider%
Class = Firmware
ClassGuid = {f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
DriverVer = 01/01/2012,2.0.0.0
CatalogFile = catalog.cat
PnpLockdown = 1
[Manufacturer]
%MfgName% = Firmware,NTarm64.10.0...17134
; Prior to Windows 10, version 1803, the above should instead be:
; %MfgName% = Firmware,NTarm64
[Firmware.NTarm64.10.0...17134]
; Prior to Windows 10, version 1803, the above should instead be:
; [Firmware.NTarm64]
%FirmwareDesc% = Firmware_Install,UEFI\RES_{6bd4efb9-23cc-4b4a-ac37-016517413e9a}
[Firmware_Install.NT]
CopyFiles = Firmware_CopyFiles
[Firmware_CopyFiles]
firmware.bin
[Firmware_Install.NT.Hw]
AddReg = Firmware_AddReg
[Firmware_AddReg]
HKR,,FirmwareId,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}
HKR,,FirmwareVersion,%REG_DWORD%,0x00000002
HKR,,FirmwareFilename,,%13%\firmware.bin
; Prior to Windows 10, version 1803, the above should instead be:
; HKR,,FirmwareFilename,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\firmware.bin
[SourceDisksNames]
1 = %DiskName%
[SourceDisksFiles]
firmware.bin = 1
[DestinationDirs]
DefaultDestDir = 13
; Prior to Windows 10, version 1803, the above should be:
; DefaultDestDir = 10,Firmware\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}
[Strings]
; localizable
Provider = "Contoso Ltd."
MfgName = "Fabrikam Inc."
FirmwareDesc = "Fabrikam System Firmware 2.0"
DiskName = "Firmware Update"
; non-localizable
REG_DWORD = 0x00010001
次のセクションを変更して、セットアップ用にカスタマイズします。
[Version]
DriverVer --> The date on which this driver package was authored and the driver version of this driver package. Driver version in this driver package must be greater than the current driver version
CatalogFile --> Name of the catalog file
firmware.bin --> Change all instances of firmware.bin with the name of the firmware image name
[Manufacturer]
%MfgName% = Firmware,NTarm64.10.0...17134
[Firmware.NTarm64.10.0...17134] --> Change the architecture.
For x86, it should be NTx86
For AMD64, it should be NTamd64
[Firmware.NTarm64.10.0...17134]
%FirmwareDesc% = Firmware_Install,UEFI\RES_{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The GUID of the firmware resource
[Firmware_AddReg]
HKR,,FirmwareId,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The GUID of the firmware resource
HKR,,FirmwareVersion,%REG_DWORD%,0x00000002 --> Version of the firmware for the update
HKR,,FirmwareFilename,,%13%\firmware.bin --> firmware.bin should be replaced with the firmware image name
; Prior to Windows 10, version 1803, the above should instead be:
HKR,,FirmwareFilename,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\firmware.bin --> The subdirectory named after the GUID of the firmware resource and the firmware image name
[DestinationDirs]
DefaultDestDir = 13 --> The full destination path as a 'run from Driver Store' binary
; Prior to Windows 10, version 1803, the above should be:
; DefaultDestDir = 10,Firmware\{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The full destination path for the firmware image file based under a subdirectory named after the GUID of the firmware resource within the %SystemRoot%\Firmware directory
[Strings]
; localizable
Modify any strings here [optional]
次の表では、上記のサンプル ドライバー パッケージ INF ファイル定義を参照するさまざまなドライバー パッケージ INF セクションとフィールドについて説明します。
| セクション/フィールド | 価値 | コメント |
|---|---|---|
| [バージョン] | ドライバー パッケージのバージョン管理情報を定義します。 | |
| プロバイダー | %Provider% = Contoso Inc. ([文字列] セクションにローカライズ) |
ファームウェア リソース更新プログラム ドライバー パッケージ全体のプロバイダー/ベンダーを識別します。 |
| クラス/ClassGuid | ファームウェア/ {f2e7dd72-6468-4e36-b6f1-6488f42c1b52} |
ドライバー パッケージの日付を指定します。 PnP デバイスのインストール システムがシステムで使用可能な最適なドライバー パッケージを正確に選択できるように、日付とバージョンの両方に、実際のファームウェア リソースの更新プログラムの日付とバージョンをできるだけ正確に反映する必要があります。 |
| CatalogFile | catalog.cat | ドライバー パッケージ INF ファイルと、関連付けられているすべてのファームウェア リソース更新バイナリに署名する、関連付けられているカタログ ファイルを指定します。 |
| PnpLockdown | 1 | 関連付けられていないアプリケーションによってインストールされたドライバー ファイルが外部で変更されないように保護するために、PnP ドライバー ファイルのロックダウン メカニズムを有効にします。 ファームウェア リソースの更新の場合、この設定は常に有効にして、PnP システムの制御外でファームウェア リソース イメージ ファイルを改ざんできないようにする必要があります。 |
| [製造元] | ファームウェア リソースの更新プログラムを定義するすべての個別のドライバー製造元/ベンダーを一覧表示します。 各製造元の行は、[<Models>] セクションを指定し、サポートされているターゲット プラットフォームを識別します。 | |
| %MfgName% | Fabrikam Inc. [Strings] セクションでローカライズ済み |
ファームウェア リソース更新プログラムの製造元/ベンダーを識別します。 これは[プロバイダー]フィールドと同じ場合があります。 |
| ファームウェア NTarm64.10.0...17134 |
ターゲット ドライバー プラットフォームを含め、このドライバー パッケージでサポートされているファームウェア リソース デバイスを定義する [<Models>] セクションを識別します。 この例では、ドライバーは Windows 10 ビルド 17134 以降の Arm64 ベース NT プラットフォームのみを対象とし、[<Models>] セクションは [Firmware.NTarm64.10.0.. です。17134]. | |
| [Firmware.NTarm64.10.0...17134] | [<Models>] セクションは、更新プログラムが定義されているすべてのファームウェア リソース デバイスを一覧表示する、Windows 10 ビルド 17134 以降の Arm64 ベース NT プラットフォームのセクションです。 各ハードウェア モデルの行では、[<DDInstall>] セクションとそれに関連付けられているハードウェア ID が一致することを指定します。 | |
| %FirmwareDesc% | Fabrikam システム ファームウェア 2.0 [文字列] セクションにローカライズ済み |
ファームウェア リソースの更新について説明します。 これは、Device Manager およびその他のデバイス関連 UI で、関連付けられているファームウェア リソース デバイス インスタンスを表示するために使用される主な説明文字列です。 このため、説明にはファームウェア ベンダーとバージョンが含まれる場合があります。 |
| ファームウェアインストール UEFI\RES_{RESOURCE_GUID} |
UEFI\RES_{RESOURCE_GUID} ハードウェア ID によって識別されるデバイス インスタンスを対象とするファームウェア リソース更新プログラムのインストール手順を含む [<DDInstall] セクションを識別します。 ここでRESOURCE_GUIDは、更新されるファームウェア リソースの GUID です。 | |
|
[Firmware_Install.NT] CopyFiles = Firmware_CopyFiles [Firmware_CopyFiles] ... |
[<DDInstall>] セクションには、ファームウェア リソースの更新のためのインストール手順が含まれています。 ファームウェア リソースの更新の場合、ファームウェア リソースの更新の場所にコピーするファームウェア リソース イメージ ファイルのみが定義されます。 この例では、[<DDInstall>] セクションは [Firmware_Install.NT] です。 | |
| firmware.bin | コピーするファームウェア リソース更新イメージ ファイルを指定します。 このファイルのコピー先の詳細については、以下の「DestinationDirs」セクションを参照してください。 | |
|
[Firmware_Install.NT.Hw] AddReg = Firmware_AddReg [Firmware_AddReg] ... |
[<DDInstall>.Hw] セクションは、ハードウェア固有のファームウェアリソース更新プログラムのインストール手順を含みます。 ファームウェア リソースの更新の場合、これにより、ターゲット デバイス インスタンスのデバイス ハードウェア キーの下に設定されるレジストリ値の形式でファームウェア リソース更新構成情報が定義されます。 | |
| FirmwareId | {RESOURCE_GUID} | ファームウェア リソース更新のファームウェア GUID。 これは、UEFI\RES_{RESOURCE_GUID} ハードウェア ID に埋め込まれているのと同じファームウェア リソース GUID であることに注意してください。ただし、PnP システムはすべてのハードウェア ID を、デバイス/ドライバーの照合の目的で厳密に使用される不透明な文字列として扱うので、ここではスタンドアロン値として指定する必要があります。 |
| ファームウェアバージョン | 0x00000002 | REG_DWORD値として指定されたファームウェア リソース更新プログラムのファームウェア バージョン。 |
| FirmwareFilename(ファームウェアファイル名) | %13%\firmware.bin | Windows 10 バージョン 1803 以降では、これは "ドライバー ストアから実行" ファイルで、例のようにバイナリへの完全なパスを指定する必要があります。 Windows 10 バージョン 1803 より前の場合、これは、ファームウェア リソース更新プログラムの Update Capsule イメージ ファイル名の相対パスとファームウェア ファイル名である必要があります。これは、{RESOURCE_GUID} が特定のファームウェア リソースを対象とするすべてのファームウェア イメージ ファイルを整理するために使用されるサブディレクトリを表す、%SystemRoot%\Firmware ディレクトリの下にあります。 たとえば、{RESOURCE_GUID}\firmware.bin。 |
| [SourceDisksNames] | ファームウェア更新リソース イメージ ファイルなど、関連付けられているドライバー ファイルが含まれている個別のドライバー パッケージ ソース ディスクの場所をすべて一覧表示します。 | |
| 1 | %DiskName% = ファームウェアの更新 [Strings] セクションにローカライズされている |
任意の番号を付けたドライバー パッケージのソース ディスク ID とその説明名を指定します。 省略可能なドライバー パッケージの相対サブディレクトリが指定されていないため、ファームウェア リソース更新イメージ ファイルなど、このディスク ID に関連付けられているドライバー ファイルは、INF ファイルのすぐ横に存在することが想定されます。 |
| [SourceDisksFiles] | ドライバー パッケージによって参照されているすべてのドライバー ファイルを一覧表示し、[SourceDisksNames] セクションからディスク ID にリンクします。 | |
| firmware.bin | 1 | firmware.bin ファームウェア リソース 更新イメージ ファイルをプライマリ ディスク ID にリンクして、ドライバー パッケージの一部として確立します。 オプションのファイル固有のサブディレクトリは指定されていないため、このドライバー ファイルは、そのディスク ID のサブディレクトリを基準にして動作することが想定されます。この場合は INF ファイルのすぐ横にあります。 |
| [DestinationDirs] | ドライバー パッケージによって参照されるすべてのドライバー ファイルのターゲットの宛先ディレクトリを一覧表示します。 | |
| DefaultDestDir | 13 | このドライバー パッケージによってコピーされるすべてのドライバー ファイルの既定の宛先ディレクトリを指定します。 Windows 10 バージョン 1803 以降では、ファイルを "ドライバー ストアから実行" するために DIRID 13 にする必要があります。 Windows 10 バージョン 1803 より前では、すべてのファイルの宛先が \Firmware の %SystemRoot%下にあることを指定するには、10,Firmware\{RESOURCE_GUID} にする必要があります。ここで、 10 (DIRID_WINDOWS) は基本 %SystemRoot% ディレクトリを表し、{RESOURCE_GUID} はファームウェア リソース GUID に基づく名前のサブディレクトリを表します。 |
| [文字列] | ドライバー パッケージ INF ファイル内のすべての間接文字列トークン (%token%) のキー/値マッピングを定義します。 文字列トークンを使用すると、ロケール固有の [Strings.< を導入することで、ドライバー パッケージ INF ファイルを簡単にローカライズできます。LanguageID>] セクション。 また、文字列トークンの置換を使用して、REG_DWORDなどの定数数値を定義する場合にも役立ちます。 | |
| プロバイダー | "Contoso Ltd" | 文字列トークンキー/値マッピングの例。 |
他のファームウェア イメージ ファイル (独自のファイルと他のファームウェア ベンダーのファイルの両方) との潜在的な競合を回避するために、ファームウェア リソースの更新イメージ ファイルのバージョンごとに一意の名前を使用することが重要です。 たとえば、ベンダー名とバージョンの制約の両方を満たすために、上記の firmware.bin に次の名前を割り当てる必要があります: Fabrikam-System-Firmware-2.0.bin。
OEM/IHV カスタマイズの目的で使用される可能性のある特定のファームウェア リソース更新イメージのバリアントが、同じ Windows システム イメージに展開されるときに競合しないようにするために、個別のファームウェア リソース更新イメージはそれぞれ 、"ドライバー ストアから実行" ファイル (Windows 10 バージョン 1803 以降) であるか、%SystemRoot%\Firmware ディレクトリ内のサブディレクトリの下に保持されることをお勧めします。 このサブディレクトリには、ターゲット ファームウェア リソース GUID の後に名前を付ける必要があります。 たとえば、次のファームウェア リソース更新イメージ パスは、デプロイの制約を満たしている: %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin。
ファームウェア ドライバー パッケージの署名をテストする
ドライバー パッケージ INF ファイルとファームウェア ペイロード バイナリの準備ができたら、カタログ ファイルを生成するためにドライバー パッケージ全体に署名する必要があります。 Windows がファームウェア リソースの更新を安全に開始できるようにするには、ドライバー パッケージに含まれる INF ファイルとファームウェア ペイロード バイナリの有効性と信頼性を保証することが、このカタログ ファイルで重要です。
テスト目的でドライバー パッケージに自己署名する手順を次に示します。 これらの手順はテスト目的でのみ使用されることに注意してください。 運用環境では、署名のために、ファームウェア更新ドライバー パッケージをパートナー センターに提出する必要があります。 運用環境用のファームウェア ドライバー パッケージに署名する手順については、「 更新プログラム パッケージの認定と署名」を参照してください。
最新の Windows SDK および Windows Driver Kit (WDK) をインストールします。
- Windows SDK には、
makecert、pvk2pfx、signtoolなどのツールがインストールされます。 - Windows Driver Kit (WDK) は、
Inf2Catなどのドライバー固有のツールをインストールします。
通常、これらのツールは Windows Kits のインストール ディレクトリにあります。次に例を示します。
%WindowsSdkDir%\bin\<version>\x86(またはx64)注
正確な SDK バージョン フォルダーと使用可能なツールのセットは、インストールされている Windows SDK/WDK コンポーネントによって異なります。
- Windows SDK には、
次のコマンドを実行して、テスト証明書を作成します。
makecert.exe -r -pe -a sha256 -eku 1.3.6.1.5.5.7.3.3 -n CN=Foo -sv fwu.pvk fwu.cer pvk2pfx.exe -pvk fwu.pvk -spc fwu.cer -pi <Password entered during makecert prompt> -spc fwu.cer -pfx fwu.pfx詳細については、「 MakeCert」を参照してください。
次のコマンドを実行して、カタログ ファイルを作成します。
Inf2Cat.exe /driver:"." /os:8_x64/driver 引数は、INF が配置されている場所を指します。 ファームウェア ドライバー パッケージの対象となる OS に応じて 、/os 引数の値を変更します。 詳細については、「 Inf2Cat」を参照してください。
セキュリティ カタログとドライバーの詳細については、「 カタログ ファイルとデジタル署名 」および 「PnP ドライバー パッケージのカタログ ファイルの作成」を参照してください。
次のコマンドを実行してカタログ ファイルに署名します。
signtool sign /fd sha256 /f fwu.pfx /p <Password entered during makecert prompt> delta.cat詳細については、「 SignTool」を参照してください。
テストシステムにテスト証明書をインストールします。
fwu.cer ファイルをダブルクリックし、[ 証明書のインストール ] オプションを選択します。
証明書のインストール中に、次のオプションを選択します。
[ストアの場所] で、[ローカルコンピューター] を選択します。
証明書ストアの場合は、 信頼されたルート証明機関を参照して選択します。
ファームウェア/BIOS オプションでセキュア ブートを無効にします。
カタログが実稼働署名されていない場合でも OS ローダーが起動時にファームウェア イメージ ファイル (firmware.bin) を読み込むことができるように、BCD オプションでテスト署名を有効にします。 管理者特権で次のコマンドを実行します。
bcdedit /set testsigning on
ドライバー パッケージに署名した後は、次のいずれかのメカニズムを使用してインストールできます。
デバイス マネージャー。 手動テストの場合、デバイス マネージャーには、ファームウェア リソース デバイスを検索し、そのドライバーを更新してファームウェア リソースの更新を開始するためのわかりやすいインターフェイスが用意されています。
デバイスを種類別に表示しているときに "Firmware" クラスの下にある目的のファームウェア リソース デバイスを見つけるか、デバイスを接続別に表示しているときに "Microsoft UEFI-Compliant System" デバイスの下を見つけます。
ファームウェア リソース デバイスを右クリックし、[ドライバー ソフトウェアの更新...] を選択します。オプション。
[Browse my computer for driver software]\(ドライバー ソフトウェアのコンピューターを参照する\) オプションを使用して、新しいファームウェア リソース更新プログラム ドライバー パッケージを見つけて、ファームウェア リソース デバイスにインストールします。 この操作により、指定されたファームウェア リソース更新ドライバー パッケージが、Windows ドライバー ストアに追加してインストールを開始する前に、既にファームウェア リソース デバイス上にある可能性がある既存のファームウェア リソース更新ドライバー パッケージよりも実際に新しいものになります。
pnputil。 自動テストの場合、管理者権限でのコマンド プロンプトから PnpUtil コマンド ライン ユーティリティを使用して、ファームウェア リソース更新ドライバーパッケージを Windows ドライバーストアにインポートし、現在古いファームウェア リソースバージョンを使用しているすべての適用可能なファームウェア リソース デバイスにデバイスインストールを開始できます。これは、インストール済みのドライバーパッケージの INF ファイルの DriverVer によって決定されるか、サードパーティが提供したドライバーパッケージの INF ファイルが全くない場合に適用されます。 たとえば、次のコマンド ラインを使用して X:\firmware.inf を追加してインストールします。
pnputil -i -a X:\firmware.inf
ファームウェア リソースの更新プログラムがファームウェア リソース デバイスに正常にインストールされ、現在のファームウェア バージョンよりも高いバージョンのファームウェア リソース更新プログラムが提供されている場合、デバイスは更新操作を完了するためにシステムの再起動を待機します。 この状態のデバイスは、デバイスの問題を維持することによってシステムを再起動する必要があることを示します。これにより、再起動が実行されるまで、デバイスが起動され、安定した状態に復元されなくなります。
ファームウェア更新プログラムの状態の検証
ファームウェア ドライバー パッケージが正常にインストールされると、PnP はシステムの再起動を要求して更新プログラムを適用します。 再起動後、更新プログラムの状態を検証できます。 更新プログラムの状態は、次のレジストリ キーの下に保持されます: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}。
RESOURCE_GUIDは、更新された (ESRT からの) リソースの GUID です。
"LastAttemptStatus" レジストリ値はファームウェアの更新の状態を示します。値 0 は成功を示し、ゼロ以外の値は失敗を表します。 このレジストリ キーの値は、ESRT の LastAttemptStatus の値に基づいて OS ローダーによって設定される NTSTATUS コードです。 次の表は、LastAttemptStatus コードを対応する NTSTATUS コードにマップします。
| LastAttemptStatus | Code | NTSTATUS | Code |
|---|---|---|---|
| Success | 0 | STATUS_SUCCESS | 0x00000000 |
| エラー: 失敗 | 1 | STATUS_UNSUCCESSFUL | 0xC0000001 |
| エラー: リソースが不足しています | 2 | STATUS_INSUFFICIENT_RESOURCES | 0xC000009A |
| エラー: バージョンが正しくありません | 3 | リビジョン不一致 | 0xC0000059 |
| エラー: イメージ形式が無効です | 4 | ステータス_無効な画像形式 | 0xC000007B |
| エラー: 認証エラー | 5 | STATUS_ACCESS_DENIED | 0xC0000022 |
| エラー: 電源イベント、AC が接続されていません | 6 | STATUS_POWER_STATE_INVALID | 0xC00002D3 |
| エラー: 電源イベント、バッテリ不足 | 7 | ステータス_電力不足 | 0xC00002DE |
ファームウェア リソース デバイス ノードのハードウェア ID プロパティには、ファームウェア バージョンの変更も反映されている必要があります。XXX は新しいファームウェア バージョンです。
- UEFI\RES_{RESOURCE_GUID}&REV_XXX
ファームウェアの更新に失敗した場合は、失敗したファームウェアの更新を再試行できます。
デバイス マネージャーで、[ファームウェア] ノードを展開し、ファームウェア リソース デバイスを右クリックし、[ ドライバー ソフトウェアの更新] をクリックします。
[ コンピューターでドライバー ソフトウェアを参照] をクリックし、次のページで [コンピューター 上のデバイス ドライバーの一覧から選択できるようにする] をクリックします。
以前にインストールしたのと同じドライバーを選択し、[OK] をクリックします。
次回の再起動後、OS ローダーはファームウェア ドライバー パッケージのペイロードを使用して UpdateCapsule() を呼び出します。