Поделиться через


Использование INF-файла расширения

До Windows 10 Windows выбрала один пакет драйвера для установки для данного устройства. Это привело к большим сложным пакетам драйверов, которые включали код для всех сценариев и конфигураций, а каждое дополнительное обновление требовало обновления для всего пакета драйверов. Начиная с Windows 10, вы можете разделить функциональные возможности INF на несколько компонентов, каждый из которых может обслуживаться независимо. Основной пакет драйверов, установленный на устройстве, теперь называется базовым пакетом драйверов и обрабатывается системой так же, как пакеты драйверов обрабатываются до Windows 10. Чтобы расширить функциональные возможности базового пакета драйвера, укажите расширение INF в отдельном пакете драйвера. Расширение INF:

  • Может предоставляться другой компанией и обновляться независимо от базового INF.

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

  • Улучшает значение устройства, но не требуется для работы базового пакета драйверов. В отсутствие расширения INF система должна иметь возможность загрузки и подключения к сети только с базовым пакетом драйвера. Устройства ввода, встроенные в систему, такие как клавиатура, должны иметь возможность функционировать по крайней мере с базовыми функциями без каких-либо расширений INFs.

  • Должен быть универсальным INF-файлом.

На каждом устройстве должен быть установлен один базовый пакет драйвера, с которым может быть связано одно или несколько расширений INFS. Расширение INF не сможет установить на устройстве, если на устройстве отсутствует базовый пакет драйвера, который также должен быть установлен на устройстве.

Типичные сценарии, где можно использовать расширения INF:

  • Изменение параметров, предоставленных в базовом пакете драйвера, например настройка понятного имени устройства или изменение параметра конфигурации оборудования.

  • Создание одного или нескольких компонентов программного обеспечения путем указания директивы INF AddComponent и предоставления INF файла компонента.

  • Предоставление параметров, относящихся к модели или форм-фактору системы, которая улучшает интерфейс или функциональные возможности устройства, например данные калибровки оборудования.

  • Добавление драйвера фильтра в стек устройств.

Пример кода для некоторых из этих сценариев можно найти в приведенных ниже примерах. Также см. Пример пакета драйвера, совместимого с DCH, в котором описывается, как в примере универсального драйвера DCHU используются расширения INF.

Как расширение INF и базовый пакет драйвера работают вместе

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

Полезно включить примечания в базовый пакет драйвера, описывающий, какие записи можно переопределить расширением INF, а также применимые диапазоны значений параметров и ограничения.

Указание идентификатора расширения

При записи расширения INF создается специальный GUID с именем ExtensionId, который является записью в разделе [Версия] INF.

Система определяет возможные INF-файлы расширения для конкретного устройства, сопоставляя идентификаторы оборудования и совместимые идентификаторы устройства с идентификаторами, указанными в INF-файле расширения в разделе "Модели", применимом к этой системе.

Среди всех возможных расширений INFs, которые указывают одно и то же значение ExtensionId, система выбирает только одно расширение для установки и применяет его параметры к базовому пакету драйвера. Дата драйвера и версия драйвера, указанные в INF, используются, в указанном порядке, для выбора единственного файлa INF среди нескольких расширений INF с одним и тем же ExtensionId.

Чтобы проиллюстрировать, рассмотрим следующий сценарий, включающий гипотетическое устройство, для которого существует три расширения INF-файлов.

Схема, показывающая, как выбираются базовые ИНФ и расширенные ИНФ.

Значения ExtensionId, {A}, и {B} отображаются в фигурных скобках, а рейтинг каждого базового пакета драйвера отображается на лентах баннеров.

Во-первых, система выбирает базовый пакет драйвера с лучшим рангом и самой высокой версией.

Затем система обрабатывает доступные расширения INFs. Два имеют значение ExtensionId{B}, а один имеет значение ExtensionId{A}. Предположим, что дата драйвера одинакова для первых двух. Следующий решающий фактор — это версия драйвера, поэтому система выбирает файл INF версии 2.0.

Также выбрано расширение INF с уникальным значением ExtensionId . Система применяет базовый пакет драйвера для устройства, а затем применяет два расширения INFs для этого устройства.

INF-файлы расширения всегда применяются после базового пакета драйвера, но порядок их применения не определён.

Создание расширения INF

Ниже приведены записи, которые необходимо определить INF как расширение INF.

  1. Укажите эти значения для Class и ClassGuid в разделе Version. Дополнительные сведения о классах установки см. в разделе "Классы установки устройств, доступные поставщикам".

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. Укажите запись ExtensionId в разделе [Версия]. Создайте новый GUID для начальной версии РАСШИРЕНИЯ INF или повторно используйте последний GUID для последующих обновлений начального расширения INF.

    ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
    

Организация может использовать только идентификатор extensionID, принадлежащий ему. Сведения о регистрации идентификатора расширения см. в разделе Управление отправками оборудования на панели мониторинга Центра разработки оборудования для Windows.

  1. Если вы обновляете расширение INF, оставьте идентификатор ExtensionId прежним и увеличьте версию и дату, указанные в директиве DriverVer. Для заданного значения ExtensionId PnP выбирает INF с наибольшим значением DriverVer.

    Примечание.

    Если расширение INF предназначено для Windows 10 S, ознакомьтесь с требованиями к драйверам в режиме S в Windows 10 для получения сведений об установке драйверов в этой версии Windows.

  2. В разделе INF Models укажите один или несколько аппаратных и совместимых идентификаторов, которые соответствуют идентификаторам целевого устройства. Эти аппаратные и совместимые идентификаторы не должны соответствовать базовым пакетам драйверов. Как правило, расширение INF содержит более конкретный идентификатор оборудования, чем базовый пакет драйвера, с целью дальнейшей специализации конкретной конфигурации драйвера. Например, базовый пакет драйверов может использовать двухкомпонентный идентификатор оборудования PCI, в то время как расширение INF указывает четырехкомпонентный аппаратный идентификатор PCI, как показано ниже:

    [DeviceExtensions.NTamd64]
    %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
    

    Кроме того, расширение INF может перечислить тот же идентификатор оборудования, что и базовый пакет драйвера, например, если устройство уже узко предназначено, или если базовый пакет драйвера уже содержит наиболее конкретный идентификатор оборудования.

    В некоторых случаях расширение INF может предоставить менее конкретный идентификатор устройства, например совместимый идентификатор, чтобы настроить параметр в более широком наборе устройств.

    Целевой подход CHID можно использовать, если четырехчастный идентификатор оборудования недоступен или не является достаточно ограничительным.

  3. Не определяйте службу с SPSVCINST_ASSOCSERVICE. Расширение INF не может предоставить драйвер функции для устройства. Однако расширение INF может определить другие службы, такие как драйвер фильтра для устройства. Дополнительные сведения об указании служб см. в директиве INF AddService.

В большинстве случаев вы отправите пакет драйвера INF расширения в Центр разработки оборудования отдельно от базового пакета драйвера. Примеры упаковки INF-файлов расширения и ссылки на пример кода см. в разделе "Пример пакета драйвера, совместимого с DCH".

Процесс проверки и отправки драйверов одинаков для расширений INFs, что и для базовых пакетов драйверов. Дополнительные сведения см. в статье "Начало работы с Windows HLK".

Удаление драйвера расширения

Чтобы удалить пакет драйвера расширения из системы и удалить его с любых устройств, использующих его, используйте команду PnPUtildelete-driver с флагом uninstall . Это позволяет удалить пакет драйвера расширения с устройств без удаления базового пакета драйвера.

Найдите имя пакета драйвера oem<#>.inf для удаления и используйте pnputil /delete-driver oem<#>.inf /uninstall.

pnputil /enum-drivers можно использовать для определения соответствующего имени oem<#>.inf.

Пример 1. Использование расширения INF для задания понятного имени устройства

В одном из распространенных сценариев производитель устройств (IHV) предоставляет базовый пакет драйверов, а затем системный построитель (OEM) предоставляет расширение INF, которое дополняет и в некоторых случаях переопределяет конфигурацию и параметры базового пакета драйверов. Следующий фрагмент кода — это полное расширение INF, показывающее, как задать понятное имя устройства.

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %CONTOSO%
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
DriverVer   = 05/28/2013,1.0.0.0
CatalogFile = delta.cat
PnpLockdown = 1

[Manufacturer]
%CONTOSO% = DeviceExtensions,NTamd64

[DeviceExtensions.NTamd64]
%Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX

[DeviceExtension_Install]
; No changes

[DeviceExtension_Install.HW]
AddReg = FriendlyName_AddReg

[FriendlyName_AddReg]
HKR,,FriendlyName,, "New Device Friendly Name"

[Strings]
CONTOSO              = "Contoso"
Device.ExtensionDesc = "Sample Device Extension"

Пример 2. Использование расширения INF для установки дополнительного программного обеспечения

Следующий фрагмент кода — это полное расширение INF, которое входит в набор средств установки пакета драйверов для универсальных драйверов. В этом примере используется директива INF AddComponent для создания компонентов, устанавливающих службу и исполняемый файл. Дополнительные сведения о том, что можно сделать в INF-файле компонента, см. в разделе "Использование INF-файла компонента".

Сведения о доступе к этому файлу в Интернете см. в статье osrfx2_DCHU_extension.inx.

;/*++
;
;Copyright (c) Microsoft Corporation.  All rights reserved.
;
;   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;   PURPOSE.
;
;Module Name:
;
;    osrfx2_DCHU_extension.INF
;
;Abstract:
;
;    Extension inf for the OSR FX2 Learning Kit
;
;--*/

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %ManufacturerName%
ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}
CatalogFile = osrfx2_DCHU_extension.cat
DriverVer   = 05/16/2017,15.14.36.721
PnpLockdown = 1

[Manufacturer]
%ManufacturerName% = OsrFx2Extension, NT$ARCH$

[OsrFx2Extension.NT$ARCH$]
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_045e&Pid_94aa&mi_00
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_0547&PID_1002

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_usersvc.inf

[OsrFx2Extension_Install.NT.HW]
AddReg = OsrFx2Extension_AddReg
AddReg = OsrFx2Extension_COMAddReg

[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"

; Add all registry keys to successfully register the
; In-Process ATL COM Server MSFT Sample.
[OsrFx2Extension_COMAddReg]
HKCR,AppID\ATLDllCOMServer.DLL,AppID,,"{00001111-aaaa-2222-bbbb-3333cccc4444}"
HKCR,AppID\{00001111-aaaa-2222-bbbb-3333cccc4444},,,"ATLDllCOMServer"
HKCR,ATLDllCOMServer.SimpleObject,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,ATLDllCOMServer.SimpleObject\CurVer,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,ATLDllCOMServer.SimpleObject.1,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject.1\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084},,,"SimpleObject Class"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,,%REG_EXPAND_SZ%,"%%SystemRoot%%\System32\ATLDllCOMServer.dll"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,ThreadingModel,,"Apartment"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\ProgID,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\Programmable,,%FLG_ADDREG_KEYONLY%
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\TypeLib,,,"{9B23EFED-A0C1-46B6-A903-218206447F3E}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\VersionIndependentProgID,,,"ATLDllCOMServer.SimpleObject"

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall
AddComponent = osrfx2_DCHU_usersvc,,OsrFx2Extension_ComponentInstall_UserSvc

[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

[OsrFx2Extension_ComponentInstall_UserSvc]
ComponentIds=VID_045e&PID_94ac

[Strings]
ManufacturerName = "Contoso"
OsrFx2.ExtensionDesc = "OsrFx2 DCHU Device Extension"
REG_EXPAND_SZ = 0x00020000
FLG_ADDREG_KEYONLY = 0x00000010

Сведения о том, как использовать расширение INF для установки драйвера фильтра, см. в разделе порядок драйверов фильтра устройств.

Чтобы повысить расширяемость, мы рекомендуем IHV поместить необязательные функции в шаблон INF для расширения.

обратная совместимость

Изменения как базовых пакетов драйверов, так и пакетов драйверов расширений должны быть тщательно проверены, чтобы убедиться, что изменения не нарушают обратную совместимость существующих пакетов драйверов. Более новые базовые пакеты драйверов могут быть установлены с более старыми пакетами драйверов расширений, а более новые пакеты драйверов расширений могут быть установлены с более старыми пакетами базовых драйверов. Эти ситуации не должны вызывать проблемы с надежностью или стабильностью в системе.

При управлении базовым пакетом драйверов, который ожидает расширения пакетом драйвера расширения, следуйте приведенным ниже рекомендациям.

  • Задокументируйте, какие параметры может установить пакет драйвера расширения для изменения поведения пакета базового драйвера. Имена параметров документа, расположения, диапазоны значений и ограничения как в комментариях кода, так и в документе конструктора. Поделитесь этим документом разработки с партнерами, которые будут писать пакеты драйверов расширений для расширения базового пакета драйвера. Будущие изменения в базовом пакете драйверов должны поддерживать совместимость с указанными диапазонами.
  • Чтобы поддерживать новые диапазоны, добавьте необязательный параметр (без значения по умолчанию).

При управлении пакетом драйвера расширения следуйте приведенным ниже рекомендациям.

  • Придерживайтесь ограничений, описанных в документе проектирования от владельца пакета базового драйвера о том, как пакет драйвера расширения должен дополнить базовый пакет драйвера.

Отправка расширения INF для сертификации

Подробные сведения о том, как работать с расширенными INFs в Центре разработчиков оборудования, см. «Работа с расширенными INFs в Центре разработчиков оборудования Windows».

Работа с файлами расширения INF в Центре партнеров

Пример пакета драйвера, совместимого с DCH

Использование универсального INF-файла

Начало разработки драйверов Windows

Набор средств установки пакета драйверов для универсальных драйверов