共用方式為


將 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 將項目新增至 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 不符合驅動程式套件隔離的規範。 這包括但不限於使用 DIRIDs 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 專案不要將隨附應用程式新增至系統,而且檔案應該保留為驅動程式套件的一部分,則必須將其設為「從驅動程式存放區執行」。

啟動使用者介面的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 不符合驅動程式套件隔離的規範。 內部服務狀態是服務控制管理員所管理之服務的狀態。 這包括,但不限於:

  • 顯示名稱
  • 描述
  • 影像路徑
  • 類型
  • 開始類型
  • 錯誤控制
  • 載入順序群組
  • 依賴
  • 安全性資訊
  • 必要許可權
  • SID 類型
  • 延遲自動啟動設定
  • 觸發器
  • 失敗動作
  • 開機旗標

例如,您的 INF 可能有:

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

[Example_Service_Inst]
DisplayName   = %SvcDesc%
ServiceType   = %SERVICE_WIN32_OWN_PROCESS%
StartType     = %SERVICE_DEMAND_START%
ErrorControl  = %SERVICE_ERROR_NORMAL%
ServiceBinary = %13%\ExampleService.exe
AddReg = Example_Service_Registry

[Example_Service_Registry]
HKR,TriggerInfo\0,Type,0x00010001,0x01
HKR,TriggerInfo\0,Action,0x00010001,0x01
HKR,TriggerInfo\0,Guid,0x00000001,2D,DF,41,BD,DD,AD,C9,4F,A1,94,B9,88,1D,2A,2E,FA
HKR,,ServiceSidType,0x00010001,0x01

若要符合驅動程式套件隔離規範,您必須使用內建 INF 指示詞來指定該狀態,如 AddService 指示詞所述,

使用 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 正在建立或修改位於服務根目錄下的其他狀態,則設定需要移動到服務的 Parameters 子機碼下,並且可以在運行時間透過 IoOpenDriverRegistryKey 以及使用 DriverRegKeyParameters 的 RegKeyType 來存取此參數子機碼。 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 在全域登錄位置下註冊媒體類別名稱,而是應該使用 HKR AddReg 從DDInstall 區段在裝置相對狀態中註冊。 例如:

[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 自動裝置加密硬體需求