新しいプリミティブ ドライバーの作成

プリミティブ ドライバーは、INF ベースのインストールを使用するが特定のハードウェア デバイスに関連付けられているとは限らないソフトウェアを処理および管理するために使用します。

プリミティブのドライバーの背景と利点

Windows 10 バージョン 1903 以前は、INF ベースのインストールを使用するが特定のハードウェア デバイスに関連付けられているとは限らない特定の種類のソフトウェアは、OS で完全にサポートされていませんでした。 これらの種類のソフトウェアではインストールのマニフェストとして INF ファイルが使用されますが、このシナリオは OS では直接認識されず、これをネイティブに処理するためのサポートがありませんでした。

これらの種類のソフトウェアは、ハードウェア デバイスに関連付けられていないため、ハードウェアを問わずシステム全体にインストールされていました。 その結果、OS のアップグレード時にこれらの種類のソフトウェアが適切にインストール、アンインストール、または処理される保証がありませんでした。

Windows 10 バージョン 1903 以降、プラグ アンド プレイ プラットフォームでは、この種類のソフトウェア パッケージが最上位レベルのエンティティとして処理および管理されます。そのため、特に OS のアップグレードとリセットのシナリオにおいて、このようなソフトウェアの信頼性が向上し、適切な動作が保証されるようになります。

この新しいプラットフォームのサポートを活用するソフトウェアの種類は、プリミティブ ドライバーと呼ばれます。プリミティブ ドライバーでは引き続き INF ベースのインストールが使用され、基になるプラットフォームではドライバー ストアを利用して関連するすべてのファイルが記録されます。

基になるプラグ アンド プレイ プラットフォームでは、OS のアップグレード時にドライバーの状態が適切にインストール、アンインストール、および維持されます。

概念的には、これらの INF は異なる方法で管理されます。 以前は、[DefaultInstall] (多くの場合、[DefaultUninstall] も) は、SetupAPI によってスクリプトのように処理されていました。つまり、INF がマニフェストとして使用され、呼び出し元の代わりに SetupAPI によって関連するセクションの手順が実行されていました。

(アンインストールを実行するために) 変更を元に戻すには、インストール セクションとは逆の一連の手順を実行する INF セクションを指定する必要がありました。 しかし、INF を利用するプリミティブ ドライバーでは、アンインストール セクションは必要ありません。

プリミティブ ドライバーでは、デバイス ドライバーと同じインストール API とアンインストール API が使用されます。アンインストール API ではインストール操作とは逆の一連の操作が実行され、ドライバー パッケージのインストールまたはアンインストールによってそれらのセクションが処理されます。

プリミティブ ドライバーの機能にアクセスするための INF の要件

  • PnP ドライバーと同様に、Version セクションに入力する必要があります。

    • Provider ディレクティブを入力する必要があります。

    • Class ディレクティブを入力する必要があります。

    • ClassGuid ディレクティブを入力する必要があります。

  • ドライバーは DCH 準拠である必要があります。

  • [Manufacturer] セクションがない場合もあります。

  • [DefaultInstall] セクションはアーキテクチャで修飾されている必要があり、装飾されていないバージョンがない場合もあります。

    • 正しい例: [DefaultInstall.amd64]

    • 誤った例: [DefaultInstall]

  • [DefaultUninstall] は INF にない場合もあります (例外については「レガシ互換性」をご覧ください)。

Windows 10 バージョン 1903 以降のみを対象とするプリミティブ ドライバー

Windows 10 バージョン 1903 のみを対象とするプリミティブ ドライバーでソフトウェアを適切にドライバー ストアにインストール/ドライバー ストアからアンインストールするには、DiInstallDriverDiUninstallDriver を使用する必要があります。

また、インストール先のドライバー ストアを適切に指定するために、Dirid 13 も使用する必要があります。

レガシ互換性

プリミティブ ドライバーでは [DefaultUninstall] が禁止されていますが、OS の下位互換性のために、例外が設けられています。 Windows に導入された INF ディレクティブは、プリミティブ ドライバーをサポートする OS バージョンで [DefaultUninstall] セクションが無視される原因となります。 ドライバー パッケージで OS の下位バージョンをサポートする必要がある場合は、そのようなケースが適切にプラットフォームで処理されるように、次の構文を含めます。

[DefaultUninstall.NTamd64]
LegacyUninstall=1

[DefaultInstall] および [DefaultUninstall] セクションは、引き続きアーキテクチャで装飾されている必要があります。ただし、LegacyUninstall=1 を含めることで、Windows で [DefaultUninstall] セクションが無視されます (Windows 10 バージョン 1903 以降)。 これを行うことにより、INF にそのセクションを含めることができ、これを従来のアプリケーションのインストール/アンインストールで使用して、プリミティブ ドライバー パッケージをアンインストールすることができます。

Windows 10 バージョン 1903 以降は、アーキテクチャで装飾された [DefaultInstall] または [DefaultUninstall] セクションを setupapi.dll で InstallHInfSection API に渡す場合、ドライバー パッケージがプリミティブ ドライバーの機能をサポートしているかどうかがチェックされます。 プリミティブ ドライバーの機能をサポートしている場合は、指定されたセクションを従来の方法で処理するのではなく、DiInstallDriver または DiUninstallDriver の適切な方に INF が渡されます。 これにより、1 つのインストーラーで、互換性のある OS バージョンではプリミティブ ドライバーを使用し、以前の OS バージョンのサポートも維持することができます。

デバイス ドライバー INF からの変換

[Manufacturer] を使用する INF を [DefaultInstall] を使用するように変換するには、INF への小さな変更が必要です。 [Manufacturer] セクションとは違い、[DefaultInstall] セクションはエントリ ポイントであり、インストール セクションでもあります。 これは、[Manufacturer]、[Models]、[DDInstall] セクションを概念的に 1 つにまとめるものです。

どのハードウェアにもインストールされないため、次の INF では InfVerif で 1297 エラーが発生します。

[Manufacturer]
%Company% = Driver, NTx86, NTamd64

[Driver.NTx86]
%DeviceDesc% = InstallSection_32,

[Driver.NTamd64]
%DeviceDesc% = InstallSection_64,

[InstallSection_64]
CopyFiles = MyCopyFiles_64
AddReg = MyAddReg

[InstallSection_64.Services]
AddService = MyService,, MyService_Install

[InstallSection_32]
CopyFiles = MyCopyFiles_x86
AddReg = MyAddReg

[InstallSection_32.Services]
AddService = MyService,, MyService_Install

上の INF は、次に示すように [DefaultInstall] ベースの INF に変換できます。

[DefaultInstall.NTamd64]
CopyFiles = MyCopyFiles_64
AddReg = MyAddReg

[DefaultInstall.NTamd64.Services]
AddService = MyService,, MyService_Install

[DefaultInstall.NTx86]
CopyFiles = MyCopyFiles_x86
AddReg = MyAddReg

[DefaultInstall.NTx86.Services]
AddService = MyService,, MyService_Install