レガシ ファイル システム フィルター ドライバー用の INF ファイルの作成

Note

最適な信頼性とパフォーマンスを実現するには、レガシ ファイル システム フィルター ドライバーではなく、フィルター マネージャーのサポートがあるファイル システム ミニフィルター ドライバーを使用します。

Windows セットアップおよびデバイス インストーラー サービスは、SetupAPI と総称され、Windows のセットアップとドライバー インストールを制御する機能を提供します。 インストール プロセスは INF ファイルによって制御されます。

ファイル システム フィルター ドライバーの INF ファイルにより、SetupAPI がドライバーのインストールに使用する指示が提供されます。 INF ファイルは、ドライバーの実行に必要なファイルと、ドライバー ファイルのソースと宛先のディレクトリを指定するテキスト ファイルです。 INF ファイルには、ドライバーの開始の種類や読み込み順序グループなど、SetupAPI がレジストリに格納するドライバー構成情報も含まれています。

INF ファイルの詳細とその作成方法については、「INF ファイルの作成」および「INFファイルのセクションとディレクティブ」を参照してください。 ドライバーの署名に関する一般的な情報については、「ドライバーの署名」を参照してください。

ドライバーを複数のバージョンの Windows オペレーティング システムにインストールするために、1 つの INF ファイルを作成できます。 このような INF ファイルの作成の詳細については、「複数のプラットフォームとオペレーティング システム用の INF ファイルの作成」および「国際対応 INF ファイルの作成」を参照してください。

Windows Vista の 64 ビット バージョン以降では、読み込んで実行するためにすべてのカーネル モード コンポーネントに署名する必要があります。これには、ファイル システム ドライバー (ファイル システム、レガシ フィルター、ミニフィルター ドライバー) などの非 PnP (プラグ アンド プレイ) ドライバーも含まれます。 これらのバージョンの Windows オペレーティング システムについて、ファイル システム フィルター ドライバーに関連する情報を以下の一覧に示します。

  • 非 PnP ドライバー (ファイル システム ドライバーを含む) 用の INF ファイルには、[Manufacturer] セクションまたは [Models] セクションを含める必要はありません。

  • WDK インストール ディレクトリ内の \bin\SelfSign ディレクトリにある SignTool コマンドライン ツールを使用して、ドライバーの SYS 実行可能ファイルに直接 "署名を埋め込む" ことができます。 パフォーマンス上の理由から、ブート開始ドライバーは埋め込み署名を含む必要があります。

  • INF ファイルを指定すると、Inf2Cat コマンドライン ツールを使用して、ドライバー パッケージのカタログ (.cat) ファイルを作成できます。 カタログ ファイルのみが WHQL ロゴ署名を受け取ることができます。

  • 管理者権限があれば、Windows Vista 以降の x64 ベース システムに署名されていないドライバーを引き続きインストールできます。 ただし、署名されていないため、ドライバーの読み込み (および実行) に失敗します。

  • 64 ビット バージョンの Windows Vista の署名プロセスの推進を含む、署名プロセスの推進の詳細については、「カーネルモード コード署名のチュートリアル」を参照してください。

  • カスタム カーネルモード開発ツールを含むすべてのカーネルモード コンポーネントに署名する必要があります。 詳細については、「開発およびテスト中のドライバーの署名 (Windows Vista 以降)」を参照してください。

INF ファイルは、レジストリから情報を読み取ったり、ユーザーモード アプリケーションを起動したりするためには使用できません。

INF ファイルを作成した後、通常は、セットアップ アプリケーションのソース コードを記述します。 セットアップ アプリケーションが、ユーザーモードのセットアップ関数を呼び出して、INF ファイル内の情報にアクセスし、インストール操作を実行します。

独自のフィルター ドライバー INF ファイルを作成するには、サンプル ファイル システム フィルター ドライバーの INF ファイルをテンプレートとして使用します。 InfVerif ツールを使用すると INF ファイルの構文をチェックできます。

ファイル システム フィルター ドライバーの INF ファイルには、通常、次のセクションが含まれています。

  • Version (必須)

  • DestinationDirs (省略可能、推奨)

  • SourceDisksNames (必須)

  • SourceDisksFiles (必須)

  • DefaultInstall (必須)

  • DefaultInstall.Services (必須)

  • ServiceInstall (必須)

  • DefaultUninstall (省略可能)

  • DefaultUninstall.Services (省略可能)

  • Strings (必須)

Version セクション (必須)

Version セクションでは、次の例のように、フィルターの種類によって決まるクラスと GUID を指定します。

[Version]
Signature   = "$WINDOWS NT$"
Class       = "ActivityMonitor"
ClassGuid   = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2}
Provider    = %Msft%
DriverVer   = 08/28/2000,1.0.0.1
CatalogFile =
PnpLockdown = 1

次の表に、ファイル システム フィルター ドライバーが Version セクションに指定する必要がある値を示します。

入力

Signature

"$WINDOWS NT$"

クラス

ファイル システム フィルター ドライバー クラスとクラス GUID」を参照してください。

ClassGuid

ファイル システム フィルター ドライバー クラスとクラス GUID」を参照してください。

プロバイダー

独自の INF ファイルには、Microsoft 以外のプロバイダーを指定する必要があります。

DriverVer

INF DriverVer ディレクティブ」を参照してください。

CatalogFile

このエントリは空白にしておきます。 将来的には、署名されたドライバー用の WHQL 提供カタログ ファイルの名前が含まれる予定です。

DestinationDirs セクションでは、フィルター ドライバーとアプリケーション ファイルのコピー先のディレクトリを指定します。

このセクションおよび ServiceInstall セクションでは、システム定義の数値を使用して、既知のシステム ディレクトリを指定できます。 これらの値の一覧については、「INF DestinationDirs セクション」を参照してください。 次のコード例で、値 "12" は Drivers ディレクトリ (%windir%\system32\drivers) を参照し、値 "10" は Windows ディレクトリ (%windir%) を参照します。

[DestinationDirs]
DefaultDestDir             = 12
MyLegacyFilter.DriverFiles = 12
MyLegacyFilter.UserFiles   = 10,MyLegacyFilter

SourceDisksNames セクション (必須)

SourceDisksNames セクションでは、使用する配布メディアを指定します。

次のコード例では、SourceDisksNames セクションに 1 つの配布メディアが指定されています。 メディアの一意識別子は 1 です。 メディアの名前は %Disk1% トークンによって指定されます。これは、INF ファイルの Strings セクションで定義されています。

[SourceDisksNames]
1 = %Disk1%

SourceDisksFiles セクション (必須)

SourceDisksFiles セクションでは、コピーするファイルの場所と名前を指定します。

次のコード例では、SourceDisksFiles セクションに、ドライバーのためにコピーするファイルと、一意識別子 1 のメディアにそのファイルがあることを指定します (この識別子は INF ファイルの SourceDisksNames セクションで指定されます)。

[SourceDisksFiles]
myLegacyFilter.exe = 1
myLegacyFilter.sys = 1

DefaultInstall セクション (必須)

DefaultInstall セクションでは、CopyFiles ディレクティブによって、DestinationDirs セクションに指定されている宛先にファイル システム フィルター ドライバーのドライバー ファイルとユーザーアプリケーション ファイルがコピーされます。

CopyFiles ディレクティブで、カタログ ファイルまたは INF ファイル自体を参照しないでください。これらのファイルは SetupAPI によって自動的にコピーされます。

ドライバーを複数のバージョンの Windows オペレーティング システムにインストールするために、1 つの INF ファイルを作成できます。 この種類の INF ファイルは、各オペレーティング システム バージョンに対して、追加の DefaultInstallDefaultInstall.ServicesDefaultUninstallDefaultUninstall.Services セクションを作成することで作成されます。 各セクションには、適用先のオペレーティング システムのバージョンを示す修飾 (.ntx86、.ntia64、.nt など) を含むラベルが付けられます。 この種類の INF ファイルの作成の詳細については、「複数のプラットフォームとオペレーティング システム用の INF ファイルの作成」を参照してください。

次のコード例では、CopyFiles ディレクティブによって、INF ファイルの MyLegacyFilter.DriverFiles セクションと MyLegacyFilter.UserFiles セクションに指定されているファイルがコピーされます。

[DefaultInstall]
OptionDesc = %MyLegacyFilterServiceDesc%
CopyFiles = MyLegacyFilter.DriverFiles, MyLegacyFilter.UserFiles

DefaultInstall.Services セクション (必須)

DefaultInstall.Services セクションには、特定のドライバーのサービスが読み込まれる方法とタイミングを制御する AddService ディレクティブが含まれます。

次のコード例では、AddService ディレクティブによって MyLegacyFilter サービスがオペレーティング システムに追加されます。 %MyLegacyFilterServiceName% トークンにはサービス名文字列が含まれます。これは、INF ファイルの Strings セクションに定義されています。 MyLegacyFilter.Service は、例のドライバーの ServiceInstall セクションの名前です。

[DefaultInstall.Services]
AddService = %MyLegacyFilterServiceName%,,MyLegacyFilter.Service

ServiceInstall セクション (必須)

ServiceInstall セクションでは、サブキーまたは値の名前がレジストリに追加され、値が設定されます。 ServiceInstall セクションの名前は、DefaultInstall.Services セクションのAddService ディレクティブに指定されている必要があります。

次のコード例は、ドライバー例 MyLegacyFilter の ServiceInstall セクションを示しています。

[MyLegacyFilter.Service]
DisplayName    = %MyLegacyFilterServiceName%
Description    = %MyLegacyFilterServiceDesc%
ServiceBinary  = %12%\myLegacyFilter.sys
ServiceType    = 2 ;    SERVICE_FILE_SYSTEM_DRIVER
StartType      = 3 ;    SERVICE_DEMAND_START
ErrorControl   = 1 ;    SERVICE_ERROR_NORMAL
LoadOrderGroup = "FSFilter Activity Monitor"
AddReg         = MyLegacyFilter.AddRegistry

DisplayName エントリでは、サービスの名前を指定します。 前の例では、サービス名文字列は %MyLegacyFilterServiceName% トークンによって指定されます。これは、INF ファイルの Strings セクションに定義されています。

Description エントリでは、サービスについて説明する文字列を指定します。 前の例では、この文字列は %MyLegacyFilterServiceDesc% トークンによって指定されます。これは、INF ファイルの Strings セクションに定義されています。

ServiceBinary エントリでは、サービスの実行可能ファイルのパスを指定します。 前の例で、値 12 は Drivers ディレクトリ (%windir%\system32\drivers) を参照しています。

ServiceType エントリは、サービスの種類を指定します。 次の表に、ServiceType に指定できる値と、対応するサービスの種類を示します。

説明

0x00000001

SERVICE_KERNEL_DRIVER (デバイス ドライバー サービス)

0x00000002

SERVICE_FILE_SYSTEM_DRIVER (ファイル システムまたはファイル システム フィルター ドライバー サービス)

0x00000010

SERVICE_WIN32_OWN_PROCESS (それ自体のプロセスで実行される Microsoft Win32 サービス)

0x00000020

SERVICE_WIN32_SHARE_PROCESS (プロセスを共有する Win32 サービス)

ServiceType エントリは、ファイル システム フィルター ドライバーに対しては常に SERVICE_FILE_SYSTEM_DRIVER に設定する必要があります。

StartType エントリは、サービスを起動するタイミングを指定します。 次の表に、StartType に指定できる値と、対応する開始の種類を示します。

説明

0x00000000

SERVICE_BOOT_START

0x00000001

SERVICE_SYSTEM_START

0x00000002

SERVICE_AUTO_START

0x00000003

SERVICE_DEMAND_START

0x00000004

SERVICE_DISABLED

これらの開始の種類の詳細については、「ドライバーが読み込まれるタイミングを決定する方法」を参照してください。

ドライバーの開始の種類が SERVICE_BOOT_START (つまり、ドライバーがブート開始ドライバー) である場合は、LoadOrderGroup エントリが、開発しているフィルターの種類に適していることも確認する必要があります。 読み込み順序グループを選択するには、「ファイル システム フィルター ドライバーの読み込み順序グループ」を参照してください。 さらに、x64 ベース Windows Vista 以降のシステムでは、ブート開始ドライバーのバイナリ イメージ ファイルが埋め込み署名を含む必要があります。 この要件により、最適なシステム ブート パフォーマンスが保証されます。 詳細については、「カーネルモードのコード署名のチュートリアル」を参照してください。

StartType エントリと LoadOrderGroup エントリによって、ドライバーがいつ読み込まれるかが決まる方法については、「ドライバーが読み込まれるタイミングを決定する方法」を参照してください。

ErrorControl エントリは、システムの起動時にサービスが開始できなかった場合に実行するアクションを指定します。 次の表に、ErrorControl に指定できる値と、それに対応するエラー制御値を示します。

アクション

0x00000000

SERVICE_ERROR_IGNORE (エラーをログに記録し、システムの起動を続行します)。

0x00000001

SERVICE_ERROR_NORMAL (エラーをログに記録し、ユーザーにメッセージを表示して、システムの起動を続行します)。

0x00000002

SERVICE_ERROR_SEVERE (レジストリの LastKnownGood 制御設定に切り替えて、システムの起動を続行します)。

0x00000003

SERVICE_ERROR_CRITICAL (システムの起動でレジストリの LastKnownGood 制御設定が使用されない場合は、LastKnownGood に切り替えてから再試行してください。それでも起動に失敗する場合は、バグチェック ルーチンを実行します。システムの起動に必要なドライバーのみが、INF ファイルにこの値を指定する必要があります)。

LoadOrderGroup エントリは、開発しているファイル システム フィルター ドライバーの種類に適した適切な読み込み順序グループに設定する必要があります。 読み込み順序グループを選択するには、「ファイル システム フィルター ドライバーの読み込み順序グループ」を参照してください。

AddReg ディレクティブは、INF ライター定義の 1 つ以上の AddRegistry セクション (新しくインストールされるサービスのためにレジストリに格納される情報を含む) を参照します。

初期インストールの後で INF ファイルがドライバーのアップグレードにも使用される場合、AddRegistry セクションに含まれるエントリによって 0x00000002 (FLG_ADDREG_NOCLOBBER) フラグを指定する必要があります。 このフラグを指定すると、後続のファイルがインストールされるときに HKLM\CurrentControlSet\Services のレジストリ エントリが保持されます。 次に例を示します。

[ExampleFileSystem.AddRegistry]
HKR,Parameters,ExampleParameter,0x00010003,1

DefaultUninstall セクション (省略可能)

DefaultUninstall セクションは省略可能ですが、ドライバーをアンインストールできる場合は推奨されます。 ファイルとレジストリ エントリを削除するための、DelFiles ディレクティブと DelReg ディレクティブが含まれます。

次のコード例では、DelFiles ディレクティブによって、ドライバーの INF ファイルの MyLegacyFilter.DriverFiles セクションと MyLegacyFilter.UserFiles セクションに指定されているファイルが削除されます。

[DefaultUninstall]
DelFiles   = MyLegacyFilter.DriverFiles, MyLegacyFilter.UserFiles
DelReg     = MyLegacyFilter.DelRegistry

DelReg ディレクティブは、INF ライター定義の 1 つ以上の DelRegistry セクションを参照します。このセクションには、アンインストールするサービスについてレジストリから削除する情報が含まれます。

DefaultUninstall.Services セクション (省略可能)

DefaultUninstall.Services セクションは省略可能ですが、ドライバーをアンインストールできる場合は推奨されます。 ファイル システム フィルター ドライバーのサービスを削除するための DelService ディレクティブが含まれます。

次のコード例では、DelService ディレクティブによって MyLegacyFilter サービスがオペレーティング システムから削除されます。

[DefaultUninstall.Services]
DelService = MyLegacyFilter,0x200

DelService ディレクティブでは、削除する前にサービスを停止するために常に 0x200 (SPSVCINST_STOPSERVICE) フラグを指定する必要があります。

Strings セクション (必須)

Strings セクションでは、次の例のように、INF ファイルで使用される各 %strkey% トークンを定義します。

[Strings]
Msft                      = "Microsoft Corporation"
MyLegacyFilterServiceDesc = "MyLegacyFilterFilter Driver"
MyLegacyFilterServiceName = "MyLegacyFilter"
MyLegacyFilterRegistry    = "system\currentcontrolset\services\MyLegacyFilter"
MyLegacyFilterMaxRecords  = "MaxRecords"
MyLegacyFilterMaxNames    = "MaxNames"
MyLegacyFilterDebugFlags  = "DebugFlags"
Disk1                     = "MyLegacyFilter Source Media"

INF ファイルに追加のロケール固有の Strings.LanguageID セクションを作成することで、1 つの国際対応 INF ファイルを作成できます。 国際対応 INF ファイルの詳細については、「国際対応 INF ファイルの作成」を参照してください。