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


Использование 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 расширений, не существует предопределенного порядка применения infs расширения, поэтому одно расширение INF не может детерминированно переопределять значения, предоставляемые другим расширением INF. Отдельные infs расширения, предназначенные для одних и того же устройства, не должны пытаться изменить те же параметры.

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

Указание идентификатора extensionId

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

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

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

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

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

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

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

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

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

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

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

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

  1. Укажите эти значения для класса и 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 расширения в Центр разработки оборудования отдельно от базового пакета драйвера. Примеры того, как упаковать infs расширения и ссылки на пример кода, см . в примере пакета драйвера, совместимого с DCH.

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

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

Чтобы удалить пакет драйвера расширения из системы и удалить его с любых устройств, использующих его, используйте команду PnPUtil delete-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

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