移植 INF 以遵循驱动程序包隔离

本文旨在提供快速查找指南,帮助更新 INF 文件以遵循驱动程序包隔离,作为将驱动程序包更新为 Windows 驱动程序的一部分。 以下部分提供了驱动程序包 INF 文件中可能具有的一些更常见内容的示例,并引用了有关如何更新这些内容以符合驱动程序包隔离的信息。 如果你的驱动程序包需要支持旧操作系统版本的旧方式,同时在新操作系统版本上使用新方式,请参阅将平台扩展与操作系统版本组合在一起,了解如何在 INF 中实现此目的。

DestinationDirs 不是 DIRID 13

如果 DestinationDirs 部分为非 DIRID 13 的文件指定了目标,则 INF 不符合驱动程序包隔离的要求。 驱动程序包中的所有文件都必须从驱动程序存储区运行,这意味着使用 DIRID 13。 这可能需要更新的不仅仅是 DestinationDirs 部分。 可能还需要更新引用由 INF 进行有效负载的文件的 INF 执行的其他操作。 例如,可能需要更新由 AddService 指令引用的“服务安装”部分中的 ServiceBinary 指令,或由 AddReg 指令写入的注册表值。 一般情况下,在 Windows 10 1709 及更高版本的 Windows 上支持从驱动程序存储区运行,但某些设备堆栈可能在新版本发布之前不支持插入到这些堆栈中的文件从驱动程序存储区运行。 有关详细信息,请参阅从驱动程序存储区运行

使用 AddReg 注册 ETW 提供程序和 EventLog 通道

如果 INF 使用 AddReg 指令 注册 ETW 提供程序和 EventLog 通道,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "OwningPublisher", 0x0, "{35356277-0b54-43da-b324-671006d74759}"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Enabled", 0x00010001, 1
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Isolation", 0x00010001, 1
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "ChannelAccess",0x0, \
"O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x3;;;BO)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x3;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\ExampleProvider/Analytic", "Type", 0x00010001, 2
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}" , , 0x0, "ExampleProvider"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}", "ResourceFileName", 0x00020000, "%13%\ExampleBinary.sys"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}", "MessageFileName", 0x00020000, "%13%\ExampleBinary.sys"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", , 0x0, "ExampleProvider/Analytic"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", "Id", 0x00010001, 16
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences\0", "Flags", 0x00010001, 0
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Publishers\{35356277-0b54-43da-b324-671006d74759}\ChannelReferences", Count, 0x00010001, 1

应使用 DDInstall.Events 部分中的 AddEventProvider 指令注册 ETW 提供程序和 EventLog 通道,而不是使用 AddReg 进行注册。 例如:

[ExampleDDInstall.Events]
AddEventProvider={35356277-0b54-43da-b324-671006d74759}, Example_EVvntProvider_Inst

[Example_EventProvider_Inst]
ProviderName=ExampleProvider
ResourceFile=%13%\ExampleBinary.sys
MessageFile=%13%\ExampleBinary.sys
AddChannel=ExampleProvider/Analytic,0x3,Example_Channel_Inst ; Note that the type of the channel here is different than in the raw AddReg. Please see the AddEventProvider documentation for appropriate values

[Example_Channel_Inst]
Isolation=1
Access="O:BAG:SYD:(A;;0xf0007;;;SY)(A;;0x7;;;BA)(A;;0x3;;;BO)(A;;0x5;;;SO)(A;;0x1;;;IU)(A;;0x3;;;SU)(A;;0x1;;;S-1-5-3)(A;;0x2;;;S-1-5-33)(A;;0x1;;;S-1-5-32-573)"
Enabled=1
Value=16

Windows 10 1809 及更高版本的 Windows 支持使用 DDInstall.Events 部分中的 AddEventProvider 指令

使用 AddReg 注册 AutoLogger

如果 INF 使用 AddReg 指令 注册或修改 ETW AutoLogger,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, BufferSize, %REG_DWORD%, 0x00000040
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, GUID, %REG_SZ%, "{6f1373c7-eec8-495c-bfe5-1270336368df}"
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, Start, %REG_DWORD%, 0x00000001
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, MaximumBuffers, %REG_DWORD%, 0x00000040
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger, LogFileMode, %REG_DWORD%, 0x400
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, EnableLevel, %REG_DWORD%, 0x00000004
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, MatchAnyKeyword, %REG_QWORD%, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
HKLM,SYSTEM\CurrentControlSet\Control\WMI\Autologger\ExampleAutoLogger\{35356277-0b54-43da-b324-671006d74759}, Enabled, %REG_DWORD%, 0x00000001

应使用 DDInstall.Events 部分中的 AddAutoLogger 或 UpdateAutoLogger 指令注册或更新 AutoLogger,而不是使用 AddReg 进行注册或更新。 例如:

[ExampleDDInstall.Events]
AddAutoLogger=ExampleAutoLogger,{6f1373c7-eec8-495c-bfe5-1270336368df},Example_AutoLogger_Inst

[Example_AutoLogger_Inst]
Start=1
BufferSize = 0x40
LogFileMode=0x400
MaximumBuffers=0x40
AddAutoLoggerProvider={35356277-0b54-43da-b324-671006d74759},Example_AutoLoggerProvider_Inst

[Example_AutoLoggerProvider_Inst]
Enabled=1
EnableLevel=0x4
MatchAnyKeyword=0

Windows 11 及更高版本的 Windows 支持使用 DDInstall.Events 部分中的 AddAutoLogger 或 UpdateAutoLogger 指令

使用 AddReg 将条目添加到 RunOnce 密钥

如果 INF 使用 AddReg 指令将条目添加到 RunOnce 密钥,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce, ExampleEntry, ,"application.exe"

不支持。 INF 不应修改全局注册表项。 如果在安装驱动程序包时需要一次性安装操作,则可以使用组件 INF 文件中的 AddSoftware 指令启动它。 这仅适用于非关键操作。 使用此驱动程序包安装的设备或设备的关键功能不应依赖于在设备安装外部运行的操作。

使用 AddReg 将条目添加到 Run 密钥

如果 INF 使用 AddReg 指令将条目添加到 Run 密钥,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM, Software\Microsoft\Windows\CurrentVersion\Run, ExampleEntry, ,"application.exe"

不支持。 INF 不应修改全局注册表项。 如果 Run 条目是向系统添加值添加软件,则应用程序应为通用 Windows 平台应用程序,并使用 DDInstall.Software 部分中的 AddSoftware 指令进行安装。 有关详细信息,请参阅 将驱动程序与通用 Windows 平台 (UWP) 应用配对。 如果此软件是不需要提供任何 UI 的服务,则可以使用 AddService 指令从驱动程序包注册 Win32 服务。 注册与设备关联的服务时,服务应仅在设备存在时运行。 服务的启动类型应为“按需启动”,并且应使用服务安装部分中的 AddTrigger 指令设置触发器,以便在系统中出现设备时启动服务。 这是通过标识设备上驱动程序将公开的设备接口并使用 AddTrigger 指令指定服务应在硬件出现时启动来完成的。 在运行时,服务应监视设备是否消失。 如果设备已从系统中删除,因此服务不需要继续运行,则服务应自行停止。 要注册设备接口到达和删除通知,请参阅 CM_Register_Notification

使用 CopyFiles 将文件添加到“Program Files”目录

如果 INF 使用 CopyFiles 指令将文件添加到“Program Files”目录,则 INF 不符合驱动程序包隔离的要求。 这包括但不限于 DIRID 16422、16426、16427 和 16428 的使用。 例如,INF 可能具有:

[DestinationDirs]
Example_CopyFiles = 16422, Contoso

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleFile.exe

此操作不受支持。 INF 不应将文件复制到全局位置。 “程序文件”目录通常用于安装软件应用程序,而不是驱动程序。 如果目标是为与驱动程序通信的设备生成并提供配套应用程序,请参阅硬件支持应用指南。 例如,应用程序可以是通用 Windows 平台应用程序,并使用 DDInstall.Software 部分中的 AddSoftware 指令进行安装。 有关详细信息,请参阅将驱动程序与通用 Windows 平台 (UWP) 应用配对。 如果 CopyFiles 条目不向系统添加配套应用程序,并且文件应保留为驱动程序包的一部分,则需要将其设置为“从驱动程序存储区运行”。

启动 UI 的共同安装程序

如果 INF 使用 CoInstaller 安装用户应与之交互的应用程序,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能会注册如下所示的共同安装程序:

[ExampleDDInstall.CoInstallers]
CopyFiles = CoInstallerCopyFilesSection
AddReg = Example_CoInstallers_AddReg

[CoInstallerCopyFilesSection]
ExampleCoInstall.dll

[Example_CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"ExampleCoInstall.dll,ExampleCoInstallEntryPoint"

有关如何处理这种情况的信息,请参阅从驱动程序包中删除共同安装程序

使用 AddReg 修改 INF 未添加的服务

如果 INF 使用 AddReg 指令来修改服务状态,而该服务并非通过 INF 中的 AddService 指令添加的,则该 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall]
AddReg = Example_Registry

[Example_Registry]
HKLM,SYSTEM\CurrentControlSet\Services\ServiceNotCreatedByThisInf\ExampleKey, ExampleValue, %REG_DWORD%, 1

不支持。 INF 应仅更改由该 INF 创建的服务的设置,并且 INF 应删除此 AddReg。

使用 AddReg 修改服务根目录中的状态

如果 INF 使用 AddReg 指令在服务状态的根中创建键或值,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst

[Example_Service_Inst]
DisplayName   = %SvcDesc%
ServiceType   = %SERVICE_KERNEL_DRIVER%
StartType     = %SERVICE_DEMAND_START%
ErrorControl  = %SERVICE_ERROR_NORMAL%
ServiceBinary = %13%\ExampleBinary.sys
AddReg = Example_Service_Registry

[Example_Service_Registry]
HKR,,ExampleValue,%REG_DWORD%,0x00000040
HKR,CustomSubkey,ExampleValue,%REG_DWORD%,0x00000040

为了符合驱动程序包隔离的要求,提供服务注册表项和值的 AddReg 指令只能修改服务 Parameters 子项下的项和值。

如果 INF 正在修改内部服务状态(如加载顺序组、服务触发器等),则需要使用内置的 INF 指令来指定该状态,如 AddService 指令中所述。

如果 INF 在服务的根目录下创建或修改其他状态,则需要将设置移动到服务的 Parameters 子项下,并且可以在运行时使用 DriverRegKeyParameters 的 RegKeyType 通过 IoOpenDriverRegistryKey 访问 Parameters 子项。 Windows 10 1803 及更高版本的 Windows 支持 IoOpenDriverRegistryKey。

使用 HKCR AddReg 注册 APO

如果 INF 使用具有 HKCR 注册表根目录的 AddReg 指令来注册音频处理对象 (APO),则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "FriendlyName", , %APO_FriendlyName%
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "Copyright", , %MfgName%
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MajorVersion", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinorVersion", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "Flags", 0x00010001, 0x0000000d
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinInputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxInputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MinOutputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxOutputConnections", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "MaxInstances", 0x00010001, 0xffffffff
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "NumAPOInterfaces", 0x00010001, 1
HKCR,AudioEngine\AudioProcessingObjects\%EXAMPLE_CLSID%, "APOInterface0", , "{b0a50980-ded6-4f45-84cb-19d2d1245f6d}"

相反,APO 注册信息应位于 DDInstall 部分的 AddReg 指令引用的节中。 HKCR 注册表根目录应更改为 HKR 注册表根目录,以便将设置与设备的“软件”(也称为“驱动程序”)注册表状态位置相对应。 有关更多信息,请参阅在 INF 文件中注册处理模式和效果的 APO

UMDF 驱动程序版本小于 2

如果驱动程序包的有效负载中的用户模式驱动程序框架 (UMDF) 驱动程序使用的 UMDF 版本早于版本 2,则它不符合“Windows 驱动程序”要求。 有关如何将 UMDF 驱动程序移动到较新的 UMDF 版本的详细信息,请参阅将驱动程序从 UMDF 1 移植到 UMDF 2

使用 AddReg 将上下筛选器添加到设备堆栈

如果 INF 使用 AddReg 指令将上下筛选器添加到设备堆栈,则 INF 不符合驱动程序包隔离要求。 例如,INF 可能具有:

[ExampleDDInstall.HW]
AddReg = FilterAddReg

[FilterAddReg]
HKR,,"UpperFilters",0x00010000,"ExampleFilterDriver" ; REG_MULTI_SZ value

相反,应使用 AddFilter 指令将筛选器添加到设备堆栈。 例如:

[ExampleDDInstall.Filters]
AddFilter = ExampleFilterDriver,, ExampleFilterSection

[ExampleFilterSection]
FilterPosition = Upper

有关添加设备筛选器的更多详细信息,请参阅设备筛选器驱动程序排序

使用 AddReg 注册媒体类别名称值

如果 INF 使用 AddReg 指令来注册媒体类别名称值,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\MediaCategories\%ExampleGuid%,Name,,%ExampleName%

不应使用 AddReg 在全局注册表位置下注册媒体类别名称,而应使用 DDInstall 部分中的 HKR AddReg 在设备相对状态下注册它们。 例如:

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKR,MediaCategories\%ExampleGuid%,Name,,%ExampleName%

Windows 10、版本 1809 及更高版本的 Windows 支持使用设备相对状态注册媒体类别名称。 有关详细信息,请参阅音频终结点设备的友好名称

使用 AddReg 注册媒体类别显示值

如果 INF 使用 AddReg 指令来注册媒体类别显示值,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall]
AddReg=MediaCategoryRegistration

[MediaCategoryRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\MediaCategories\%ExampleGuid%,Display,1,00,00,00,00

此值未使用,应从 INF 中删除。

使用 AddReg 注册 DmaSecurity\AllowedBuses 值

如果 INF 使用 AddReg 指令HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses 注册表项下指定值,则 INF 不符合驱动程序包隔离的要求。 例如,INF 可能具有:

[ExampleDDInstall]
AddReg=DmaSecurityRegistration

[DmaSecurityRegistration]
HKLM,SYSTEM\CurrentControlSet\Control\DmaSecurity\AllowedBuses,"Example Friendly Name Description",0,PCI\VEN_ABCD&DEV_0123

从 Windows 11 版本 24H2 开始,不使用此值,应将其从 INF 中删除。 有关详细信息,请参阅 BitLocker 自动设备加密硬件要求