[Previous] [Next]

Структура INF файла

Инсталляционный inf-файл является текстовым файлом, поставляемым вместе с драйверным программным обеспечением и аппаратным обеспечением, соответственно.

В операционных системах Windows 9x/Me размер inf-файл не может превосходить 64 килобайта. Для NT систем ограничений нет. Если не указано иначе для конкретного типа ОС, то максимальная длина любого поля в inf-файле составляет 512 символов.

Секции inf-файла и основные общие правила ввода записей

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

Записи внутри каждой секции описывают действия по инсталляции, либо ссылаются на другие секции. Записи, которые регламентированы для секций определенного типа (обязательные или нет), в литературе и в документации DDK часто называются директивами.

Весь текст, введенный в inf-файле, не различается в смысле регистра символов — все имена секций и записи могут быть введены и в верхнем, и в нижнем регистре. Поэтому слова version, VERSION и Version являются идентичными для процесса установки. Текст не должен содержать символов табуляции и других невидимых управляющих символов.

Символ "точка с запятой" означает начало комментариев в следующей (за точкой с запятой) позиции, которые продолжаются до конца строки. Комментарии не принимаются в рассмотрении при анализе inf-файла. Данное правило не действует только в том случае, если такой текстовый фрагмент (содержащий точку с запятой) заключен в кавычки.

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

Порядок следования секций в файле не играет роли, важно лишь, чтобы секции носили корректные имена и были правильно соотнесены в перекрестных ссылках. (Правда, сами разработчики придерживаются некоторых правил, например, секция [Strings] вводится обычно последней.) Секция продолжается до объявления начала следующей секции, либо до обнаружения конца файла. Имя секции должно быть уникальным для данного inf-файла. Хотя в некоторых источниках указывается, что содержимое секций, имеющие одинаковые имена, системное программное обеспечение, занимающееся интерпретацией inf-файла, объединяет, тем не менее, практика показывает, что это не так. Например, из двух секций [Strings] принимается во внимание только содержимое первой (по тексту inf-файла).

Имя секции не должно содержать более 28 символов для Windows 9x и более 255 символов для Windows NT. Ссылки на секции могут содержать в своем составе пробелы, но только если имя в целом заключено в кавычки (то же относится и к символу точки с запятой). Допустимы точка и символ подчеркивания. Например, как указывает документация DDK, строка в кавычках ";;  Std Mfg      " является приемлемой ссылкой на имя секции, если указываемая секция имеет имя, в точности совпадающее с содержимым внутри кавычек, а именно [;;  Std Mfg      ].

В теле секции информация представляется в форме записей. Общий формат элемента секции для inf-файлов, применяемых в Windows:

entry = value[,value[,value...]]

где entry является ключевым словом (начало директивы) либо маркером (ссылкой на значение — такая ссылка обособляется символами %...%). Параметры value являются значениями, соотносимыми с полем entry (именно, соотносимыми, а не присваиваемыми). В редких типах секций в роли поля entry могут выступать имена файлов (например, в секции [SourceDiskFiles]) или имена других секциях (например, в секции [DestinationDirs]).

В inf-файлах для нескольких систем в секциях для Windows 9x все запятые должны присутствовать в указанном в документации количестве, а в секциях для NT замыкающие перечисления запятые (если значения опущены) можно опускать (то есть в тех секциях, имена которых которые оформлены суффиксами .nt, .ntx86, и т.п.). Например, запись в секции SourceDisksFiles в общей нотации описывается следующим образом:

filename = diskid[, [subdir] [, size] ]

Пропуская значение subdir, указываем значение size и оставляем две запятых в середине:

filename = diskid,,size

Если пропускаем два значения (subdir и size) в inf-файле для NT, то запись выглядит так:

filename = diskid

Для Windows9x это требуется ввести иначе:

filename = diskid,,

Секция описания версии [Version]

Корректно составленный inf-файл начинается с секции [Version], которая является заголовком и меткой для всего драйверного inf-файла. Допустимые и необходимые записи внутри секции [Version] перечисляются в таблице 12.1.

Таблица 12.1. Элементы секции [Version]

Записи Значения
Signature Обязательная запись. Одно из указанных ниже значений
"$Windows NT" — для ОС ряда Windows NT
"$Windows 95" — для ОС Windows 9x/Me
"$Chicago$" — для всех версий ОС, поддерживающих WDM драйвера
Class Имя класса для целого семейства драйверов. Некоторые имена, например, Net, Display или Unknown зарезервированы (предопределены). В секции [Version] должна быть либо директива Class, соответствующая типу устройства, обслуживаемого устанавливаемым драйвером, либо ClassGuid, либо обе сразу.
ClassGuid Уникальный GUID идентификатор для класса устройства, которое обслуживает данный набор драйверного программного обеспечения (см. таблицу 12.2).
Provider Поставщик INF файла, наименование организации и т.п.
LayoutFile Используется только в INF файлах, поставляемых с операционной системой. Файлы, поставляемые OEM (Original Equipment Manufacturer), то есть "при аппаратуре", должны вместо этого элемента использовать SourceDiskNames и SourceDiskFiles
CatalogFile Указывает на cat-файл (с расширением .CAT), содержащий набор драйверных файлов. Этот набор формируется лабораторией Microsoft HW Quality Lab и содержит зашифрованную цифровую подпись проверенного драйверного программного обеспечения. Данный файл не должен подвергаться каким-либо формам архивации.
DriverVer

Обязательная запись. Независимо от локализации версии ОС имеет формат mm/dd/yyyy[,x.y.v.z];
Здесь версия драйвера может быть введена через запятую после указания даты.

В таблице 12.2 приводятся некоторые из инсталляционных классов, которые можно указывать в директивах Class и ClassGuid. Наиболее полный и верный на текущий момент набор классов можно найти в разделе Системного Реестра HKLM\CurrentControlSet\Control\Class\{...}, где операционная система хранит все поддерживаемые на текущий момент классы устройств. Указанный раздел разбит на подразделы в соответствии с GUID идентификаторами классов, причем в каждом подразделе имеется параметр Class, в котором хранится наименование соответствующего класса в текстовой форме.

Таблица 12.2. Инсталляционные классы: названия и глобально-уникальные идентификаторы

Наименование Описание GUID идентификаторы
1394 Хост-контроллер шины 1394 {6BDD1FC1-810F-11D0-BEC7-08002BE2092F}
Battery Аккумуляторные устройства питания {72631E54-78A4-11D0-BCF7-00AA00B7B32A}
CDROM Устройства CD ROM {4D36E965-E325-11CE-BFC1-08002BE10318}
Display Дисплейные адаптеры {4D36E968-E325-11CE-BFC1-08002BE10318}
HIDClass HID устройства {745A17A0-74D3-11D0-B6FE-00A0C90F57DA}
Infrared Устройства ИК-связи (IrDA) {6BDD1FC5-810F-11D0-BEC7-08002BE2092F}
Keyboard Клавиатура {4D36E96B-E325-11CE-BFC1-08002BE10318}
Media Устройства мультимедиа {4D36E96C-E325-11CE-BFC1-08002BE10318}
Modem Модем {4D36E96D-E325-11CE-BFC1-08002BE10318}
Monitor Монитор {4D36E96E-E325-11CE-BFC1-08002BE10318}
Mouse Манипулятор "мышь" {4D36E96F-E325-11CE-BFC1-08002BE10318}
MultiPortSerial Многопортовые последовательные адаптеры {50906CB8-BA12-11D1-BF5D-0000F805F530}
Network Сетевой адаптер {4D36E972-E325-11CE-BFC1-08002bE10318}
NetClient Сетевой клиент {4D36E973-E325-11CE-BFC1-08002BE10318}
NetService Сетевой сервис {4D36E974-E325-11CE-BFC1-08002BE10318}
PCMCIA Адаптеры PCMCIA {4D36E977-E325-11CE-BFC1-08002BE10318}
Ports Порты (COM&LPT) {4D36E978-E325-11CE-BFC1-08002BE10318}
Printer Принтер {4D36E979-E325-11CE-BFC1-08002BE10318}
System Системные устройства {4D36E97D-E325-11CE-BFC1-08002BE10318}
TapeDrive Устройства работы с магнитной лентой {6D807884-7D21-11CF-801C-08002BE10318}
Unknown Другие устройства {4D36E97E-E325-11CE-BFC1-08002BE10318}
USB USB устройства {36FC9E60-C465-11CF-8056-444553540000}

Указанный раздел Системного Реестра можно пополнять своими классами при инсталляции драйвера. Эта процедура достаточно проста, причем Мастер Установки Windows любезно заполняет необходимые поля соответствующей информацией. Пример внесения собственного класса устройств будет рассмотрен чуть позже.

Секция описания поставщика [Manufacturer]

Второй по важности секцией любого inf-файла является секция поставщиков оборудования. В ней указываются ссылки на секции описания моделей [Models] устанавливаемого оборудования.

Первая из возможных форм записей в данной секции:

%token% = model_section_name

В секции может быть много поставщиков и, соответственно, ссылок на секции описания моделей. Вот один из примеров DDK:

[Manufacturer]
%ATAPI_CHGR%      = atapi_chgr
%CHINON%          = chinon_cdrom
%DENON%           = denon_cdrom
%FUJITSU%         = fujitsu_cdrom
%HITACHI%         = hitachi_cdrom
%HP%              = hp_cdrom
%MITSUMI%         = mitsumi_cdrom
%NEC%             = nec_cdrom
%OTI%             = oti_cdrom
%PIONEER%         = pioneer_cdrom
%WEARNES%         = wearnes_cdrom
%GenManufacturer% = cdrom_device 

Данная секция описания поставщиков содержит 12 записей о поставщиках. Слева указаны маркеры (token — идентификаторы, обособленные двумя знаками процента, см. ниже), которые позже, в том же inf-файле в секции [Strings], соотнесены со строками-названиями производителей в полной текстовой форме. Справа от знака равенства указаны имена секций (например, секции [atapi_chgr]), описывающих установку программного обеспечения для моделей аппаратуры данного производителя (ссылки на секции моделей), которые были в этом файле рассмотрены позже.

Другая форма возможна для операционных систем, начиная с Windows XP, где можно указывать разные секции моделей в связи с версией операционной системы. В результате строки в секции [Manufacturer] приобретают вид:

%token%= model_section_name[,TargetOS] [,TargetOS]

Например, для Windows Server 2003:

[Manufacturer]
%MSFT%=Microsoft_Model_Section, NT.5.2

Соответственно, секции моделей будет начинаться так:

[Microsoft_Model_Section] ; допустимо для ОС систем до и включая
<тело секции моделей>     ; Windows XP

[Microsoft_Model_Section.NT.5.2]  ; для Windows Server 2003
<тело секции моделей> 

Значение маркера следует раскрыть в секции [Strings].

Для секции описания производителя [Manufacturer] возможна и другая форма (содержащая только идентификатор производителя, являющийся одновременно и ссылкой на секцию моделей), например:

[Manufacturer]
"Microsoft" 

Тогда и секция описания модели будет выглядеть иначе, например:

[Microsoft]
<тело секции моделей> 

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

На рисунке 12.1 показана взаимосвязь между секциями inf-файла. Каждая запись в секции описания поставщиков [Manufacturer] указывает на секцию описания моделей для данного поставщика. В этой секции моделей вводятся уже записи, указывающие на секции, описывающие собственно установку программного обеспечения, то есть копирование файлов (откуда/куда), изменения в Системном Реестре и т.п.

Рис. 12.1
Взаимодействие между секциями INF файла

Могут быть также и секции, стоящие несколько в стороне от основной работы по установке, в частности, секция [ClassInstall32] и ей подчиненные секции, которые служат для внесения в Системный Реестр нового класса аппаратуры.

Секция описания моделей аппаратуры [Models]

Для каждого поставщика, указанного в секции [Manufacturer], должна быть представлена соответствующая секция описания моделей его аппаратуры [Models]. Имя данного типа секций не может быть жестко регламентировано, потому что разработчик сам задает его в секции [Manufacturer].

В каждой такой секции [Models] записи представляются по следующей форме:

device_description = install_section_name,hw_id[,compatible_id...]

где device_description представляет собой уникальный набор видимых символов либо маркер, обязательный для определения в секции [Strings]. Данная строка будет предъявляться пользователю во время инсталляционного диалога, так что имеет смысл позаботиться о поддержке нескольких языков.

Значение install_section_name представляет собой ссылку на секцию, описывающую собственно действия по инсталляции для данной модели (в документации DDK такого типа секции обозначены как [DDInstall]).

Значение hw_id является PnP идентификатором, возвращаемым аппаратным устройством во время опроса PnP-совместимой шины. Например, USB\VID_04B4&PID_1002 определяет плату тестового набора фирмы Cypress (так называемый EZUSB Kit). Любое количество значений compatible_id может быть приведено для обозначения того, что та же самая инсталляционная запись должна быть использована для указанного в этом списке устройства.

Применение одной и той же группы символов может сбить с толку начинающего разработчика inf-файлов. Рассмотрим показательный пример из DDK для Windows XP.

[Version]
Signature = "$Windows NT$"  ; inf-файл для установки только под NT
Class=System
ClassGUID={4d36e97d-e325-11ce-bfc1-08002be10318}
Provider=%MSFT%
DriverVer= 5/1/2001

[Manufacturer]
%MSFT%=MSFT  ; со знаками процента - маркер

[MSFT]
%_MCADesc%=_MCA_Inst,_MCA0000

[_MCA_Inst.ntx86]
CopyFiles = _MCA.Files.x86_12

[Strings]
MSFT= "Microsoft"  ; раскрываем маркер
_MCADesc= "Microsoft MCA Driver"

В секции [Manufacturer] видим, что маркер %MSFT% "приравнивается" ссылке MSFT. Это означает, что в данной секции описан поставщик Microsoft (именно так раскрывается маркер %MSFT% в секции [Strings]), a модели аппаратуры представлены в секции описания моделей [MSFT].

Переходя к рассмотрению секции моделей, видим маркер %_MCADesc% (раскрываемый как "Microsoft MCA Driver" — для диалога с пользователем при установке), который ассоциирован со ссылкой на секцию установки драйвера [_MCA_Inst]. Правда, эта секция снабжена суффиксом '.NTx86' (регистр не имеет значения), сообщающим о том, что данная секция применима только для установки в операционной системе NT на платформе Intel x86 (в документации DDK такое присоединение суффиксов называется декорированием имен секций).

Начиная с версии операционной системы Windows XP, имя секции моделей может декорироваться идентификатором версии, например:

[Manufacturer]
%MSFT%=MSFT_model
[MSFT_model.NT.5.1]   ; Windows XP
[MSFT_model.NT.5.2]   ; Windows Server 2003 

Замечания по декорированию имен

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

Прежде всего, маркер, который является идентификатором, взятым в два знака процента, есть не что иное, как формальная переменная ('икс' в школьной задаче). Его внешнее сходство с чем-либо еще в записях inf-файла обманчиво. Во всех тех местах, где встречается маркер, следует подставлять его значение, соотнесенное с ним в секции [Strings]. Причем, это значение, может быть не обязательно текстовым, например:

[Example.Service]
DisplayName  = %Example.ServiceName%
ServiceType  = %SERVICE_KERNEL_DRIVER%
StartType    = %SERVICE_DEMAND_START%

[Strings]
Example.ServiceName="Example NTDDK driver (V.001)"
SERVICE_KERNEL_DRIVER=1
SERVICE_DEMAND_START=3 

Здесь с маркером %Example.ServiceName% соотнесено строковое значение "Example NTDDK driver (V.001)", а с маркером %SERVICE_KERNEL_DRIVER% соотнесено значение 1. Текстовые значения (здесь Example.ServiceName) называются локализуемыми значениями (их можно задавать разными для разных языковых версий операционной системы, локализаций). Нетекстовые значения считаются нелокализуемыми.

В том случае, если значение маркера не раскрывается, то будет полагаться, что поле, в котором введен маркер, просто имеет текстовое значение, совпадающее с маркером, например, "%Example.ServiceName%" в примере выше.

Во-вторых, двусмысленна роль точки в формировании имен секций и маркеров.

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

В случае если точка встретилась в имени секции (или в ссылке на имя секции), то возможно два варианта:

Секция [CopyFiles]

Секции [CopyFiles] имеют уникальные для INF файла названия, ссылки на них исходят из директив CopyFiles секций [DDInstall]. Соответственно, конкретные имена этих секций определяет сам разработчик inf-файла.

Каждая запись внутри секции [CopyFiles] имеет вид

destination-filename[, source-filename][, temp-filename][, flag]

где destination-filename является целевым (то есть новым, конечным) именем файла после копирования. Предполагается, что и исходный файл имеет такое же имя. В том случае, если исходный файл все-таки называется иначе, необходимо указать source-filename. Требование указывать temp-filename все еще требуется для Windows 98/Me, и это поле вводит промежуточное имя для нового файла до момента первой перезагрузки системы. В Windows 2000/XP/2003 это значение игнорируется.

Таблица 12.5. Определение значения flag в записях секции [CopyFiles]

Значение Символьное имя Описание
0x0400 COPYFLG_REPLACEONLY Копировать исходный файл только в том случае, если в целевой директории есть файл с таким именем
0x0800 COPYFLG_NODECOMP Копировать без разархивации (если файл обработан архиватором)
0x0008 COPYFLG_FORCE_FILE_IN_USE Если файл с целевым именем в целевой директории сейчас открыт, то следует копировать исходный файл в файл с временным именем, форсировать перезагрузку, после чего переименовать временный файл
0x0010 COPYFLG_NO_OVERWRITE Не переписывать существующие одноименные файлы в целевой директории
0x1000 COPYFLG_REPLACE_BOOT_FILE Файл является частью системной загрузки, форсировать перезагрузку системы
0x2000 COPYFLG_NOPRUNE Осуществить копирование, даже если инсталлятор не считает эту операцию целесообразной
0x0020 COPYFLG_NO_VERSION_DIALOG Не переписывать одноименные существующие файлы, которые датированы как более новые, нежели предназначенные к записи (игнорируется, если инсталлируемый пакет имеет цифровую подпись)
0x0004 COPYFLG_NOVERSIONCHECK Всегда переписывать целевые файлы (флаг игнорируется, если инсталлируемый пакет имеет цифровую подпись)
0x0040 COPYFLG_OVERWRITE_OLDER_ONLY Переписывать только те существующие файлы, которые являются более старыми, чем имеющиеся в пакете (данный флаг игнорируется, если инсталлируемый пакет имеет цифровую подпись)
0x0001 COPYFLG_WARN_IF_SKIP Предупреждать пользователя о возникшей необходимости пропустить переписывание файл (игнорируется, если инсталлируемый пакет имеет цифровую подпись)
0x0002 COPYFLG_NOSKIP

Запретить пользователю выбор возможности пропуска каких-либо файлов при копировании (всегда применяется, если инсталлируемый пакет имеет цифровую подпись)

Значение flag определяет управление новым целевым файлом, что подробнее отражено в таблице 12.5. Для описания сложного управления необходимо выполнять ИЛИ над операндами — для получения одновременного воздействия указываемых вариантов. Некоторые варианты взаимно исключают друг друга (например, COPYFLG_WARN_IF_SKIP и COPYFLG_NOSKIP), поэтому следует в сомнительных ситуациях обратиться к документации.

Так как секции [CopyFiles] не имеют синтаксических средств указывать диск или полный путь к исходному файлу, то следует использовать другие секции, такие как [SourceDisksNames] и [SourceDisksFiles]. Место (конкретные файловые каталоги), куда файлы будут помещены в результате установки, определяется другой секцией, называемой [DestinatonDirs].

Следует отметить, что здесь секция [CopyFiles] описывается, как присутствующая в inf-файле по той причине, что на нее ссылалась директива CopyFiles из секции [DDInstall]. На самом деле, директива CopyFiles может присутствовать и в секции [ClassInstall32], которая посвящена инсталляции нового класса устройств в системе (будет рассмотрена ниже). Вводимая таким образом секция [CopyFiles] должна быть построена по таким же правилам, как указано здесь.

Секции [ServiceInstall]

Секции типа [ServiceInstall] предназначены для заполнения или модификации подраздела Системного Реестра, описывающего загрузку драйвера в сервисном подразделе для данного драйвера, а именно — в подразделе HKLM\System\CurrentControlSet\Services\<service-name>. Здесь <service-name> — это значение поля service-name, указанное в директиве AddService в секции [DDInstall.Xxx.Services]. Конкретное имя секции типа [ServiceInstall] выбирается разработчиком inf-файла. Декорирование имен секций данного типа (с целью отразить ее предназначение для конкретной версии системы) уже не имеет смысла и не воспринимается, поскольку эта принадлежность должна была быть введена раньше — на уровне секций [DDInstall.Xxx.Services]. Описание директив для секций типа [ServiceInstall] приводится в таблице 12.10, причем директивы ServiceType, StartType, ErrorControl и ServiceBinary являются обязательными. Эти директивы однозначно определяют информацию (значения одноименных параметров), которая появится в Системном Реестре в сервисном подразделе для данного драйвера — пример, касающийся драйвера Example.sys, рассмотрен в Приложении В.

Таблица 12.10. Записи секции [ServiceInstall]

Запись Значение поля
DisplayName Развернутое наименование драйвера, выводится на экран Мастером Установки Оборудования
Description Краткое описание назначения драйвера или сервиса, выводится Мастером Установки Оборудования
ServiceType Для драйвера режима ядра 0x01 (см. также Приложение В)
StartType Определяет момент загрузки драйвера
0 — SERVICE_BOOT_START — во время загрузки системы (WDM драйверы, опирающиеся на системные драйверы не должны использовать такой тип запуска)
1 — SERVICE_SYSTEM_START — во время инициализации системы (WDM драйверы, опирающиеся на системные драйверы должны использовать такой тип запуска с осторожностью)
2 — SERVICE_AUTO_START — автостарт после запуска системы средствами SCM Менеджера (WDM драйверы и драйверы РпР устройств не должны указывать этот код запуска)
3 — SERVICE_DEMAND_START — старт по требованию: либо по запросу РnР Менеджера при обнаружении РnР устройства, либо по явному запросу приложения при помощи вызовов SCM Менеджера
4 — SERVICE_DISABLED — не может стартовать
ErrorControl Распоряжение относительно возникающих ошибок:
0 — игнорировать все ошибки при загрузке драйвера
1 — показывать сообщения об ошибках пользователю
2 — выполнить рестарт с набором параметров, обеспечившим последнюю удачную загрузку (LastKnownGood), игнорировать дальнейшие ошибки
3 — выполнить рестарт с набором параметров, обеспечившим последнюю удачную загрузку (LastKnownGood), контроль ошибок если таковые возникнут со стороны пользователя
ServiceBinary Путь к файлу драйвера (может включать коды dirid, таблица 12.6)
AddReg

Вводит (через запятую) ссылки на секции типа [AddReg], в которых описываются действия над Реестром, которые следует выполнить дополнительно к описанным в данной секции

LoadOrderGroup Идентифицирует группу, в которой должен загружаться драйвер (возможные группы можно увидеть в разделе Системного Реестра HKLM\System\CurrentControlSet\Control\GroupOrderList)
Dependencies

Указывает сервисы (драйверы) или группы загрузки, которые должны быть загружены к моменту загрузки драйвера. Имена групп выделяются при вводе предшествующим им знаком '+'.

Директивы LoadOrderGroup и Dependencies широко используются при установке драйверов SCSI устройств и фильтр-драйверов.

Директива DelReg, которая также может быть в составе [ServiceInstall], вводит ссылки на секции, описывающие удаление из Системного Реестра информации для уже установленных программных продуктов. Используется эта директива редко.

Остальные директивы, возможные для ввода в секциях типа [ServiceInstall], а именно, StartName и BitReg практически не используются.

Секция [ClassInstall32]

Разработчик драйвера может создать собственный класс устройств (с собственным GUID, созданным при помощи программы GuidGen) и использовать его при установке своего драйвера. Данная операция не является сложной и выполняется при помощи секции [ClassInstall32], например:

[Version]
Signature="$Chicago$"
Class=ExampleDrvClass
ClassGuid={DC16BE99-C06B-4801-A144-43A98BB99052}
. . .
[ClassInstall32]
Addreg=ExampleClassReg

[ExampleClassReg]    ; секция изменений в Реестре
HKR,,,0,%ClassName%  ; имя класса вводится через маркер %ClassName%

[Strings] ; Дополняем секцию значением маркера
ClassName="Example's Driver Class"
. . .
Рис. 12.2
Новый класс в окне Диспетчера устройств

Внесем приведенные выше дополнения в inf-файл, предназначенный для установки драйвера Example.sys, см. главу 3. В результате установки Мастером установки появится новый класс с указанным GUID в разделе HKLM\System\CurrentControlSet\Control\Class Системного Реестра, см. рисунок 12.3. В его подразделе будет указан параметр Class, содержащий значение имени "ExampleDrvClass", и один вложенный подраздел \0000, описывающий установленный драйвер Example.Sys, см. рисунок 12.4.

Рис. 12.3.
Новый класс в окне Редактора Системного Реестра

Рис. 12.4.
Вновь установленный драйвер класса ExampleClassReg

Открывая описания классов в Системном Реестре при помощи Редактора Реестра, можно увидеть, что другие классы имеют существенно больше параметров, чем создано для нового класса ExampleDrvClass при помощи указанных выше записей. Все недостающие параметры можно ввести в секции описания изменений в Реестре, в данном случае — [ExampleClassReg].

Имя секции [ClassInstall32] может быть декорировано при помощи суффиксов .nt, .ntx86 и .ntia64 для того, чтобы ограничить применимость данной секции.

Помимо директивы AddReg, обязательной для секции [ClassInstall32], в данной секции могут присутствовать некоторые другие директивы (следует обратиться к документации DDK), из которых самой важной является директива CopyFiles.

Синтаксис директивы CopyFiles совершенно аналогичен тому, который используется в секции [DDInstall], и вводит информацию о копировании файлов, если таковые необходимы для завершения установки нового класса.

В том случае, если при установке нового класса устройств еще требуется установить и некоторые драйверы, предусмотрена возможность их установки с использованием секции [ClassInstall32.Services] ([ClassInstall32.Xxx.Services]), использование которой аналогично [DDInstall.Services].

Созданный класс легко и безболезненно удаляется из Системного Реестра (в интерактивном Редакторе), если только в системе не осталось устройств данного класса.

Секции [DefaultInstall32.Xxx] и [DefaultInstall32.Xxx.Services]

В Windows 98 была возможность установки драйвера по нажатию правой кнопки мышки в программе Проводник на inf-файле с последующим выборе в открывшемся меню пункта "Установить". В Windows 2000/XP/2003 для такой установки необходимо наличие в inf-файле секций [DefaultInstall32.Xxx] и [DefaultInstall32.Xxx.Services], где "Ххх" обозначает суффиксы декорирования имен nt, ntx86, ntia64.

Использование таких секций и усеченная установка из программы Проводник (то есть без вовлечения Мастера Установки) зачастую дают неприемлемые результаты, поэтому рекомендуется при установке драйверов использовать обычный способ установки через Мастера Установки новых устройств.