共用方式為


移植 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 指示詞來註冊它們,而不是使用 AddReg 來註冊 ETW 提供者和 EventLog 通道。 例如:

[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 指示詞進行註冊或更新,而不是使用 AddReg 來註冊或更新 AutoLogger。 例如:

[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 將專案新增至執行金鑰

如果您的 INF 使用 AddReg 指示詞 將專案新增至執行密鑰,則 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的CoInstaller

如果您的 INF 使用 CoInstaller 來安裝使用者應該與其互動的應用程式,則 INF 不符合驅動程式套件隔離的規範。 例如,您的 INF 可能會註冊 CoInstaller,如下所示:

[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 。 Windows 10 1803 和更新版本的 Windows 支援 IoOpenDriverRegistryKey。

使用 HKCR AddReg 註冊 APO

如果您的 INF 使用 AddReg 指示 詞搭配 HKCR 登錄根目錄來註冊音訊處理物件 (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 檔案中註冊處理模式和效果的 API。

UMDF 驅動程式版本小於 2

如果您的驅動程式套件承載 使用者模式驅動程序架構 (UMDF) 驅動程式,而該驅動程式使用比第 2 版更早的 UMDF 版本,則它不符合「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 自動裝置加密硬體需求