Использование 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 используются infs расширения.

Совместная работа расширения INF и пакета базового драйвера

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

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

Указание extensionId

При написании расширения INF создается специальный ИДЕНТИФИКАТОР GUID с именем ExtensionId, который является записью в разделе [Версия] INF.

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

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

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

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

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

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

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

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

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

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

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

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

    [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
    

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

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

    Примечание

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

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

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

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

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

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

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

В большинстве случаев пакет драйвера INF расширения отправляется в Центр разработки оборудования отдельно от базового пакета драйверов. Примеры упаковки infs расширения и ссылки на пример кода см. в разделе Пример пакета драйвера, совместимого с 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,,"{9DD18FED-55F6-4741-AF25-798B90C4AED5}"
HKCR,AppID\{9DD18FED-55F6-4741-AF25-798B90C4AED5},,,"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 расширения.

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

Любые изменения в базовом пакете драйверов должны быть тщательно протестированы, чтобы убедиться, что это не нарушает обратную совместимость с существующими infs расширениями.

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

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

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

Подробные сведения о том, как работать с infs расширениями в Центре разработки оборудования, см. в разделе Работа с INFs расширений на информационной панели Центра разработки оборудования Windows.

Работа с infs расширения в Центре партнеров

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

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

начало работы с драйверами Windows

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