Перенос INF для выполнения изоляции пакета драйвера

Эта статья предназначена для быстрого поиска, чтобы помочь вам обновить INF-файл, чтобы обеспечивать изоляцию пакета драйвера в рамках обновления пакета драйвера до уровня Windows-драйвера. В следующих разделах приведены примеры некоторых распространенных вещей, которые могут возникнуть в INF-файле пакета драйвера, со ссылками на сведения о том, как обновить их, чтобы соответствовать изоляции пакетов драйверов. Если пакет драйверов должен поддерживать старый метод для старых версий операционных систем и новый метод для новых версий операционных систем, см. раздел "Объединение расширений платформы с версиями операционной системы" для информации о том, как это можно реализовать в INF.

DestinationDirs не является DIRID 13

Если раздел DestinationDirs указывает место назначения для файлов, не имеющих DIRID 13, то INF-файл не соответствует изоляции пакета драйвера. Все файлы в пакете драйверов должны выполняться из хранилища драйверов, что означает использование DIRID 13. Возможно, потребуется обновить не только раздел DestinationDirs. Другие операции, выполняемые INF и связанные с файлами, содержащимися в нем, могут также потребовать обновления. Например, может потребоваться обновить директиву ServiceBinary в разделе установки службы, на который ссылается директива AddService или значение реестра, написанное директивой AddReg. Как правило, запуск из Магазина драйверов поддерживается в Windows 10 1709 и более поздних версиях Windows, но некоторые стеки устройств могут не поддерживать файлы, которые подключаются к этим стекам из Хранилища драйверов до последующего выпуска. Для получения дополнительной информации см. запуск из хранилища драйверов.

Использование AddReg для регистрации поставщиков ETW и каналов EventLog

Если в INF используется директива AddReg для регистрации поставщика ETW и каналов EventLog, ТО 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

Вместо использования AddReg для регистрации поставщиков ETW и каналов EventLog они должны быть зарегистрированы с помощью директивы AddEventProvider из раздела DDInstall.Events. Например:

[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

Использование директивы AddEventProvider из раздела DDInstall.Events поддерживается в Windows 10 1809 и более поздних версиях Windows.

Использование AddReg для регистрации AutoLogger

Если файл INF использует директиву AddReg для регистрации или изменения автологгера ETW, то этот 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

Вместо использования AddReg для регистрации или обновления AutoLogger, его следует зарегистрировать или обновить с помощью директивы AddAutoLogger или UpdateAutoLogger из раздела DDInstall.Events. Например:

[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

Использование директивы AddAutoLogger или UpdateAutoLogger из раздела DDInstall.Events поддерживается в Windows 11 и более поздних версиях Windows.

Добавление записи в ключ RunOnce с помощью AddReg

Если в INF используется директива AddReg для добавления записи в ключ RunOnce, то INF не соответствует требованиям изоляции для пакета драйверов. Например, ваш INF может содержать:

[ExampleDDInstall]
AddReg = Example_Registry

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

Это не поддерживается. INF-файл не должен изменять записи глобального реестра. Если при установке пакета драйвера требуется однократное действие настройки, можно использовать директиву AddSoftware из inf-файла компонента для его запуска. Это только для некритических действий. Критически важные функциональные возможности для устройства или устройств, установленных с этим пакетом драйверов, не должны зависеть от выполняемых действий, которые являются внешними для установки устройства.

Добавление записи в ключ выполнения с помощью AddReg

Если INF использует директиву AddReg для добавления записи в ключ автозапуска, то INF не соответствует изоляции пакетов драйверов. Например, в вашей INF может быть:

[ExampleDDInstall]
AddReg = Example_Registry

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

Это не поддерживается. INF-файл не должен изменять записи глобального реестра. Если элемент реестра Run используется для добавления в систему программного обеспечения, ваше приложение должно быть приложением Универсальной платформы Windows и устанавливаться с помощью директивы AddSoftware из раздела DDInstall.Software. Дополнительные сведения см. в разделе Связывание драйвера с приложением универсальная платформа Windows (UWP). Если это программное обеспечение является службой, которая не требует представления пользовательского интерфейса, служба Win32 может быть зарегистрирована из пакета драйвера с помощью директивы AddService. При регистрации службы, связанной с устройством, служба должна выполняться только при наличии устройства. Служба должна иметь тип запуска "demand start" и должен использовать директиву AddTrigger из раздела установки службы, чтобы настроить триггеры, которые приведут к запуску службы при наличии устройства в системе. Это делается путем идентификации интерфейса устройства, который драйвер на устройстве будет предоставлять и использовать директиву AddTrigger, чтобы указать, что служба должна быть запущена при появлении этого оборудования. В процессе работы служба должна отслеживать отключение устройства. Если устройство удаляется из системы, и службе больше не нужно продолжать работу, она должна остановиться. Для регистрации уведомлений о прибытии и удалении интерфейса устройства, см. CM_Register_Notification.

Добавление файлов в каталоги Program Files с помощью CopyFiles

Если в 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-файл не должен копировать файлы в глобальные расположения. Каталоги Program Files обычно используются для установки программных приложений, а не драйверов. Если ваша цель состоит в создании и предоставлении приложения-компаньона для устройства, которое взаимодействует с драйвером, ознакомьтесь с руководством по приложению поддержки оборудования. Например, ваше приложение может быть приложением платформы универсальная Windows (UWP) и установлено с помощью директивы AddSoftware из раздела DDInstall.Software. Дополнительные сведения см. в разделе "Связывание драйвера с приложением универсальной платформой 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 для изменения состояния службы, которая не добавлена директивой AddService в INF, ТО 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 не соответствует требованиям изоляции пакета драйвера. Например, в вашей информационной системе может быть:

[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, предоставляющая ключи и значения реестра службы, может изменять только ключи и значения в подразделе "Параметры" данной службы.

Если ваш INF создает или изменяет другие состояния в корневом разделе службы, параметры необходимо переместить в подраздел "Параметры" службы, и к подразделу "Параметры" можно получить доступ во время выполнения с помощью IoOpenDriverRegistryKey с использованием типа ключа RegKeyType DriverRegKeyParameters. IoOpenDriverRegistryKey поддерживается в Windows 10 1803 и более поздних версиях Windows.

Использование функции AddReg в разделе HKCR для регистрации APO

Если в INF-файле используется директива AddReg с корнем реестра HKCR для регистрации аудиообрабатывающего объекта (APO), то этот 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 должны находиться в разделе, на который ссылается директива AddReg из раздела DDInstall. Корневая ветвь реестра HKCR должна быть изменена на корневую ветвь реестра HKR для размещения параметров, связанных с программной частью устройства (также известной как "драйвер") в соответствующем разделе реестра. Дополнительные сведения см. в разделе "Регистрация API для режимов обработки и эффектов" в INF-файле.

Версия драйвера 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 для регистрации имени категории мультимедиа в глобальном расположении реестра, их следует регистрировать в состоянии, относящемся к устройству, с помощью 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 для указания значений в разделе реестра, то этот 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.