次の方法で共有


Windows Updateを使用してデバイスのファームウェアを更新する

この記事では、Windows Update (WU) サービスを使用して、リムーバブル デバイスまたはシャーシ内デバイスのファームウェアを更新する方法について説明します。 システム ファームウェアの更新については、Windows UEFI ファームウェアの更新プラットフォームに関するページを参照してください。

これを行うには、ファームウェア ペイロードを含むデバイス ドライバーを提供します。 デバイスのファンクション ドライバーを提供する場合は、ファームウェア更新ロジックとペイロードを既存のドライバーに追加するか、別のファームウェア更新ドライバー パッケージを指定できます。 デバイスで Microsoft が提供するドライバーを使用する場合は、別のファームウェア更新プログラム ドライバー パッケージを指定する必要があります。 どちらの場合も、ファームウェア更新プログラム ドライバー パッケージはユニバーサルである必要があります。

ユニバーサル ドライバーの詳細については、「 ユニバーサル INF ファイルの使用を参照してください。 ドライバー バイナリは、KMDFUMDF 2、または Windows Driver Model (WDM) を使うことができます。

WU はソフトウェアを実行できないため、ファームウェア更新ドライバーは、インストールのためにファームウェアを プラグ アンド プレイ (PnP) に渡す必要があります。

ファームウェア更新ドライバーの操作

通常、ファームウェア更新ドライバーは、次の手順を実装する軽量のデバイス ドライバーです。

  • デバイスの起動時またはドライバー のEVT_WDF_DRIVER_DEVICE_ADD コールバック関数。

    1. 接続されているデバイスを識別します。

    2. ドライバーに、デバイス ハードウェアで現在フラッシュされているファームウェアのバージョンよりも新しいファームウェア バージョンがあるかどうかを判断します。

    3. ファームウェアの更新が必要な場合は、イベントタイマーを設定して更新をスケジュールします。

    4. それ以外の場合は、ドライバーが再び起動されるまで何も行いません。

  • システム実行時。

    1. 更新がキューに登録されている場合は、一連の条件が満たされるのを待ちます。

    2. 条件が満たされたら、デバイスでファームウェアの更新を実行します。

ファームウェア更新ドライバーの内容

通常、ファームウェア更新プログラム ドライバー パッケージには、次の項目が含まれています。

ファームウェア更新パッケージは、個別のドライバー申請として提出します。

ベンダーが提供するドライバーにファームウェア更新ロジックを追加します

既存の関数ドライバーは、次の図に示すように、ファームウェアの更新メカニズムを実装できます。

Windows Update を使用して、既存のファンクション ドライバー経由でファームウェア更新プログラムを配信する。

または、ファンクション ドライバーとファームウェア更新ドライバーを個別に更新する場合は、ファームウェア更新ドライバーをインストールする 2 つ目のデバイス ノードを作成します。 次の図は、1 つのデバイスで 2 つの個別のデバイス ノードを持つ方法を示しています。

Windows Update を使用して、別のデバイス ノード経由でファームウェア更新プログラムを配信する。

この場合、個別にターゲットにするには、関数とファームウェアのデバイス ノードに異なるハードウェア ID が必要です。

2 つ目のデバイス ノードを作成するには、いくつかの方法があります。 特定のデバイスの種類では、USB などの 1 つの物理デバイスで 2 つ目のデバイス ノードを公開する機能があります。 この機能を使用すると、WU を対象とするデバイス ノードを作成し、それにファームウェア更新ドライバーをインストールできます。 ただし、デバイスの種類によっては、1 つの物理デバイスで複数のデバイス ノードを列挙できないこともありがちです。

この場合は、AddComponent ディレクティブを指定する拡張 INF を使用して、Windows Update の対象にできるデバイス ノードを作成し、そのノードにファームウェア更新ドライバーをインストールします。 INF ファイルから取り出した次のスニペットは、これを行う方法を示しています。

[Manufacturer]
%Contoso%=Standard,NTamd64
[Standard.NTamd64]
%DeviceName%=Device_Install, PCI\DEVICE_ID
[Device_Install.Components]
AddComponent=ComponentName,,AddComponentSection
[AddComponentSection]
ComponentIDs = ComponentDeviceId

上記の INF サンプルでは、 ComponentIDs = ComponentDeviceId子デバイスの所有しているハードウェア IDを示しますSWC\ComponentDeviceId。 この INF をインストールすると、次のデバイス階層が作成されます。

親デバイス、プライマリ デバイス、AddComponent デバイス。

今後のファームウェアの更新については、ファームウェア ペイロードを含む INF ファイルとバイナリ ファイルを更新します。

Microsoft が提供するドライバーにファームウェア更新ロジックを追加します

Microsoft が提供するドライバーを使用するデバイスのファームウェアを更新するには、上に示すように、2 つ目のデバイス ノードを作成する必要があります。

ベスト プラクティス

  • ファームウェア更新ドライバー INF で、ドライバー ストアのドライバー パッケージ内のファイルを PnP に残すように DIRID 13 を指定します。

    [Firmware_AddReg]
    ; Store location of firmware payload
    HKR,,FirmwareFilename,,"%13%\firmware_payload.bin"
    

    PnP は、デバイスをインストールするときにこの場所を解決します。 ドライバーは、このレジストリ キーを開いてペイロードの場所を決定できます。

  • ファームウェア更新ドライバーでは、次の INF エントリを指定する必要があります。

    Class=Firmware
    ClassGuid={f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
    
  • 別のデバイス ノードを見つけるには、ファームウェア ドライバーは、すべてのデバイス ノードを列挙して一致を探すのではなく、自分自身に対して相対的にデバイス ツリーをウォークする必要があります。 ユーザーがデバイスの複数のインスタンスに接続している可能性があり、ファームウェア ドライバーは、関連付けられているデバイスのみを更新する必要があります。 通常、配置するデバイス ノードは、ファームウェア ドライバーがインストールされているデバイス ノードの親または兄弟です。 たとえば、上の 2 つのデバイス ノードを含む図では、ファームウェア更新ドライバーは、関数ドライバーを検索するために兄弟デバイスを探すことができます。 上の図では、ファームウェア ドライバーは親デバイスを探して、通信が必要なプライマリ デバイスを見つけることができます。

  • ドライバーは、システム上にあるデバイスの複数のインスタンスに対して、場合によっては、複数の異なるファームウェア バージョンがあっても堅牢である必要があります。 たとえば、デバイスのインスタンスが複数回接続および更新されている場合があります。その後、新しいデバイスが接続され、数バージョン古いファームウェアバージョンの可能性があります。 つまり、状態 (現在のバージョンなど) は、グローバルな場所ではなく、デバイスに対して保存する必要があります。

  • ファームウェアを更新する既存の方法 (EXE や共同インストーラーなど) がある場合は、UMDF ドライバー内で更新コードを大部分再利用できます。