次の方法で共有


ドライバー パッケージの分離に従うように INF を移植する

この記事は、ドライバーパッケージを ウィンドウドライバー に更新する一環として、 ドライバーパッケージの分離 に従ってINFファイルを更新するのに役立つクイック検索ガイドを目的としています。 次のセクションでは、ドライバー パッケージ INF ファイルに含まれる場合がある、より一般的なもののいくつかの例を示しています。同時に、それらをドライバー パッケージの分離に準拠するように更新する方法に関する情報の参照先も示しています。 ドライバー パッケージで新しいバージョンのオペレーティング システムで新しいやり方を使用するが、以前のバージョンのオペレーティング システムに対して以前のやり方をサポートする必要がある場合、それを INF で実現する方法については、「プラットフォーム拡張機能とオペレーティング システム バージョンを組み合わせる」を参照してください。

DestinationDirsはDIRID 13ではありません

DestinationDirsセクションDIRID 13ではないファイルの宛先を指定している場合、INFはドライバー パッケージ分離に準拠していません。 ドライバー パッケージ内のすべてのファイルは ドライバー ストアから実行 される必要があり、これは DIRID 13 を使用することを意味します。 これには、DestinationDirsセクション以外の部分の更新も必要になる場合があります。 INF によってペイロードされたファイルを参照する、INF によって実行されるその他の操作も、更新が必要な場合があります。 たとえば、AddService ディレクティブ、または AddReg ディレクティブによって書き込まれたレジストリ値によって参照されるサービス インストール セクションの ServiceBinary ディレクティブを更新する必要がある場合があります。 一般に、ドライバー ストアからの実行は Windows 10 1709 以降のバージョンの Windows でサポートされていますが、一部のデバイス スタックでは、ドライバー ストアから実行されるそれらのスタックにプラグインされるファイルが後のリリースまでサポートされていない場合があります。 詳細については、 ドライバー ストアからの実行を参照。

AddReg を使用して ETW プロバイダーと EventLog チャネルを登録している

INFが AddReg ディレクティブ を使用してETWプロバイダーとEventLog チャネルを登録する場合、INFはドライバーパッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "OwningPublisher", 0x0, "{35356277-0b54-43da-b324-671006d74759}"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Enabled", 0x00010001, 1
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Isolation", 0x00010001, 1
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "ChannelAccess",0x0, \
"O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x3;;;BO)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x3;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Type", 0x00010001, 2
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}" , , 0x0, "ExampleProvider"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}", "ResourceFileName", 0x00020000, "%13%\ExampleBinary.sys"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}", "MessageFileName", 0x00020000, "%13%\ExampleBinary.sys"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", , 0x0, "ExampleProvider/Analytic"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", "Id", 0x00010001, 16
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", "Flags", 0x00010001, 0
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences", Count, 0x00010001, 1

AddReg を使用して ETW プロバイダーと EventLog チャネルを登録する代わりに、 DDInstall.Events セクションAddEventProvider ディレクティブ を使用して登録する必要があります。 次に例を示します。

[ExampleDDInstall.Events]
AddEventProvider={35356277-0b54-43da-b324-671006d74759}, Example_EVvntProvider_Inst

[Example_EventProvider_Inst]
ProviderName=ExampleProvider
ResourceFile=%13%\ExampleBinary.sys
MessageFile=%13%\ExampleBinary.sys
AddChannel=ExampleProvider/Analytic,0x3,Example_Channel_Inst ; Note that the type of the channel here is different than in the raw AddReg. Please see the AddEventProvider documentation for appropriate values

[Example_Channel_Inst]
Isolation=1
Access="O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x3;;;BO)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x3;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)"
Enabled=1
Value=16

DDInstall.Events セクションAddEventProvider ディレクティブ の使用は、Windows 10 1809 以降のバージョンの Windows でサポートされています。

AddReg を使用して AutoLogger を登録している

INFが AddReg ディレクティブ を使用してETW AutoLogger を登録または変更する場合、INFはドライバーパッケージ分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, BufferSize, %REG_DWORD%, 0x00000040
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, GUID, %REG_SZ%, "{6f1373c7-eec8-495c-bfe5-1270336368df}"
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, Start, %REG_DWORD%, 0x00000001
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, MaximumBuffers, %REG_DWORD%, 0x00000040
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, LogFileMode, %REG_DWORD%, 0x400
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, EnableLevel, %REG_DWORD%, 0x00000004
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, MatchAnyKeyword, %REG_QWORD%, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, Enabled, %REG_DWORD%, 0x00000001

AddReg を使用して AutoLogger を登録または更新する代わりに、 DDInstall.Events セクションAddAutoLogger または UpdateAutoLogger ディレクティブ を使用して登録または更新する必要があります。 次に例を示します。

[ExampleDDInstall.Events]
AddAutoLogger=ExampleAutoLogger,{6f1373c7-eec8-495c-bfe5-1270336368df},Example_AutoLogger_Inst

[Example_AutoLogger_Inst]
Start=1
BufferSize = 0x40
LogFileMode=0x400
MaximumBuffers=0x40
AddAutoLoggerProvider={35356277-0b54-43da-b324-671006d74759},Example_AutoLoggerProvider_Inst

[Example_AutoLoggerProvider_Inst]
Enabled=1
EnableLevel=0x4
MatchAnyKeyword=0

DDInstall.Events セクションAddAutoLogger または UpdateAutoLogger ディレクティブ の使用は、Windows 11 以降のバージョンの Windows でサポートされています。

AddRegを使用してRunOnce キーにエントリを追加する

INFが AddReg ディレクティブ を使用してRunOnce キーにエントリを追加する場合、INF はドライバーパッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce, ExampleEntry, ,"application.exe"

これはサポートされていません。 INFはグローバルレジストリエントリを変更しないでください。 ドライバーパッケージのインストール時に 1 回限りのセットアップ アクションが必要な場合は、 コンポーネントINFファイル 内から AddSoftware ディレクティブ を使用して起動できます。 これは重要ではないアクションのみに適用されます。 このドライバーパッケージでインストールされるデバイスの重要な機能は、デバイスのインストールの外部で実行されるアクションに依存すべきではありません。

AddRegを使用してRun キーにエントリを追加する

INFが AddReg ディレクティブ を使用してRunキーにエントリを追加する場合、INFはドライバー パッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM, Software\Microsoft\Windows\CurrentVersion\Run, ExampleEntry, ,"application.exe"

これはサポートされていません。 INFはグローバルレジストリエントリを変更しないでください。 Run エントリが付加価値ソフトウェアをシステムに追加する場合、アプリケーションはユニバーサルウィンドウプラットフォーム アプリケーションであり、 DDInstall.Software セクションから AddSoftware ディレクティブ を使用してインストールされる必要があります。 詳細については、ドライバーとユニバーサルウィンドウプラットフォーム (UWP) アプリの組み合わせを参照。 このソフトウェアが UI を表示する必要のないサービスの場合は、 AddService ディレクティブ を使用してドライバーパッケージからWin32 サービスを登録できます。 デバイスに関連付けられたサービスを登録する場合、そのサービスはデバイスが存在する場合にのみ実行される必要があります。 サービスの開始タイプは「デマンド開始」である必要があり、サービス インストール セクションのAddTrigger ディレクティブを使用して、デバイスがシステム上に存在するときにサービスを開始するトリガーを設定する必要があります。 これは、デバイス上のドライバーが公開するデバイスインターフェイスを識別し、AddTrigger ディレクティブを使用して、そのハードウェアが表示されたときにサービスを開始するように指定することによって行われます。 実行時に、サービスはデバイスが停止することを監視する必要があります。 デバイスがシステムから削除され、サービスを実行し続ける必要がなくなった場合、サービスは自動的に停止する必要があります。 デバイスインターフェイスの到着および削除の通知を登録するには、 CM_Register_Notificationを参照。

CopyFilesを使用してファイルを「Program Files」ディレクトリに追加する

INFがCopyFiles ディレクティブを使用してファイルを「Program Files」ディレクトリに追加する場合、INFはドライバー パッケージの分離に準拠していません。 これには、DIRIDs 16422、16426、16427、および16428の使用が含まれますが、これらに限定されません。 たとえば、INF が次のようになっている場合があります。

[DestinationDirs]
Example_CopyFiles = 16422, Contoso

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleFile.exe

これはサポートされていません。 INF はファイルをグローバルな場所にコピーしないでください。 「Program Files」ディレクトリは通常、ドライバーではなくソフトウェア アプリケーションをインストールするために使用されます。 ドライバーと通信するデバイス用のコンパニオン アプリケーションを構築して提供することが目標の場合は、ハードウェア サポート アプリの案内を参照。 たとえば、アプリケーションはユニバーサルウィンドウプラットフォームのアプリケーションであり、 DDInstall.Softwareセクションから AddSoftware ディレクティブ を使用してインストールできます。 詳細については、「ドライバーとユニバーサル Windows プラットフォーム (UWP) アプリとのペアリング」を参照してください。 CopyFiles エントリでコンパニオンのアプリケーションをシステムに追加せず、ファイルをドライバーパッケージの一部として残す必要がある場合は、ファイルを「ドライバー ストアから実行」するようにする必要があります。

UI を起動する CoInstaller

INFがCoInstallerを使用して、ユーザーが操作する必要があるアプリケーションをインストールする場合、INFはドライバーパッケージの分離に準拠していません。 たとえば、INF で次のように CoInstaller を登録する場合があります。

[ExampleDDInstall.CoInstallers]
CopyFiles = CoInstallerCopyFilesSection
AddReg = Example_CoInstallers_AddReg

[CoInstallerCopyFilesSection]
ExampleCoInstall.dll

[Example_CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"ExampleCoInstall.dll,ExampleCoInstallEntryPoint"

この状況に対処する方法については、ドライバー パッケージからの共同・インストーラーの削除を参照。

AddRegを使用してINFによって追加されていないサービスを変更します

INFが AddReg ディレクティブ を使用して、INF内のAddService ディレクティブによって追加されていないサービスの状態を変更する場合、INF はドライバーパッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM,SYSTEM\CurrentControlSet\Services\ServiceNotCreatedByThisInf\ExampleKey, ExampleValue, %REG_DWORD%, 1

これはサポートされていません。 INF では、その INF によって作成されたサービスの設定のみを変更する必要があり、INF ではこの AddReg を削除する必要があります。

AddReg を使用してサービスのルートの状態を変更している

INFが AddReg ディレクティブ を使用してサービスの状態のルートにキーまたは値を作成する場合、INFはドライバーパッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst

[Example_Service_Inst]
DisplayName   = %SvcDesc%
ServiceType   = %SERVICE_KERNEL_DRIVER%
StartType     = %SERVICE_DEMAND_START%
ErrorControl  = %SERVICE_ERROR_NORMAL%
ServiceBinary = %13%\ExampleBinary.sys
AddReg = Example_Service_Registry

[Example_Service_Registry]
HKR,,ExampleValue,%REG_DWORD%,0x00000040
HKR,CustomSubkey,ExampleValue,%REG_DWORD%,0x00000040

ドライバー パッケージ分離に準拠するために、サービス レジストリ キーと値を提供する AddReg ディレクティブは、サービスの Parameters サブキーの下にあるキーと値のみを変更できます。

INF が読み込み順序グループ、サービス トリガーなどの組み込みサービスの状態を変更している場合は、 AddService ディレクティブで説明されているように、組み込みの INF ディレクティブを使用してその状態を指定する必要があります。

INFがサービスのルートで他の状態を作成または変更している場合は、設定をサービスのParametersサブキーの下に移動し、Parametersサブキーには、実行時にDriverRegKeyParametersのRegKeyTypeを使用して IoOpenDriverRegistryKey で アクセスできます。 IoOpenDriverRegistryKey は、Windows 10 1803 以降のバージョンの Windows でサポートされています。

HKCR AddReg を使用して APO を登録している

INFがHKCR レジストリ ルートで AddReg ディレクティブ を使用してAudio Processing Object (APO)を登録する場合、INFはドライバーパッケージ分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "FriendlyName", , %APO_FriendlyName%
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "Copyright", , %MfgName%
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MajorVersion", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinorVersion", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "Flags", 0x00010001, 0x0000000d
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinInputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxInputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinOutputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxOutputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxInstances", 0x00010001, 0xffffffff
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "NumAPOInterfaces", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "APOInterface0", , "{b0a50980-ded6-4f45-84cb-19d2d1245f6d}"

代わりに、DDInstall セクションの AddReg ディレクティブによって参照されるセクションに APO 登録情報が含まれている必要があります。 デバイスの「ソフトウェア」 (「ドライバー」とも呼ばれる) レジストリ状態の場所に相対的な設定を配置するには、HKCRレジストリ ルートを HKRレジストリ ルートに変更する必要があります。 詳細については、 INFファイルでの処理モードと効果のAPOの登録 を参照。

UMDFドライバーのバージョンが2未満です

ドライバーパッケージのペイロードに、バージョン 2 より前の UMDFバージョンを使用するユーザー・モードドライバーフレームワーク (UMDF) ドライバーが含まれている場合、そのドライバーは 「ウィンドウドライバー」に準拠していません。 UMDFドライバーをより新しい UMDFバージョンに移行する方法の詳細については、 UMDF 1 から UMDF 2へのドライバーの移植 を参照。

AddRegを使用して上位または下位のフィルターをデバイス スタックに追加します

INFが AddReg ディレクティブ を使用して上位フィルターまたは下位フィルターをデバイス スタックに追加する場合、INFはドライバーパッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall.HW]
AddReg = FilterAddReg

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

その代わりに、 AddFilter ディレクティブを使用してフィルターをデバイス スタックに追加する必要があります。 次に例を示します。

[ExampleDDInstall.Filters]
AddFilter = ExampleFilterDriver,, ExampleFilterSection

[ExampleFilterSection]
FilterPosition = Upper

デバイスフィルターの追加の詳細については、 デバイスフィルター ドライバーの注文 を参照。

メディア カテゴリ名の値を登録するために、AddRegを使用しています

INFが AddReg ディレクティブ を使用してメディア カテゴリ名の値を登録する場合、INFはドライバーパッケージの分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\MediaCategories\%ExampleGuid%,Name,,%ExampleName%

AddRegを使用してグローバルレジストリの場所にメディアカテゴリ名を登録する代わりに、 DDInstall セクションの HKR AddRegを使用してデバイス相対状態で登録する必要があります。 次に例を示します。

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKR,MediaCategories\%ExampleGuid%,Name,,%ExampleName%

デバイスの相対状態を使用したメディア カテゴリ名の登録は、ウィンドウ10 バージョン 1809 以降のバージョンのウィンドウでサポートされています。 詳細については、 オーディオ エンドポイントデバイス 向けのフレンドリネーム」を参照。

メディア カテゴリ表示値を登録するために、AddRegを使用しています

INFが AddReg ディレクティブ を使用してメディア カテゴリ表示値を登録する場合、INFはドライバーパッケージ分離に準拠していません。 たとえば、INF が次のようになっている場合があります。

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\MediaCategories\%ExampleGuid%,Display,1,00,00,00,00

この値は使用されないため、INFから削除する必要があります。