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

本文介绍如何为文件系统驱动程序创建 INF 文件。

有关使用 INF 文件安装和卸载文件系统驱动程序的信息,请按照以下文章中针对旧文件系统筛选器驱动程序提供的准则进行作:

关于文件系统 INF 文件

Windows 安装程序和设备安装程序服务(统称为 SetupAPI)提供控制 Windows 安装和驱动程序安装的函数。 INF 文件控制安装过程。 有关 INF 文件的详细信息,请参阅 创建 INF 文件和 INF文件节和指令

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

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

从 64 位版本的 Windows Vista 开始,必须对所有内核模式组件进行签名才能加载和执行。 此要求包括非 PnP(即插即用)驱动程序,例如文件系统驱动程序(文件系统、旧筛选器和微型筛选器驱动程序)。 有关签名驱动程序的常规信息,请参阅 驱动程序签名

对于这些版本的 Windows作系统,以下信息与文件系统驱动程序相关。

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

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

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

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

  • 有关驱动签名过程的详细信息,包括 64 位版本的 Windows Vista 及更高版本的驱动签名过程,请参阅 Kernel-Mode 代码签名演练 Word 文档。

  • 所有内核模式组件(包括自定义内核模式开发工具)都必须签名。 有关详细信息,请参阅 Test-Signing简介。

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

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

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

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

版本部分(必需)

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

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

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

入口 价值
签名 “$WINDOWS NT$”
服务提供商 在你自己的 INF 文件中,应指定除Microsoft以外的提供程序。
DriverVer 请参阅 INF DriverVer 指令
CatalogFile 请参阅 使用 Inf2Cat 创建目录文件

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 条目指定服务的名称。 在前面的示例中,服务名称字符串是由在 INF 文件的 Strings 节中定义的 %ServiceName% 标记指定的。

Description 条目指定描述服务的字符串。 在前面的示例中,此字符串是由在 INF 文件的 Strings 节中定义的 %ServiceDesc% 标记指定的。

ServiceBinary 条目指定服务的可执行文件的路径。 在前面的示例中,值 12 引用驱动程序目录(%windir%\system32\drivers)。

ServiceType 条目指定服务的类型。 下表列出了 ServiceType 及其相应服务类型的可能值。

价值 DESCRIPTION
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 及其相应启动类型的可能值。

价值 DESCRIPTION
0x00000000 服务启动启动
0x00000001 服务系统启动
0x00000002 自动启动服务
0x00000003 服务需求启动
0x00000004 服务已禁用

有关这些开始类型的详细说明,以帮助确定哪个适合您的文件系统驱动程序,请参阅“决定驱动程序加载时间的因素”

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

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

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

价值 DESCRIPTION
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 文件中创建其他区域设置特定的 字符串.LanguageID 节来创建单个国际 INF 文件。 有关国际 INF 文件的详细信息,请参阅 “创建国际 INF 文件”。