为文件系统驱动程序创建 INF 文件

关于文件系统 INF 文件

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

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

有关 INF 文件的详细信息,请参阅 创建 INF 文件和INF 文件节和指令。 有关对驱动程序进行签名的常规信息,请参阅 驱动程序签名

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

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

  • 非 PnP 驱动程序(包括文件系统驱动程序)的 INF 文件不需要包含 [Manufacturer] 或 [Models] 部分。

  • 位于 WDK 安装目录的 \bin\SelfSign 目录中的 SignTool 命令行工具可用于直接对驱动程序 SYS 可执行文件进行“嵌入签名”。 出于性能原因,启动驱动程序必须包含嵌入式签名。

  • 给定 INF 文件后, Inf2Cat 命令行工具可用于为驱动程序包创建目录 (.cat) 文件。

  • 使用管理员权限,从 Windows Vista 开始,仍可以在基于 x64 的系统上安装未签名的驱动程序。 但是,驱动程序将无法加载 (,因此无法执行) ,因为它未签名。

  • 有关驱动签名过程的详细信息,包括 64 位版本的 Windows Vista 的驱动签名过程,请参阅 内核模式代码签名演练

  • 所有内核模式组件(包括自定义内核模式开发工具)都必须签名。 有关详细信息,请参阅 在开发和测试期间对驱动程序进行签名 (Windows Vista 及更高版本)

INF 文件不能用于从注册表中读取信息或启动用户模式应用程序。

文件系统驱动程序 INF 文件中的节

若要构造自己的文件系统驱动程序 INF 文件,请使用以下信息作为指南。 可以使用 InfVerif 工具检查 INF 文件的语法。

文件系统驱动程序的 INF 文件通常包含以下部分。

版本部分 (必需)

“版本”部分指定驱动程序版本信息,如以下代码示例所示。

[Version]
Signature   = "$WINDOWS NT$"
Provider    = %Msft%
DriverVer   = 08/28/2000,1.0.0.1
CatalogFile =

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

条目
Signature “$WINDOWS NT$”
提供程序 在你自己的 INF 文件中,应指定 Microsoft 以外的提供程序。
DriverVer 请参阅 INF DriverVer 指令
CatalogFile 将此条目留空。 将来,它将包含已签名驱动程序的 WHQL 提供的目录文件的名称。

DestinationDirs 部分指定将复制文件系统驱动程序文件的目录。

在本部分和 ServiceInstall 部分中,可以使用系统定义的数值指定已知的系统目录。 有关这些值的列表,请参阅 INF DestinationDirs 部分。 在下面的代码示例中,值“12”是指 Drivers 目录 (%windir%\system32\drivers) 。

[DestinationDirs]
DefaultDestDir = 12
ExampleFileSystem.DriverFiles = 12

SourceDisksNames 节 (必需)

SourceDisksNames 节指定要使用的分发媒体。

在下面的代码示例中, SourceDisksNames 部分列出了文件系统驱动程序的单个分发媒体。 媒体的唯一标识符为 1。 媒体的名称由 %Disk1% 令牌指定,该令牌在 INF 文件的 Strings 节中定义。

[SourceDisksNames]
1 = %Disk1%

SourceDisksFiles 节 (必需)

SourceDisksFiles 部分指定要复制的文件的位置和名称。

在下面的代码示例中, SourceDisksFiles 部分列出了要为文件系统驱动程序复制的文件,并指定可以在唯一标识符为 1 的媒体上找到文件 (此标识符在 INF 文件的 SourceDisksNames 节中定义 )

[SourceDisksFiles]
examplefilesystem.sys = 1

DefaultInstall 节 (必需)

DefaultInstall 节中, CopyFiles 指令将文件系统驱动程序的驱动程序文件复制到 DestinationDirs 节中指定的目标。

注意

CopyFiles 指令不应引用目录文件或 INF 文件本身;SetupAPI 会自动复制这些文件。

可以创建单个 INF 文件,在多个版本的 Windows 操作系统上安装驱动程序。 此类型的 INF 文件是通过为每个操作系统版本创建其他 DefaultInstallDefaultInstall.ServicesDefaultUninstallDefaultUninstall.Services 部分来创建的。 每个节都标有 修饰 (例如.ntx86、.ntia64 或 .nt) ,用于指定应用它的操作系统版本。 有关创建此类 INF 文件的详细信息,请参阅 为多个平台和操作系统创建 INF 文件

在下面的代码示例中, CopyFiles 指令复制 INF 文件的 ExampleFileSystem.DriverFiles 节中列出的文件。

[DefaultInstall]
OptionDesc = %ServiceDesc%
CopyFiles = ExampleFileSystem.DriverFiles

[ExampleFileSystem.DriverFiles]
examplefilesystem.sys

DefaultInstall.Services 节 (必需)

DefaultInstall.Services 部分包含一个 AddService 指令,该指令控制加载特定驱动程序的服务的方式和时间。

在下面的代码示例中, AddService 指令将文件系统服务添加到操作系统。 %ServiceName% 令牌包含 INF 文件的 Strings 节中定义的服务名称字符串。 ExampleFileSystem.Service 是文件系统驱动程序的 ServiceInstall 节的名称。

[DefaultInstall.Services]
AddService = %ServiceName%,,ExampleFileSystem.Service

ServiceInstall 节 (必需)

ServiceInstall 部分将子项或值名称添加到注册表并设置值。 ServiceInstall 节的名称必须出现在 DefaultInstall.Services 节AddService 指令中。

下面的代码示例演示文件系统驱动程序的 ServiceInstall 部分。

[ExampleFileSystem.Service]
DisplayName    = %ServiceName%
Description    = %ServiceDesc%
ServiceBinary  = %12%\examplefilesystem.sys
ServiceType    = 2 ;    SERVICE_FILE_SYSTEM_DRIVER
StartType      = 1 ;    SERVICE_SYSTEM_START
ErrorControl   = 1 ;    SERVICE_ERROR_NORMAL
LoadOrderGroup = "File System"
AddReg         = ExampleFileSystem.AddRegistry

DisplayName 条目指定服务的名称。 在前面的示例中,服务名称字符串由 %ServiceName% 令牌指定,该标记在 INF 文件的 Strings 节中定义。

Description 条目指定描述服务的字符串。 在前面的示例中,此字符串由 %ServiceDesc% 标记指定,该标记在 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

有关这些启动类型的详细说明,以确定哪个启动类型适合文件系统驱动程序,请参阅 确定何时加载驱动程序

从基于 x64 的 Windows Vista 系统开始,启动启动驱动程序的二进制映像文件 (启动类型为SERVICE_BOOT_START) 的驱动程序必须包含嵌入签名。 此要求可确保最佳系统启动性能。 有关详细信息,请参阅 内核模式代码签名演练

有关 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 条目必须始终设置为“文件系统”。 这与为文件系统筛选器驱动程序或文件系统微筛选器驱动程序指定的不同,其中 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 文件的 ExampleFileSystem.DriverFiles 节中列出的文件。

[DefaultUninstall]
DelFiles   = ExampleFileSystem.DriverFiles
DelReg     = ExampleFileSystem.DelRegistry

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

DefaultUninstall.Services 节 (可选)

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

在以下代码示例中, DelService 指令从操作系统中删除文件系统驱动程序的服务。

[DefaultUninstall.Services]
DelService = %ServiceName%,0x200

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

注意

某些类别的文件系统产品无法完全卸载。 在这种情况下,可以只卸载可卸载的产品组件,并保留无法卸载的产品组件。 此类产品的一个示例是 Microsoft 单实例存储 (SIS) 功能。

字符串部分 (必需)

Strings 部分定义 INF 文件中使用的每个 %strkey% 令牌。

例如,文件系统驱动程序在其 INF 文件中定义以下字符串。

[Strings]
Msft        = "Microsoft Corporation"
ServiceDesc = "Example File System Driver"
ServiceName = "ExampleFileSystem"
ParameterPath = "SYSTEM\CurrentControlSet\Services\ExampleFileSystem\Parameters"
Disk1       = "Example File System Driver CD"

可以通过创建其他特定于区域设置的 字符串来创建单个国际 INF 文件。INF 文件中的 LanguageID 部分。 有关国际 INF 文件的详细信息,请参阅 创建国际 INF 文件