共同インストーラーを使用しない USB デバイスのデバイス ファームウェアの更新

重要

WDK for Windows 11 バージョン 22H2 以降では、WDF 再頒布可能パッケージ共同インストーラーは未対応となりました。 この変更を回避する方法については、WDK の既知の問題に関する記事で「WDF 再頒布可能パッケージ共同インストーラーが機能しない」を参照してください。

USB デバイス ベンダーは、共同インストーラーを使用して、受信トレイ USB デバイス ドライバーを使用するデバイスのデバイス ファームウェアを更新します。 ただし、共同インストーラーは、Windows 10 の要件である新しい「ユニバーサル INF」標準ではサポートされていません。 これは、既存の USB デバイス ファームウェアの更新プロセスに課題をもたらします。 この記事では、共同インストーラーを使用せずに USB デバイスファームウェアを更新する推奨方法を説明します。

要件

USB デバイス ファームウェアの更新プロセスの主な要件は次のとおりです。

  1. ユーザー インタラクションなしのシームレスなファームウェア更新

  2. 信頼性の高い回復メカニズム (たとえば、デバイスのブリックなし)

  3. Windows 7 以降で動作

概要

UVC カメラなどの USB デバイスは、現場で更新可能なファームウェアとともにリリースされます。 現在、ファームウェアを更新する標準的な方法はありません。 既存のすべての更新メカニズムに共通する 1 つの項目は、一部のカスタム ソフトウェア スイートがクライアント上で実行され、ファームウェアをデバイスにダウンロードすることです。 通常、ファームウェア更新ソフトウェア スイートは、デバイスのインストール プロセスの一環としてインストールされます。 共同インストーラーが開始すると、ファームウェアの更新プロセスが開始されます。 Windows 10 に共同インストーラーが存在しない場合、デバイス ベンダーは現場のこれらのデバイスのファームウェアを更新できなくなります。

USB デバイスのファームウェア更新シナリオの共同インストーラーが存在しないことを回避するために推奨される方法は、ファームウェアの更新プロセスを開始する USB デバイスに下位フィルター ドライバーを使用することです。 AddDevice呼び出し中に、フィルター ドライバーはデバイスファームウェアのバージョンをチェックし、必要に応じてファームウェアを更新します。

ファームウェア更新の概要

USB デバイスがシステムに接続されている場合、デバイスの汎用インボックス ドライバーがインストールされます。 汎用ドライバーのインストール後、OS はベンダー固有のドライバー パッケージの可用性を Windows Update サーバーにクエリし、パッケージをダウンロードしてドライバーをインストールします。 インストールされているドライバー パッケージは、ファームウェアの更新を実行します。

ファームウェアを更新する方法は 2 つあります。

  1. ファームウェア更新フィルター ドライバー

    1. ベンダーは、ファームウェアの更新を実行する下位フィルター ドライバーを提供しました。
  2. ファームウェア更新デバイス ドライバー

    1. ベンダーは、デバイスをファームウェア更新モードにする下位フィルター ドライバーを提供しました。

    2. デバイスはファームウェア更新デバイスとして列挙されます。

    3. ベンダーが提供するファームウェア更新ドライバーは、このデバイスに対してロードされ、ファームウェアを更新します。

方法 1: ファームウェア更新フィルター ドライバー

このメソッドでは、USB デバイス ドライバーの下位フィルター ドライバーは、ドライバー更新プロセスの一部としてインストールされます。 このフィルター ドライバーは、ファームウェアの更新を実行します。

Windows Update サーバー上のドライバー更新パッケージには、次のものが含まれています。

  • ファームウェア更新 WDF の下位フィルター ドライバー

  • ファームウェア更新 WDF の下位フィルター ドライバーをインストールするための拡張 INF

  • 「firmware.bin」ファイル

ファームウェア更新 UMDF 下位フィルター ドライバー メソッド。

ドライバー更新パッケージのインストール中に、ファームウェア更新 WDF フィルター ドライバーの AddDeviceルーチンが呼び出されます。 このルーチンから、WDF フィルター ドライバーは、デバイス HW レジストリ キーからデバイス ファームウェアのバージョンを取得します。 デバイス ファームウェアは、MSOS 記述子を使用してデバイス HW レジストリ キーにファームウェアのバージョンを配置する必要があります。

  1. デバイス ファームウェアのバージョンとフィルター ドライバーが予想するファームウェアのバージョンが異なる場合、または

  2. ファームウェアのバージョンは、デバイス HW レジストリ キーで使用できません

    1. 次に、フィルター ドライバーは、AddDeviceコールバックに成功を返すことで、デバイス スタックに自分自身を挿入します。
  3. それ以外の場合、フィルター ドライバーはデバイス スタックに自分自身を挿入しません。

    1. デバイスに予期されるファームウェアが搭載されているため、ファームウェアを更新する必要はありません。

WDF フィルター ドライバーのEVT_WDF_DEVICE_D0_ENTRYコールバックが後で呼び出されると、フィルター ドライバーは、USB デバイスがデバイスを登録するデバイス インターフェイス クラスをリッスンするために、CM_Register_Notification または IoRegisterPlugPlayNotification(UMDF または KMDF)を使用してデバイス インターフェイス変更通知を登録する必要があります。 たとえば、RGB カメラのファームウェア更新フィルター ドライバーは KSCATEGORY_VIDEO_CAMERA に登録されます。 通知を受信すると、フィルター ドライバーは、ファームウェアの更新を実行する作業項目を投稿する必要があります。

UMDF ベースのファームウェア更新ドライバーは、デバイス固有の API を使用するか、制御転送を直接発行して USB デバイスにアクセスし、ファームウェアの更新を実行できます。 たとえば、カメラの UMDF ベースのフィルター ドライバーは、カメラ API を使用してファームウェアの更新を実行します。

KMDF ベースのファームウェア更新ドライバーは、ファームウェアの更新を実行するために、ベンダー固有のコマンドを送信できます。

ファームウェアのフラッシュが完了すると、デバイスはバスへの接続を切断し、再接続する必要があります。 デバイスは、新しいファームウェアで再列挙されます。

「ファームウェア更新フィルター ドライバー」 を使用する方法は、デバイス メモリに 2 つの完全なファームウェア イメージ (更新イメージとバックアップ イメージ) を保持するのに十分なリソースを持つデバイスに推奨されます。 その理由は、更新されたファームウェアのダウンロード中に障害が発生した場合、デバイスは更新を放棄して元のファームウェアに起動できます。 したがって、デバイスをブリックすることはありません。

方法 2: ファームウェア更新デバイス ドライバー

このメソッドでは、ドライバーの更新プロセスの一部として、USB デバイスに下位フィルター ドライバーがインストールされます。 このフィルター ドライバーは、ファームウェア更新モードで再起動するコマンドをデバイスに送信し、デバイスはファームウェア更新インターフェイスを公開します。 ファームウェア更新インターフェイスのドライバーが読み込み、ファームウェアの更新を実行します。

デバイスの Windows Update サーバー上のドライバー更新パッケージには、次のものが含まれています。

  1. デバイスをファームウェア更新モードに設定する WDF 下位フィルター ドライバー

  2. WDF 下位フィルター ドライバーをインストールするための拡張 INF

ドライバー更新パッケージに加えて、別のファームウェア更新デバイス ドライバー パッケージが Windows Update に存在します。次の機能があります。

  1. WDF ファームウェア更新デバイス ドライバーとその INF、および

  2. 「firmware.bin」ファイル。

ファームウェア更新 WDF ドライバー メソッド。

ドライバー更新パッケージのインストール中に、WDF 下位フィルター ドライバーの AddDevice ルーチンが呼び出されます。 このルーチンから、フィルター ドライバーは、デバイス HW レジストリ キーからデバイス ファームウェアのバージョンをクエリします。 デバイス ファームウェアは、MSOS 記述子または USB デバイスの拡張 INF を使用して、デバイス HW レジストリ キーに「ファームウェア バージョン」を配置する必要があります。

  1. デバイス ファームウェアのバージョンとフィルター ドライバーが予想するファームウェアのバージョンが異なる場合、または

  2. ファームウェアのバージョンは、デバイス HW レジストリ キーで使用できません

  3. 次に、WDF フィルター ドライバーは、デバイス スタックに自分自身を挿入します。

  4. それ以外の場合、WDF フィルター ドライバーはデバイス スタックに自分自身を挿入しません。

後で WDF フィルター ドライバーの EVT_WDF_DEVICE_D0_ENTRY コールバックが呼び出されると、フィルター ドライバーは、ファームウェアの更新モードに配置するデバイスにベンダー固有のコマンドを発行します。 デバイスが切断されて再接続され、ファームウェアの更新インターフェイスが公開されます。

システムは、ファームウェア更新デバイス インターフェイスを列挙します。 ベンダーがファーム ウェア更新パッケージで提供するカスタム ファームウェア更新 WDF ドライバーが、このファームウェア更新インターフェイスのロードされます。 このドライバーはファームウェアを更新します。

WDF ファームウェア更新ドライバーのEVT_WDF_DEVICE_D0_ENTRYコールバックが後で呼び出されると、ドライバーは、ファームウェアの更新を実行する作業項目を投稿する必要があります。

ファームウェアのフラッシュが完了すると、デバイスはバスへの接続を切断し、再接続する必要があります。 デバイスは、新しいファームウェアで再列挙されます。

この方法は、デバイス上のメモリ不足により、更新されたファームウェア イメージと元のファームウェア イメージを保持できないデバイスに推奨されます。 その理由は、更新されたファームウェアのダウンロード中に障害が発生した場合、デバイスは更新を放棄してファームウェア更新モードで再度起動し、ファームウェアの更新を再試行できます。 したがって、デバイスをブリックすることはありません。

回復

ファームウェアの更新プロセスは、さまざまな理由で失敗する可能性があります。 その場合、デバイスが再び列挙されると、ファームウェア更新ドライバーが再度ファームウェアの更新を試みて失敗し、この更新プロセスがループに陥る可能性があります。 ファームウェア更新ドライバーは、実行できる再試行回数に上限を設ける必要があります。 ファームウェアの更新の再試行がしきい値 (たとえば、3 回の再試行) を超えた場合、フィルター ドライバーは、ドライバーの新しいバージョンが WU からダウンロードされるまで、ファームウェアの更新を再試行しないでください。 ファームウェア更新ドライバーは、レジストリを使用して再試行の状態を保持できます。

デバイス ファームウェアの更新の最後に、デバイス自体をリセットして、再度列挙することをお勧めします。

ファームウェア更新のどちらの方法でも、ファームウェアの更新を実行する前にデバイス機能を停止する必要があります。 これにより、デバイスにオープン ハンドルがないことが保証され、OS の再起動要件が回避されます。

INF のサンプル

;==============================================================================
; Microsoft Extension INF for USB Camera Firmware Update UMDF Filter Driver
; Copyright (C) Microsoft Corporation.  All rights reserved.
;==============================================================================

[Version]
Signature="$WINDOWS NT$"
Class=Extension
ClassGUID={e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider=%CONTOSO%
ExtensionId={BC6EE554-271C-48C8-B713-8078833962BD} ; replace with your own GUID
CatalogFile.NT=SampleExtension.cat
DriverVer=08/28/2017,10.0.1700.000
PnpLockdown=1

[SourceDisksFiles]
ContosoFirmwareUpdateFilterDriver.dll=1
ContosoFirmware.bin=1

[SourceDisksNames]
1 = %MediaDescription%

[DestinationDirs]
UMDriverCopy=13
ContosoFirmwareCopy=13
DefaultDestDir = 13

[UMDriverCopy]
ContosoFirmwareUpdateFilterDriver.dll

[ContosoFirmwareCopy]
ContosoFirmware.bin

[Manufacturer]
%CONTOSO% = ContosoFirmwareUpdateFilterDriver,NTamd64.10.0...22000

[ContosoFirmwareUpdateFilterDriver.NTamd64.10.0...22000]
; replace with your camera device VID PID
%ContosoCamera.DeviceDesc% = ContosoFirmwareUpdateFilterDriver_Win11Install, USB\VID_1234&PID_1234&REV_1234

[ContosoFirmwareUpdateFilterDriver_Win11Install]
Include=wudfrd.inf
Needs=wudfrd.NT
CopyFiles=UMDriverCopy, ContosoFirmwareCopy

[ContosoFirmwareUpdateFilterDriver_Win11Install.HW]
Include=wudfrd.inf
Needs=wudfrd.NT.HW

[ContosoFirmwareUpdateFilterDriver.AddReg]
; Load the redirector as an lower filter on this specific device.
; 0x00010008 - FLG_ADDREG_TYPE_MULTI_SZ | FLG_ADDREG_APPEND
HKR,,"LowerFilters",0x00010008,"WUDFRd"

[ContosoFirmwareUpdateFilterDriver_Win11Install.Services]
Include=wudfrd.inf
Needs=WUDFRD.NT.Services

[ContosoFirmwareUpdateFilterDriver_Win11Install.Wdf]
UmdfService=ContosoFirmwareUpdateFilterDriver, ContosoFirmwareUpdateFilterDriver.UmdfFilter
UmdfServiceOrder=ContosoFirmwareUpdateFilterDriver

[ContosoFirmwareUpdateFilterDriver.UmdfFilter]
UmdfLibraryVersion=2.0.0
ServiceBinary= "%13%\ContosoFirmwareUpdateFilterDriver.dll"

[Strings]
CONTOSO = "Contoso Inc."
ContosoCamera.DeviceDesc = "Contoso Camera Extension"
MediaDescription="Contoso Camera Firmware Update Filter Driver Installation Media"
WudfRdDisplayName = "WDF Reflector Driver"