为旧版文件系统筛选器驱动程序创建 INF 文件

注意

为了获得最佳可靠性和性能,请使用支持筛选器管理器的 文件系统微筛选器驱动程序 ,而不是旧版文件系统筛选器驱动程序。

Windows 安装程序和设备安装程序服务(统称为 SetupAPI)提供控制 Windows 安装和驱动程序安装的功能。 安装过程由 INF 文件控制。

文件系统筛选器驱动程序的 INF 文件提供安装程序API 用于安装驱动程序的说明。 INF 文件是一个文本文件,它指定驱动程序必须存在的文件才能运行,以及驱动程序文件的源目录和目标目录。 INF 文件还包含 SetupAPI 存储在注册表中的驱动程序配置信息,例如驱动程序的启动类型和加载顺序组。

有关 INF 文件及其创建方式的详细信息,请参阅 创建 INF 文件和INF 文件节和指令。 有关对驱动程序进行签名的一般信息,请参阅 驱动程序签名

可以创建单个 INF 文件,在多个版本的 Windows 操作系统上安装驱动程序。 有关创建此类 INF 文件的详细信息,请参阅为多个平台和操作系统创建 INF 文件和创建国际 INF 文件

从 64 位版本的 Windows Vista 开始,所有内核模式组件(包括非 PnP (即插即用) 驱动程序,如文件系统驱动程序 (文件系统、旧筛选器和微筛选器驱动程序) )都必须签名才能加载和执行。 对于这些版本的 Windows 操作系统,以下列表包含与文件系统筛选器驱动程序相关的信息。

  • 非 PnP 驱动程序(包括文件系统驱动程序)的 INF 文件不需要包含 [制造商] 或 [模型] 部分。

  • 位于 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 文件通常包含以下部分。

  • 需要版本 ()

  • DestinationDirs (可选,但建议)

  • SourceDisksNames (必需)

  • SourceDisksFiles (必需)

  • DefaultInstall (必需)

  • DefaultInstall.Services (必需)

  • ServiceInstall (必需)

  • DefaultUninstall (可选)

  • DefaultUninstall.Services (可选)

  • 字符串 (必需)

版本部分 (必需)

“版本”部分指定由筛选器类型确定的类和 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

下表显示了文件系统筛选器驱动程序应在 “版本 ”部分中指定的值。

条目

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。 媒体的名称由 %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 会自动复制这些文件。

可以创建单个 INF 文件,在多个版本的 Windows 操作系统上安装驱动程序。 通过为每个操作系统版本创建其他 DefaultInstallDefaultInstall.ServicesDefaultUninstallDefaultUninstall.Services 部分来创建此类型的 INF 文件。 每个节都标有 修饰 (,例如 .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 系统开始,启动驱动程序的二进制映像文件必须包含嵌入式签名。 此要求可确保最佳系统启动性能。 有关详细信息,请参阅 内核模式代码签名演练

有关 StartTypeLoadOrderGroup 条目如何确定何时加载驱动程序的信息,请参阅 确定何时加载驱动程序

ErrorControl 条目指定在系统启动期间服务无法启动时要执行的操作。 下表列出了 ErrorControl 的可能值及其相应的错误控制值。

操作

0x00000000

SERVICE_ERROR_IGNORE (记录错误并继续系统启动。)

0x00000001

SERVICE_ERROR_NORMAL (记录错误,向用户显示消息,并继续系统启动。)

0x00000002

SERVICE_ERROR_SEVERE (切换到注册表的 LastKnownGood 控件集并继续系统启动。)

0x00000003

SERVICE_ERROR_CRITICAL (如果系统启动未使用注册表的 LastKnownGood 控件集,请切换到 LastKnownGood,然后重试。如果启动仍然失败,请运行检查 bug 例程。只有启动系统所需的驱动程序才应在其 INF 文件中指定此值。)

LoadOrderGroup 条目应设置为适合你正在开发的文件系统筛选器驱动程序类型的加载顺序组。 若要选择加载顺序组,请参阅 文件系统筛选器驱动程序的加载顺序组

AddReg 指令是指一个或多个 INF 编写器定义的 AddRegistry 部分,这些节包含要存储在新安装服务的注册表中的任何信息。

注意 如果在初始安装后还使用 INF 文件升级驱动程序,则 AddRegistry 节中包含的条目应指定0x00000002 (FLG_ADDREG_NOCLOBBER) 标志。 指定此标志将保留 HKLM\CurrentControlSet\Services 中安装后续文件时的注册表项。 例如:

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

DefaultUninstall 节 (可选)

DefaultUninstall 部分是可选的,但如果可以卸载驱动程序,则建议使用。 它包含用于删除文件和注册表项的 DelFilesDelReg 指令。

在以下代码示例中, DelFiles 指令删除驱动程序 INF 文件的 MyLegacyFilter.DriverFiles 和 MyLegacyFilter.UserFiles 部分中列出的文件:

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

DelReg 指令是指一个或多个 INF 编写器定义的 DelRegistry 部分,这些节包含要从要卸载的服务的注册表中删除的任何信息。

DefaultUninstall.Services 节 (可选)

DefaultUninstall.Services 部分是可选的,但如果可以卸载驱动程序,则建议使用。 它包含 DelService 指令,用于删除文件系统筛选器驱动程序的服务。

在以下代码示例中, DelService 指令从操作系统中删除 MyLegacyFilter 服务。

[DefaultUninstall.Services]
DelService = MyLegacyFilter,0x200

注意DelService 指令应始终指定0x200 (SPSVCINST_STOPSERVICE) 标志,以在删除服务之前停止该服务。

字符串部分 (必需)

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 文件INF 文件中的 LanguageID 部分。 有关国际 INF 文件的详细信息,请参阅 创建国际 INF 文件