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 つ以上のソフトウェア コンポーネントを作成します。
ハードウェア調整データなど、デバイスのエクスペリエンスや機能を強化するシステムのモデルまたはフォーム ファクターに固有の設定を提供します。
デバイス スタックへのフィルター ドライバーの追加。
以下の例で、これらのシナリオのサンプルコードをご覧いただけます。 DCH 準拠ドライバー パッケージの例も参照してください。これは、DCHU ユニバーサル ドライバー サンプルで拡張 INF を使用する方法を説明しています。
拡張 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 が関連付けられた架空のデバイスを含む次のシナリオを考えてみましょう。
ExtensionId の値{A}{B}は中かっこで囲まれており、各基本ドライバー パッケージのランクはバナー リボンに表示されます。
最初に、システムは、最高のランクと最高のバージョンを持つ基本ドライバー パッケージを選択します。
次に、使用可能な拡張 INF が処理されます。 2 つは ExtensionId 値{B}を持ち、1 つは ExtensionId 値{A}を持ちます。 最初の 2 つで、ドライバーの日付情報が同じであるとします。 次の優先事項はドライバーのバージョンであるため、システムは v2.0 の拡張 INF を選択します。
一意のExtensionId値を持つ拡張INFも選択されます。 システムは、デバイスの基本ドライバー パッケージを適用し、次にそのデバイス用の 2つの拡張 INF を適用します。
拡張 INF ファイルは常にベース ドライバー パッケージの後に適用されますが、拡張 INF ファイルが適用される順序は定められていません。
拡張 INF の作成
INF を拡張 INF として定義するために必要なエントリを次に示します。
Version セクションで、Class と ClassGuid にこれらの値を指定します。 セットアップ クラスの詳細については、「ベンダーが利用可能なシステム定義デバイス セットアップ クラス」を参照してください。
[Version] ... Class = Extension ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57} ...[バージョン] セクションに ExtensionId エントリを指定します。 拡張機能 INF の初期バージョン用に新しい GUID を生成するか、初期拡張機能 INF のその後の更新用に最後の GUID を再利用する。
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
組織は、所有する ExtensionID のみを使用できます。 拡張機能 ID の登録の詳細については、「Windows ハードウェア デベロッパー センター ダッシュボードでのハードウェア申請の管理」を参照してください。
拡張 INF を更新する場合は、ExtensionId を同じにして、DriverVer ディレクティブで指定されたバージョンと日付をインクリメントします。 特定の ExtensionId 値に対して、PnP は DriverVer が最も高い INF を選択します。
注
拡張機能 INF が Windows 10 S を対象とする場合、そのバージョンの Windows でのドライバーのインストールについては、Windows 10 in S mode ドライバー要件を参照してください。
[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 が不可能な場合、または制限が十分でない場合に使用できます。
SPSVCINST_ASSOCSERVICEでサービス を定義しないでください。 拡張 INF では、デバイスのファンクション ドライバーを提供できません。 ただし、拡張 INF では、デバイスのフィルター ドライバーなど、他のサービスを定義できます。 サービスの指定の詳細については、「INF AddService ディレクティブ」を参照してください。
ほとんどの場合、基本ドライバー パッケージとは別に、拡張 INF ドライバー パッケージをハードウェア デベロッパー センターに提出します。 拡張 INF をパッケージ化する方法の例とサンプル コードへのリンクについては、「DCH 準拠ドライバー パッケージの例」を参照してください。
ドライバーの検証と提出プロセスは、拡張 INF についても基本ドライバー パッケージの場合と同じです。 詳しくは、「Windows HLK の使用開始」をご覧ください。
拡張ドライバーのアンインストール
拡張ドライバー パッケージをシステムから削除し、それを使用している任意のデバイスからアンインストールするには、PnPUtil のdelete-driver コマンドを uninstall フラグ付きで使用します。 これにより、基本ドライバー パッケージを削除せずに、拡張ドライバー パッケージをデバイスからアンインストールできます。
アンインストールするドライバー パッケージの 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,,"{00001111-aaaa-2222-bbbb-3333cccc4444}"
HKCR,AppID\{00001111-aaaa-2222-bbbb-3333cccc4444},,,"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 を操作する方法の詳細については、「Windows ハードウェア デベロッパー センター ダッシュボードでの拡張機能 INF の操作」を参照してください。