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

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

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

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

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

[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.Services] セクションに対して SetupInstallServicesFromInfSection を呼び出します。

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

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