フィルター ドライバーのインストール

PnP フィルター ドライバーは、 デバイス セットアップ クラス 内の特定のデバイスまたはすべてのデバイスをサポートでき、デバイスのファンクション ドライバー (下位フィルター) の下またはデバイスのファンクション ドライバー (上位フィルター) の上にアタッチできます。 PnP ドライバー層について詳しくは、「WDM ドライバーの種類」をご覧ください。

デバイス固有のフィルター ドライバーをインストールする

Windows 10 バージョン 1903 以降では、 INF DDInstall.Filters セクションINF AddFilter ディレクティブ を使用して、デバイス固有のフィルター ドライバーを登録できます。 詳細については、「 デバイス フィルター ドライバーの順序付け 」を参照してください。

以前のバージョンの Windows では、デバイス固有のフィルター ドライバーを登録するには、デバイス INF ファイルの DDInstall.HW セクションの AddReg エントリを使用してレジストリ エントリを作成します。 デバイス固有の上位フィルターの場合は、 UpperFilters という名前 のエントリを作成します。 デバイス固有の下位フィルターの場合は、 LowerFiltersという名前 のエントリを作成します。 たとえば、次の INF 抜粋では、 ExampleFunctionDriver ドライバーの上位フィルターとして ExampleFilterDriver がインストールされます。

[Example_install]
CopyFiles=Filter_copyfiles, Function_copyfiles

[Example_install.HW]
AddReg=Filter_addreg

[Example_install.Services]
AddService=ExampleFunctionDriver,0x00000002,Function_ServiceInstallSection
AddService=ExampleFilterDriver,,Filter_ServiceInstallSection

[Filter_addreg]
HKR,,"UpperFilters",0x00010000,"ExampleFilterDriver" ; REG_MULTI_SZ value

[Filter_ServiceInstallSection]
DisplayName    = %Filter_ServiceDesc%
ServiceType    = 1     ; SERVICE_KERNEL_DRIVER
StartType      = 3     ; SERVICE_DEMAND_START
ErrorControl   = 1     ; SERVICE_ERROR_NORMAL
ServiceBinary  = %13%\ExampleFilterDriver.sys

クラス フィルター ドライバーをインストールする

デバイス セットアップ クラス のクラス全体の上位フィルターまたは下位フィルターをインストールするには、必要なサービスをインストールする デバイス インストール アプリケーション を指定できます。 その後、アプリケーションは、目的のデバイス セットアップ クラスの上位または下位のフィルターとしてサービスを登録できます。 サービス バイナリをコピーするには、アプリケーションで SetupInstallFilesFromInfSection を使用できます。 サービスをインストールするために、アプリケーションは SetupInstallServicesFromInfSection を使用できます。 特定のデバイス セットアップ クラスの上位フィルターまたは下位フィルターとしてサービスを登録するために、アプリケーションは、 RelativeKeyRoot パラメーターの SetupDiOpenClassRegKey から取得したレジストリ キー ハンドルを使用して、対象の各デバイス セットアップ クラスに対して SetupInstallFromInfSection を呼び出します。 たとえば、次の INF セクションについて考えてみます。

[DestinationDirs]
upperfilter_copyfiles = 13

[upperfilter_inst]
CopyFiles = upperfilter_copyfiles
AddReg = upperfilter_addreg

[upperfilter_copyfiles]
upperfilt.sys,,,0x00004000  ; COPYFLG_IN_USE_RENAME

[upperfilter_addreg]
; append this service to existing REG_MULTI_SZ list, if any
HKR,,"UpperFilters",0x00010008,"upperfilt"

[upperfilter_inst.Services]
AddService = upperfilt,,upperfilter_service

[upperfilter_service]
DisplayName   = %upperfilter_ServiceDesc%
ServiceType   = 1   ; SERVICE_KERNEL_DRIVER
StartType     = 3   ; SERVICE_DEMAND_START
ErrorControl  = 1   ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\upperfilt.sys

デバイス インストール アプリケーションは、次のことを行います。

  1. [upperfilter_inst] セクションで SetupInstallFilesFromInfSection を呼び出します。

  2. [upperfilter_inst.Service] セクションの SetupInstallServicesFromInfSection を呼び出します。

  3. [upperfilter_inst] セクションの SetupInstallFromInfSection上位 サービスを登録するクラス キーごとに 1 回呼び出します。

各呼び出しでは、レジストリの変更のみを実行する必要があることを示すために、 Flags 引数の SPINST_REGISTRY を指定します。