[Previous] [Next]

Секции [DDInstall]

Для каждой модели, указанной в секции описания моделей аппаратуры данного поставщика, следует сделать ссылку на секцию описания собственно установки программного обеспечения драйвера — секции [DDInstall]. Конкретное название этой секции устанавливает разработчиком драйвера и, в общем случае, должно быть уникальным для каждой модели каждого производителя из тела каждой секции описания моделей. Однако бывают случаи, когда одному драйверу удается обслуживать сразу несколько моделей PnP устройств, предоставляющих при подключении разные идентификаторы. В таких случаях возможна ситуация, когда одна секция типа [DDInstall] соответствует сразу нескольким ссылкам из секции описания моделей.

Основные директивы секции [DDInstall] перечисляются в таблице 12.3. По поводу использования остальных следует обратиться к документации пакета DDK.

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

Записи Значения
DriverVer mm/dd/yyyy[,x.y.v.z]
Здесь версия драйвера может быть введена через запятую после указания даты
CopyFiles Любое имя секции, указывающей имена файлов для инсталляции, либо конкретное имя файла, предваряемое префиксом @
CopyInf Директива, определяющая копирование inf-файлов на целевой диск. Введена только в Windows XP.
AddReg Обязательна для ввода. Перечисляет имена секций, где содержится информация, предназначенная для занесения в Системный Реестр во время инсталляции.
Include Указатель на другие INF файлы, необходимые для данной инсталляции
Needs Подмножество/а записи Include (выше), перечисляющее имена всех необходимых секций (считая все включаемые INF файлы).
DelFiles Указывает имена других секций, которые перечисляют файлы, подлежащих удалению в целевой директории (обычно, в процессе обновления, upgrade).
RenFiles Указывает имена других секций, которые перечисляют файлы, подлежащих переименованию перед инсталляцией (обычно, чтобы сохранить состояние предыдущей инсталляции). Об организации секций, описывающих переименование см. подробнее в документации DDK.
DelReg

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

В то время, как AddReg требуется только с точки зрения синтаксиса, директива CopyFiles является весьма значимой директивой секции [DDInstall]. Директива CopyFiles имеет форму

CopyFiles = file_list_section[,file_list_section...]

либо

[email protected]

Первый из двух вышеприведенных вариантов является более емким, поскольку позволяет косвенно указать другую секцию, где содержится список файлов, подлежащих инсталляции. Однако для простых инсталляций, непосредственное указание имени файла успешно справляется с этой задачей. Назначение AddReg и CopyFiles более проясняется в нижеследующих частях данной главы.

Когда имя секции [DDInstall] упоминается в ссылке из секции описания модели, то суффиксы, задающие версию системы, применять не следует. В момент ссылки в директивах секций описания моделей имя секции [DDInstall] задается универсально, одинаково для всех типов операционных систем (без стандартных суффиксов, типа .NT или .NTx86). Зато, в начале собственно тела секции, имя [DDInstall] секции может быть декорировано одним из суффиксов типа .nt, .ntx86 или ntia64, что означает принятие к исполнению данной секции только в соответствующей операционной системе. Пример ниже демонстрирует, что конкретизация происходит в момент описания собственно секции [DDInstall].

[Manufacturer]
%MSFT%=MSFT

[MSFT]
%_MCADesc%=_MCA_Inst, _MCA0000

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

Здесь в секции моделей [MSFT] введена ссылка на [DDInstall] секцию с конкретным именем _MCA_Inst, и эта секция была введена только для использования в Windows NT. Поэтому имя было декорировано суффиксом .NTx86, что в результате выглядит как [_MCA_Inst.ntx86].

Секция [DDInstall.Services]

Чтобы скопированные в положенное место файлы действительно заработали как настоящий драйвер, необходимо надлежащим образом уведомить SCM Менеджер. Соответственно, для этого необходимо иметь записи в системном Реестре в разделе HKLM\System\CurrentControlSet\Services по поводу каждого драйвера.

В Windows 2000/XP/2003 работа по регистрации драйвера вынесена в отдельный тип секций [DDInstall.Services].

Можно считать, что данная секция является придатком секции [DDInstall] и всего лишь конкретизирует, какие секции inf-файла (service-install-section) определяют, что именно будет внесено/удалено в Системный Реестр в рамках установки драйвера. В Windows 98 следовало пользоваться директивой AddReg в секции [DDInstall]. В Windows 2000 inf-файл стал сложнее, и работа с Системным Реестром была выделена в еще один "промежуточный" тип секций [DDInstall.Services].

В том случае, если имя [DDInstall] секции декорировано одним из суффиксов .nt, .ntx86 или ntia64 (что означает принятие к исполнению данной секции только в соответствующей операционной системе), то суффикс .Services следует присоединять именно к получившемуся декорированному имени [DDInstall.Xxx].

Среди записей секции [DDInstall.Xxx.Services] имеется обязательная директива AddService (помимо еще трех необязательных), которая имеет вид:

AddService=service-name,[flags],service-install-section[ ,eventlog-install-section[,event-log[,event-name]]]

где service-name представляет название сервиса, что обычно совпадает с названием Драйвера (если отбросить расширение .sys). Подраздел с таким именем будет создан в результате инсталляции в разделе Системного Реестра HKLM\System\CurrentControlSet\Services.

Директив AddService в секциях [DDInstall.Xxx.Services] может быть несколько.

Возможные значения поля flags приводятся в таблице 12.4. Можно вводить значения, которые представляют "побитовое ИЛИ" указанных в таблице значений.

Значение поля service-install-section и необязательное для ввода значение поля eventlog-install-section (ссылка на секцию, где описывается установка сервисов протоколирования) объявляют имена секций INF файла типа [ServiceInstall], например:

[Manufacturer] ; секция описания поставщиков
%ThisMfg%=DeviceList


[DeviceList]   ; секция описания моделей
%Model1%= Model1_Inst, _MXX0001 ; <- идентификатор

[Model1_Inst.ntx86] ; [DDInstall] секция инсталляции для NT
. . . .
[Model1_Inst.ntx86.Services]   ; установка драйвера как сервиса Mxx0001
; Поле flags имеет значение 0x0002 (см. таблицу 12.4)
; ссылка на секцию [ServiceInstall]
AddService= Mxx0001, 0x0002, MODEL1_ADDSERVICE_SECTION

[MODEL1_ADDSERVICE_SECTION] ; секция [service-install-section]
DisplayName  = %Model1.ServiceDesc%
ServiceType  = 1 ; = SERVICE_KERNEL_DRIVER, см. ntddk.h, wdm.h
StartType    = 3 ; = SERVICE_DEMAND_START, см. ntddk.h, wdm.h
ErrorControl = 1 ; = SERVICE_ERROR_NORMAL, см. ntddk.h, wdm.h
ServiceBinary= %12%\SpecialDrv.sys

[Strings]  ; Расшифровка значений
ThisMfg= "This Manufacturer"
Model1= "Model1 (made by This Manufacturer)"
Model1.ServiceDesc= "Model1 Special Driver v.1.000" 

Таблица 12.4. Значения flags директивы AddService

Значение Символьное имя SPSVCINST_Xxx Описание
0x0002 SPSVCINST_ASSOCSERVICE Драйвер является функциональным драйвером или драйвером в "стиле-NT"
0x0008 ...NOCLOBBER_DISPLAYNAME Не переписывать существовавшее в Системном Реестре значение DisplayName, если такой сервис уже был установлен ранее
0x0100 ...NOCLOBBER_DESCRIPTION Не переписывать описание
0x0010 ...NOCLOBBER_STARTTYPE Не переписывать StartType
0x0020 ...NOCLOBBER_ERRORCONTROL Не переписывать ErrorControl
0x0040 ...NOCLOBBER_LOADORDERGROUP Не переписывать LoadOrderGroup
0x0080 ...NOCLOBBER_DEPENDENCIES

Не переписывать Dependencies

Более подробно организация секций типа [ServiceInstall] (включающих директивы DisplayName, ServiceType, StartType и т.п.) будет рассмотрена далее, после описания секций типа [AddReg].

В секциях типа [DDInstall.Services] могут быть введены директивы DelService (удаления ранее установленных сервисов), Include (включения текста внешних inf-файлов) и директива Needs. Для получения информации по данным необязательным директивам следует обратиться к соответствующей документации, например, документации DDK.