この記事では、Windows Update (WU) サービスを使用して、リムーバブルデバイスまたはシャーシ内デバイスのファームウェアを更新する方法について説明します。 システム ファームウェアの更新については、 Windows UEFI ファームウェアの更新プラットフォームに関するページを参照してください。
Windows Update を使用してデバイス ファームウェアを更新するには、ファームウェア ペイロードを含むデバイス ドライバーを指定します。 デバイスのファンクション ドライバーを提供する場合は、ファームウェア更新ロジックとペイロードを既存のドライバーに追加するか、別のファームウェア更新ドライバー パッケージを指定できます。 デバイスで Microsoft が提供するドライバーを使用する場合は、別のファームウェア更新プログラム ドライバー パッケージを指定する必要があります。 どちらの場合も、ファームウェア更新プログラム ドライバー パッケージはユニバーサルである必要があります。
ユニバーサル ドライバーの詳細については、「 ユニバーサル INF ファイルの使用」を参照してください。 ドライバー バイナリでは、 KMDF、 UMDF 2、または Windows ドライバー モデルを使用できます。
WU はソフトウェアを実行できないため、ファームウェア更新ドライバーは、インストールのためにファームウェアをプラグ アンド プレイ (PnP) に渡す必要があります。
ファームウェア更新ドライバーの操作
通常、ファームウェア更新ドライバーは、次の手順を実装する軽量のデバイス ドライバーです。
デバイスの起動時またはドライバーのEVT_WDF_DRIVER_DEVICE_ADDコールバック関数で次の手順 を実行 します。
- ドライバーが接続されているデバイスを識別します。
- ドライバーに、デバイス ハードウェアで現在フラッシュされているファームウェアのバージョンよりも新しいファームウェア バージョンがあるかどうかを確認します。
- ファームウェアの更新が必要な場合は、更新をスケジュールするイベント タイマーを設定します。
- それ以外の場合は、ドライバーが再び起動されるまで何も行いません。
システム実行時:
- 更新がキューに登録されている場合は、一連の条件が満たされるまで待ちます。
- 条件が満たされたら、デバイスでファームウェアの更新を実行します。
ファームウェア更新ドライバーの内容
通常、ファームウェア更新プログラム ドライバー パッケージには、次の項目が含まれています。
- ユニバーサル ドライバー INF
- ドライバー カタログ
- ファンクション ドライバー (.sys または .dll)
- ファームウェア更新ペイロード バイナリ
ファームウェア更新プログラム パッケージを別のドライバー申請として送信します。
ベンダーが提供するドライバーにファームウェア更新ロジックを追加する
既存の関数ドライバーは、次の図に示すように、ファームウェアの更新メカニズムを実装できます。
または、ファンクション ドライバーとファームウェア更新ドライバーを個別に更新する場合は、ファームウェア更新プログラム ドライバーをインストールする 2 つ目のデバイス ノードを作成します。 次の図は、1 つのデバイスで 2 つの個別のデバイス ノードを持つ方法を示しています。
個別にターゲットにするには、関数とファームウェアのデバイス ノードに異なるハードウェア 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
は、子デバイスに SWC\ComponentDeviceId
のハードウェア ID があることを示します。 この INF をインストールすると、次のデバイス階層が作成されます。
今後のファームウェアの更新については、ファームウェア ペイロードを含む 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 ドライバー内で更新コードを大部分再利用できます。