Share via


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

ESRT で説明されている各ファームウェアリソースの更新プログラムのペイロードをバンドルし、独自の ドライバーパッケージ に配布して、同じ間隔で更新されない可能性がある他のファームウェアリソースの更新プログラムに関連付けられていなくても、独自のバージョン管理スキームを維持できるようにする必要があります。

次の例では、{SYSTEM_FIRMWARE}ESRTの例から表2、バージョン1からバージョン2に更新するリソースを対象とするファームウェアリソースの更新プログラムのドライバーパッケージINFファイル定義の例を示します。 参考のために、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ファイル定義を参照するフィールドについて説明します。

セクション/フィールド Value コメント
[バージョン] ドライバーパッケージのバージョン管理情報を定義します。
プロバイダー %Provider%=Contoso Inc。

( [文字列] セクションでローカライズされています) 。
全体のファームウェアリソース更新プログラムのドライバーパッケージのプロバイダー/ベンダーを識別します。
クラス/ClassGuid ファームウェア/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
ドライバーパッケージの日付を指定します。 日付とバージョンは、PnPデバイスのインストールシステムがシステムで使用可能な最適なドライバーパッケージを正確に選択できるようにするために、実際のファームウェアリソースの更新プログラムの日付とバージョンの両方を反映する必要があります。
CatalogFile catalog.cat ドライバーパッケージのINFファイルと関連付けられているすべてのファームウェアリソースの更新バイナリに署名する関連付けられているカタログファイルを指定します。
PnpLockdown 1 関連のないアプリケーションによって外部で変更されるからインストールされているドライバーファイルを保護するためにPnPドライバーファイルのロックダウンメカニズムを有効にします。 ファームウェアリソースの更新プログラムでは、ファームウェアリソースのイメージファイルをPnPシステムの制御の外部で改ざんできないようにするために、この設定を常に有効にする必要があります。
[製造元] ファームウェアリソースの更新プログラムを定義するすべての個別のドライバーの製造元/ベンダーを一覧表示します。 各製造元の行は、 [<モデル>] セクションを指定し、サポートされているターゲットプラットフォームを識別します。
%MfgName% Fabrikam Inc.

( [文字列] セクションでローカライズされています) 。
ファームウェアのリソースの更新プログラムの製造元/ベンダーを識別します。 これは、プロバイダーフィールドと同じ場合があります。
ファームウェア,

NTarm64.10.0 ... 17134
ターゲットドライバープラットフォームを含む、このドライバーパッケージでサポートされているファームウェアリソースデバイスを定義する [<モデル>] セクションを識別します。 この例では、ドライバーはWindows 10ビルド17134以降のARMベースのNTプラットフォームのみを対象としており、 [<Models>] セクションは [Firmware。NTarm64.十.... 17134] します。
[Firmware.NTarm。NTarm64.10.... 17134] [<Models>] セクションでは、更新プログラムが定義されているすべてのファームウェアリソースデバイスを一覧表示するWindows 10ビルド17134以降用のArmベースのNTプラットフォームについて説明します。 各ハードウェアモデル行は、 [<DDInstall>] セクションとそれに関連付けられているハードウェアIDの一致を指定します。
%FirmwareDesc% Fabrikam System Firmware 2.0

( [文字列] セクションでローカライズされています) 。
ファームウェアリソースの更新について説明します。 これは、デバイスマネージャーおよびその他のデバイス関連のUIで関連付けられているファームウェアリソースデバイスインスタンスを表示するために使用される主な説明文字列です。 このため、説明にはファームウェアのベンダーとバージョンが含まれる場合があります。
Firmware_Install、

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] セクションを参照してください。
[ファームウェア_インストールします。NT.Hw]

AddReg=ファームウェア_AddReg

[ファームウェア_AddReg]

...
[<DDInstall>.Hw] セクションでは、ファームウェアのリソースの更新プログラムのハードウェアに固有のインストール手順が含まれています。 ファームウェアのリソースの更新プログラムでは、ターゲットデバイスのインスタンスのデバイスのハードウェアキーの下に設定されているレジストリ値の形式でファームウェアリソースの更新の構成情報を定義します。
FirmwareId {RESOURCE_GUID} ファームウェアのリソースの更新プログラムのファームウェアGUID。 これは、UEFI\RES_{RESOURCE_GUID}ハードウェアIDに埋め込まれているファームウェアリソースGUIDと同じであることに注意してください。ただし、ここではスタンドアロンの値として指定する必要があります。PnPシステムでは、すべてのハードウェアIdが、デバイス/ドライバーの照合目的で厳密に使用される不透明な文字列として扱われるためです。
FirmwareVersion 0x00000002 REG_DWORD値として指定された、ファームウェアリソース更新プログラムのファームウェアバージョン。
FirmwareFilename %13%\firmware.bin Windows 10バージョン1803以降では、これは 'ドライバーストアから実行' ファイルであり、例のようなバイナリへの完全なパスを指定する必要があります。 Windows 10バージョン1803より前の場合、これはファームウェアリソース更新プログラムの相対パスとファームウェアファイル名である必要があります。%SystemRoot%\Firmwareディレクトリの下にあるUpdate Capsuleイメージファイル名{RESOURCE_GUID}は、特定のファームウェアリソースを対象とするすべてのファームウェアイメージファイルを整理するために使用されるサブディレクトリを表します。 たとえば、{RESOURCE_GUID}\firmware.binです。
[SourceDisksNames] ファームウェア更新リソースのイメージファイルなど、関連付けられているドライバーファイルが含まれている個別のドライバーパッケージのソースディスクの場所をすべて一覧表示します。
1 %DiskName%=ファームウェアの更新

( [文字列] セクションでローカライズされています) 。
任意の番号のドライバーパッケージのソースディスクIDとその説明の名前を指定します。 省略可能なドライバーパッケージの相対サブディレクトリが指定されていないため、このディスクIDに関連付けられているドライバーファイルは、ファームウェアリソースの更新イメージファイルなど、INFファイルの横に直接存在する必要があります。
[SourceDisksFiles] ドライバーパッケージによって参照されるすべてのドライバーファイルを一覧表示し、 [SourceDisksNames] セクションのディスクIDにリンクします。
firmware.bin 1 プライマリディスクIDとリンクすることによって、ドライバーパッケージの一部として firmware.bin ファームウェアリソース更新イメージファイルを確立します。 オプションのファイル固有のサブディレクトリが指定されていないため、このドライバーファイルは、ディスクIDのサブディレクトリに対して相対的に存在する必要があります。この場合は、INFファイルの横にあります。
[DestinationDirs] ドライバーパッケージによって参照されるすべてのドライバーファイルのターゲット宛先ディレクトリを一覧表示します。
DefaultDestDir 13 このドライバーパッケージによってコピーされるすべてのドライバーファイルの既定のコピー先ディレクトリを指定します。 Windows 10バージョン1803以降では、ファイルを ドライバーストアから実行するには、これをDIRID 13にする必要があります。 Windows 10バージョン1803より前では、10, Firmware\{RESOURCE_GUID}にする必要があります。これは、すべてのファイルのコピー先が%SystemRoot%\Firmwareの下にあることを指定します。ここで 10 (DIRID_WINDOWS) はベース%SystemRoot%ディレクトリを表し、{RESOURCE_GUID}はファームウェアリソースGUIDの後に名前が付けられたサブディレクトリを表します。
[文字列] ドライバーパッケージINFファイル内のすべての間接文字列トークン(%token%)のキーと値のマッピングを定義します。 文字列トークンを使用すると、ロケール固有の [Strings.<LanguageID>] セクションを導入することによって、ドライバーパッケージのINFファイルを簡単にローカライズできます。 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ファイルとファームウェアペイロードバイナリの有効性と信頼性を保証することが重要です。

テスト目的でドライバーパッケージに自己署名する手順を次に示します。 これらの手順はテスト目的でのみ使用されることに注意してください。 運用環境では、ファームウェア更新プログラムのドライバーパッケージを署名のためにパートナーセンターに送信する必要があります。 運用環境用のファームウェアドライバーパッケージに署名する手順については、 「更新プログラムパッケージの認定と署名」 を参照してください。

  1. 最新のWindows SDKとWindows Driver Kitをインストールします。 これにより %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86でmakecert、pvk2pfx inf2cat、signtoolの各ツールがインストールされます。

  2. テスト証明書を作成するには、次のコマンドを実行します。

    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」を参照してください。

  3. カタログファイルを作成するには、次のコマンドを実行します。

    Inf2Cat.exe /driver:"." /os:8_x64
    

    /driver 引数は、INFが配置されている場所を指します。 ファームウェアドライバーパッケージの対象となるOSに応じて /os 引数の値を変更します。 詳細については、 「Inf2Cat」 を参照してください。

    セキュリティカタログとドライバーの詳細については 「カタログファイルとデジタル署名」 および 「PnPドライバーパッケージのカタログファイルの作成」 を参照してください。

  4. 次のコマンドを実行して、カタログファイルに署名します。

    signtool sign /fd sha256 /f fwu.pfx /p <Password entered during makecert prompt> delta.cat
    

    詳細については 「SignTool」 を参照してください。

  5. テストシステムにテスト証明書をインストールします。

    1. fwu.cerファイルをダブルクリックし、 [証明書のインストール] オプションを選択します。

    2. 証明書のインストール中に、次のオプションを選択します。

      • [ストアの場所 (Store location) ] で、 [ローカルマシン] を選択します。

      • [証明書ストア (Certificate Store) ] で、 [信頼されたルート証明機関] を参照して選択します。

  6. ファームウェア/BIOSオプションでセキュアブートを無効にします。

  7. カタログが実稼働環境で署名されていない場合でも、OSローダーがブート中にファームウェアイメージファイル (firmware.bin) を読み込むことができるように、BCDオプションでテスト署名を有効にします。 管理者特権で次のコマンドを実行します。

    bcdedit /set testsigning on
    

ドライバーパッケージに署名した後、次のいずれかのメカニズムを使用してインストールできます。

  • デバイスマネージャー。 手動テストの場合、デバイスマネージャーは、ファームウェアリソースデバイスを検索し、ファームウェアリソースの更新を開始するためにそのドライバーを更新するためのわかりやすいインターフェイスを提供します。

    1. 接続によってデバイスを表示しているときに、種類別にデバイスを表示しているとき、または"Microsoft UEFI準拠システム"デバイスの下にある"ファームウェア"クラスで、目的のファームウェアリソースデバイスを見つけます。

    2. ファームウェアリソースデバイスを右クリックし、 [ドライバーソフトウェアの更新...] オプションを選択します。

    3. [コンピューターでドライバーソフトウェアを参照] オプションを使用して、新しいファームウェアリソース更新ドライバーパッケージを検索し、ファームウェアリソースデバイスにインストールします。 この操作により、指定されたファームウェアリソース更新ドライバーパッケージが、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}.

リソース_GUIDは、更新された (ESRTからの) リソースのGUIDです。"。

LastAttemptStatus"レジストリ値は、ファームウェアの更新プログラムの状態を示します。値0は成功を示し、0以外の値はエラーを表します。 このレジストリキーの値は、ESRTからのLastAttemptStatusの値に基づいてOSローダーによって設定されたNTSTATUSコードです。 次の表は、LastAttemptStatusコードを対応するNTSTATUSコードにマップしています。

LastAttemptStatus コード NTSTATUS コード
Success 0 STATUS_SUCCESS 0x00000000
エラー: 失敗 1 STATUS_UNSUCCESSFUL 0xC0000001
エラー: リソース不足 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
エラー: バージョンが正しくありません 3 STATUS_REVISION_MISMATCH 0xC0000059
エラー: 無効なイメージフォーマット 4 STATUS_INVALID_IMAGE_FORMAT 0xC000007B
エラー: 認証エラー: 5 STATUS_ACCESS_DENIED 0xC0000022
エラー: 電源イベント、AC未接続 6 STATUS_POWER_STATE_INVALID 0xC00002D3
エラー: 電源イベント、バッテリ不足 7 STATUS_INSUFFICIENT_POWER 0xC00002DE

ファームウェアリソースデバイスノードのハードウェアIDプロパティには、ファームウェアバージョンの変更も反映する必要があります。ここで、XXXは新しいファームウェアバージョンです。

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

ファームウェアの更新に失敗した場合は、失敗したファームウェアの更新を再試行できます。

  • デバイスマネージャーで、ファームウェアノードを展開し、ファームウェアリソースデバイスを右クリックして ドライバーソフトウェアの更新をクリックします。

  • コンピューターでドライバーソフトウェアを参照をクリックして、次のページで コンピューター上のデバイスドライバーの一覧から選択をクリックします。

  • 以前にインストールしたのと同じドライバーを選択し、 [OK] をクリックします。

次回の再起動後、OSローダーは、ファームウェアドライバーパッケージのペイロードを使用してUpdateCapsule()を呼び出します。

ESRTテーブルの定義

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

更新プログラムの処理

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

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

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