拡張 INF ファイルの使用

Windows 10より前のバージョンでは、Windowsは特定のデバイスにインストールするドライバー パッケージを1つ 選択していました。 このため、ドライバー パッケージは、すべてのシナリオと構成に対応するコードが含まれる大規模かつ複雑なものになり、マイナー更新のたびにドライバー パッケージ全体の更新が必要でした。 Windows 10 以降、INF 機能を複数のコンポーネントに分割でき、それぞれ個別に処理できます。 デバイスにインストールされているコア ドライバー パッケージは基本ドライバー パッケージと呼ばれ、Windows 10 より前のドライバー パッケージと同じ方法でシステムによって処理されます。 基本ドライバー パッケージの機能を拡張するには、別のドライバー パッケージ内で拡張機能 INF を指定します。 拡張 INF:

  • 別の会社から提供され、基本 INF とは別に更新できます。

  • 基本 INF と同じ INF 構文を使用しますが、カスタマイズまたは特殊化のために基本 INF を拡張できます。

  • デバイスの値を拡張しますが 、基本ドライバー パッケージを機能させるには必要ありません 。 拡張 INF がない場合、システムは基本ドライバー パッケージだけでネットワークを起動して接続できる必要があります。 キーボードなどのシステムに組み込まれている入力デバイスは、拡張機能 INF なしで、少なくとも基本的な機能で機能できる必要があります。

  • ユニバーサル INF ファイルである必要があります。

すべてのデバイスには 1 つの基本ドライバー パッケージがインストールされている必要があり、必要に応じて 1 つ以上の拡張 INF を関連付けることができます。 デバイスにインストールする基本ドライバー パッケージがない場合、拡張 INF はデバイスにインストールできません。

拡張 INF を使用する一般的なシナリオは次のとおりです。

  • デバイスフレンドリ名のカスタマイズやハードウェア構成設定の変更など、基本ドライバー パッケージで提供される設定の変更。

  • INF AddComponent ディレクティブを指定し、コンポーネント INF ファイルを指定して、1 つ以上のソフトウェア コンポーネントを作成します。

  • ハードウェア調整データなど、デバイスのエクスペリエンスや機能を強化するシステムのモデルまたはフォーム ファクターに固有の設定を提供します。

  • デバイス スタックへのフィルター ドライバーの追加。

以下の例で、これらのシナリオのサンプルコードをご覧いただけます。 DCHU ユニバーサル ドライバー サンプルで拡張機能 INF を使用する方法については、DCH 準拠ドライバー パッケージの例も参照してください。

拡張 INF と基本ドライバー パッケージの連携のしくみ

デバイスのインストール中、拡張 INF の設定は、基本ドライバー パッケージの設定の後に適用されます。 その結果、拡張 INF と基本ドライバー パッケージで同じ設定が指定されている場合、拡張 INF のバージョンが適用されます。 同様に、基本ドライバー パッケージが変更されても、拡張 INF は残り、新しい基本ドライバー パッケージに適用されます。 同じデバイスに複数の拡張 INF がインストールされている場合、拡張 INF が適用される順序は事前に決められていません。そのため、1 つの拡張 INF で、別の拡張 INF によって提供される値を決定論的に上書きすることはできません。 同じデバイスを対象とする個別の拡張 INF は、同じ設定を変更しないでください。

拡張 INF によって上書ききるエントリと、適用可能なパラメーター値の範囲と制約を説明するコメントを基本 ドライバー パッケージに含めるのが役立ちます。

ExtensionId の指定

拡張 INF を記述するときに、INF の [バージョン] セクションのエントリである ExtensionId という特殊な GUID を生成します。

システムは、デバイスのハードウェア ID と互換ID を、そのシステムに適用される Models セクションの拡張 INF で指定された ID と照合することによって、特定のデバイスに対して考えられる拡張 INF を識別します。

同じ ExtensionId 値を指定するすべての拡張 INF のうち、システムはインストールする 1 つだけを選択し、基本ドライバー パッケージの設定に適用します。 INF で指定されたドライバーの日付とドライバーのバージョンは、同じ ExtensionId を持つ複数の拡張 INF 間で 1 つの INF を選択するために、その順序で使用されます。

具体的には、3 つの拡張 INF がある架空のデバイスを含む次のシナリオを考えてみましょう。

Diagram showing how base INF and extension INFs are selected.

ExtensionId の値{A}{B}は中かっこで囲まれており、各基本ドライバー パッケージのランクはバナー リボンに表示されます。

最初に、システムは、最高のランクと最高のバージョンを持つ基本ドライバー パッケージを選択します。

次に、使用可能な拡張 INF が処理されます。 2 つは ExtensionId{B}を持ち、1 つは ExtensionId{A}を持ちます。 最初の 2 つで、ドライバーの日付が同じであるとします。 次の優先事項はドライバーのバージョンであるため、システムは v2.0 の拡張 INF を選択します。

一意の ExtensionId 値を持つ拡張 INF も選択されます。 システムは、デバイスの基本ドライバー パッケージを適用し、そのデバイスの 2 つの拡張 INF を適用します。

拡張 INF ファイルは、基本ドライバー パッケージの後に常に適用されますが、拡張 INF が適用される順序は決まっていません。

拡張 INF の作成

INF を拡張 INF として定義するために必要なエントリを次に示します。

  1. [バージョン] セクションのクラスClassGuid にこれらの値を指定します。 セットアップ クラスの詳細については、「ベンダーが使用できるシステム定義デバイス セットアップ クラス」を参照してください。

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. [バージョン] セクションに ExtensionId エントリを指定します。 拡張機能 INF の初期バージョン用に新しい GUID を生成するか、初期拡張機能 INF のその後の更新用に最後の GUID を再利用します。

    ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
    

組織は、所有する ExtensionID のみを使用できます。 拡張機能 ID の登録の詳細については、「Windows ハードウェア デベロッパー センター ダッシュボードでのハードウェア申請の管理」を参照してください。

  1. 拡張 INF を更新する場合は、ExtensionId を同じにして、DriverVer ディレクティブで指定されたバージョンと日付をインクリメントします。 特定の ExtensionId 値に対して、PnP は DriverVer が最も高い INF を選択します。

    Note

    拡張機能 INF が Windows 10 S を対象とする場合、そのバージョンの Windows でのドライバーのインストールについては、「S モードの Windows 10 ドライバーの要件」を参照してください。

  2. [INF モデル] セクションで、ターゲット デバイスのものと一致する 1 つ以上のハードウェア ID と互換性のある ID を指定します。 これらのハードウェア ID と互換性のある ID は、基本ドライバー パッケージの ID と一致する必要はありません。 通常、拡張 INF では、特定のドライバー構成をさらに特殊化することを目的として、基本ドライバー パッケージよりも具体的なハードウェア ID が一覧表示されます。 たとえば、基本ドライバー パッケージでは 2 部品構成の PCI ハードウェア ID を使用し、拡張 INF では次のような 4 部品構成の PCI ハードウェア ID を指定します。

    [DeviceExtensions.NTamd64]
    %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
    

    または、デバイスが既に絞り込まれている場合や、ベース ドライバー パッケージに最も具体的なハードウェア ID が既に一覧表示されている場合など、拡張 INF によってベース ドライバー パッケージと同じハードウェア ID が一覧表示される場合があります。

    場合によっては、拡張 INF は、より広範なデバイス のセット間で設定をカスタマイズするために、互換ID など、あまり具体的でないデバイス ID を提供する場合があります。

    CHID ターゲット は、4 部品構成のハードウェア ID が不可能な場合、または制限が十分でない場合に使用できます。

  3. SPSVCINST_ASSOCSERVICEでサービス を定義しないでください。 拡張 INF は、デバイスのファンクション ドライバーを提供できません。 ただし、拡張 INF では、デバイスのフィルター ドライバーなど、他のサービスを定義できます。 サービスの指定の詳細については、「INF AddService ディレクティブ」を参照してください。

ほとんどの場合、基本ドライバー パッケージとは別に、拡張 INF ドライバー パッケージをハードウェア デベロッパー センターに提出します。 拡張機能 INF をパッケージ化する方法の例とサンプル コードへのリンクについては、「DCH 準拠ドライバー パッケージの例」を参照してください。

ドライバーの検証と提出プロセスは、拡張 INF についても基本ドライバー パッケージの場合と同じです。 詳しくは、「 Windows HLK の概要」をご覧ください。

拡張ドライバーのアンインストール

拡張ドライバー パッケージをシステムから削除し、それを使用している任意のデバイスからアンインストールするには、uninstallフラグで PnPUtildelete-driver のコマンドを使用します。 これにより、基本ドライバー パッケージを削除せずに、拡張ドライバー パッケージをデバイスからアンインストールできます。

アンインストールして使用するドライバー パッケージの oem<#>.inf 名を見つけますpnputil /delete-driver oem<#>.inf /uninstall

pnputil /enum-drivers は、適切な oem<#>.inf 名を識別するのに役立ちます。

例 1: 拡張 INF を使用してデバイスのフレンドリ名を設定する

1 つの一般的なシナリオでは、デバイス製造元 (IHV) が基本ドライバー パッケージを提供し、システム ビルダー (OEM) は、基本ドライバー パッケージの構成と設定を補完し、場合によっては上書きする拡張 INF を提供します。 次のスニペットは、デバイスのフレンドリ名を設定する方法を示す完全な拡張 INF です。

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %CONTOSO%
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
DriverVer   = 05/28/2013,1.0.0.0
CatalogFile = delta.cat
PnpLockdown = 1

[Manufacturer]
%CONTOSO% = DeviceExtensions,NTamd64

[DeviceExtensions.NTamd64]
%Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX

[DeviceExtension_Install]
; No changes

[DeviceExtension_Install.HW]
AddReg = FriendlyName_AddReg

[FriendlyName_AddReg]
HKR,,FriendlyName,, "New Device Friendly Name"

[Strings]
CONTOSO              = "Contoso"
Device.ExtensionDesc = "Sample Device Extension"

例 2: 拡張 INF を使用して追加のソフトウェアをインストールします

次のスニペットは、ユニバーサル ドライバーのドライバー パッケージ インストール ツールキットに 含まれる完全な拡張 INF です。 この例では、INF AddComponent ディレクティブを使用して、サービスと実行可能ファイルをインストールするコンポーネントを作成します。 コンポーネント INF で実行できる操作の詳細については、「コンポーネント INF ファイルの使用」を参照してください。

このファイルにオンラインでアクセスするには、次を参照してくださいosrfx2_DCHU_extension.inx

;/*++
;
;Copyright (c) Microsoft Corporation.  All rights reserved.
;
;   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;   PURPOSE.
;
;Module Name:
;
;    osrfx2_DCHU_extension.INF
;
;Abstract:
;
;    Extension inf for the OSR FX2 Learning Kit
;
;--*/

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %ManufacturerName%
ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}
CatalogFile = osrfx2_DCHU_extension.cat
DriverVer   = 05/16/2017,15.14.36.721
PnpLockdown = 1

[Manufacturer]
%ManufacturerName% = OsrFx2Extension, NT$ARCH$

[OsrFx2Extension.NT$ARCH$]
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_045e&Pid_94aa&mi_00
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_0547&PID_1002

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_usersvc.inf

[OsrFx2Extension_Install.NT.HW]
AddReg = OsrFx2Extension_AddReg
AddReg = OsrFx2Extension_COMAddReg

[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"

; Add all registry keys to successfully register the
; In-Process ATL COM Server MSFT Sample.
[OsrFx2Extension_COMAddReg]
HKCR,AppID\ATLDllCOMServer.DLL,AppID,,"{9DD18FED-55F6-4741-AF25-798B90C4AED5}"
HKCR,AppID\{9DD18FED-55F6-4741-AF25-798B90C4AED5},,,"ATLDllCOMServer"
HKCR,ATLDllCOMServer.SimpleObject,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,ATLDllCOMServer.SimpleObject\CurVer,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,ATLDllCOMServer.SimpleObject.1,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject.1\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084},,,"SimpleObject Class"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,,%REG_EXPAND_SZ%,"%%SystemRoot%%\System32\ATLDllCOMServer.dll"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,ThreadingModel,,"Apartment"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\ProgID,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\Programmable,,%FLG_ADDREG_KEYONLY%
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\TypeLib,,,"{9B23EFED-A0C1-46B6-A903-218206447F3E}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\VersionIndependentProgID,,,"ATLDllCOMServer.SimpleObject"

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall
AddComponent = osrfx2_DCHU_usersvc,,OsrFx2Extension_ComponentInstall_UserSvc

[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

[OsrFx2Extension_ComponentInstall_UserSvc]
ComponentIds=VID_045e&PID_94ac

[Strings]
ManufacturerName = "Contoso"
OsrFx2.ExtensionDesc = "OsrFx2 DCHU Device Extension"
REG_EXPAND_SZ = 0x00020000
FLG_ADDREG_KEYONLY = 0x00000010

拡張 INF を使用してフィルター ドライバーをインストールする方法については、「デバイス フィルター ドライバーの順序付け」を参照してください。

拡張性を向上させるために、IHV は拡張 INF テンプレートにオプションの機能を配置することをお勧めします。

下位互換性

基本ドライバー パッケージに対する変更を十分にテストして、既存の拡張 INF の下位互換性が損なわれないことを確認する必要があります。

基本ドライバー パッケージを管理する場合は、次のベスト プラクティスに従います。

  • コード コメントとデザイン ドキュメントの両方で、ドキュメント パラメーター値の範囲と制約。 今後の変更は、指定された範囲に準拠している必要があります。
  • 新しい範囲をサポートするには、オプションパラメーター (既定値なし) を追加します。

認定のための拡張 INF の提出

ハードウェア デベロッパー センターで拡張機能 INF を操作する方法の詳細については、「Windows ハードウェア デベロッパー センター ダッシュボードでの拡張機能 INF の操作」を参照してください。

パートナー センターでの拡張 INF の使用

DCH 準拠のドライバー パッケージの例

ユニバーサル INF ファイルの使用

Windows ドライバーの概要

ユニバーサル ドライバー用ドライバー パッケージ インストール ツールキット