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

Как известно, для более не менее серьезного программного продукта обычно требуется специальная программа инсталляции, с помощью которой пользователь сможет легко установить и также легко удалить сам продукт. Существует много инструментальных средств, позволяющих быстро создавать инсталляционные пакеты. Однако, большинство из них добавляют к исходному размеру продукта 200-500 килобайт. А ведь это далеко не всегда приемлемо. Серьезный продукт еще не означает большой по размеру. И если вы хотите сделать инсталляцию доступной в Сети, то эти 200-500 килобайт могут сильно сказаться на популярности продукта.

Как выйти из подобной ситуации? Прежде, чем ответить на данный вопрос рассмотрим, как это делают инсталляционные пакеты корпорации Microsoft. Любой из таких пакетов Вы можете открыть в архиваторе WinZip. Обратите внимание на файлы с расширением *.inf. При установке программы операционная система обращаеться к одному из таких файлов и руководствуеться его условиями (или сценарием) установки. Именно с помощью INF-файлов можно удалять, копировать другие файлы, добавлять информацию в реестр, в INI-файлы, создавать ярлыки, вообщем делать тоже самое, что и громоздкие программы установки. При этом мы получим приблизительно 2-4 килобайта лишнего веса. Давайте и мы заставим операционную систему Windows работать на нас и перейдем к изучению спецификации INF-файлов.

INF-файл представляет собой текстовый файл, который, как уже говорилось ранее, содержит условия установки программного обеспечения. Чтобы запустить INF-файл, нужно щелкнуть по нему правой кнопкой мыши и выбрать в открывшемся контекстном меню параметр "Установить" (Install). Но для дистрибутива лучше воспользоваться для этого WinZip Self-Extractor, который поддерживает запуск INF-файлов. С помошью данной программы и со знанием INF-файлов можно создавать профессиональные инсталляционные пакеты. Основную информацию в INF-файле содержат следующие секции (более сложные INF-файлы могут иметь дополнительные секции).

СекцияОписание
[Version] Подтверждает .inf файл.
[DefaultInstall] Содержит информацию о действиях, которые будут выполнены. Эта секция выполняется по умолчанию.
[DestinationDirs] Определяет позиции (папки) на жестком диске где или куда файлы будут скопированы, удалены, переименованы.
[SourceDisksNames] Название диска, содержащего файлы. Имя инсталяционного пакета.
[SourceDisksFiles] Здесь указываются Файлы, которые включены в данный проект.
[Strings] Список локализированых строк. Чтобы не повторять длинные фразы несколько раз.
[Optional Components] Название приложения, которое будет отображено в аплете Панели управления Установка/Удаление программ.

Секция [Version] обязательно должна включать данную строку:
Signature="$Chicago$"

Эта секция определяет стандартный заголовок для всех .inf файлов Microsoft Windows. Если сигнатура не $Chicago$, Windows не примит .inf файл, как принадлежащий любому из классов устройств признанных Windows. При написании сигнатуры Вы можете использовать как верхний так и нижний регистры - $Chicago$ или $CHICAGO$.

Секция установки [DefaultInstall] может содержать следующие данные:

CopyFiles=копирование файлов
RenFiles=переименование файлов
DelFiles=удаление файлов
UpdateInis=изменение данных в .ini файлах
UpdateIniFields=изменение областей в .ini файлах
AddReg=добавление информации в реестр
DelReg=удаление информации из реестра
Ini2Reg=перемещение строки или секции в .ini файлах
UpdateCfgSys=изменение файла Config.sys
UpdateAutoBat=изменение файла Autoexec.bat

Секция установки идентифицируют дополнительные секции в .inf файле, которые содержат установочную информацию для компонента. Например:

[DefaultInstall]
CopyFiles=copy.html ;Это не имя файла, а имя секции (может быть любым)

[copy.html]
Example.html
;Файл для копирования...

[DestinationDirs]
DestExampleFiles=10 ;Идентификатор папки назначения (т.е. копировать в C:\Windows)

Цифровые обозначения папок, применяемые в INF-файлах.
Для идентификации системных каталогов inf- файл использует цифровые идентификаторы, которые представлены ниже. Корневой загрузочный диск C:\ указан условно. Программа установки будет сама определять букву диска.

10 - C:\WINDOWS
11 - C:\WINDOWS\System
12 - C:\WINDOWS\SYSTEM\IOSUBSYS
13 - C:\WINDOWS\COMMAND
17 - C:\WINDOWS\Inf
18 - C:\WINDOWS\Hlp
20 - C:\WINDOWS\FONTS
21 - C:\WINDOWS\SYSTEM\VIEWERS
22 - C:\WINDOWS\SYSTEM\VMM32
23 - C:\WINDOWS\SYSTEM\COLOR
30 - Корневой загрузочный диск (обычно C:\)

Если нужно скопировать файл в папку WEB, которая находиться в каталоге WINDOWS, пропишите следуещее:

[DestinationDirs]
DestExampleFiles=10,WEB

Никаких пробелов после запятой быть не должно. Также можно поступать с другими папками, находящимися в определенных каталогах.

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

[Version]
Signature=$Chicago$

[DefaultInstall]
Copyfiles=ExampleCopyFiles
;Подсекция может быть названа как угодно

[SourceDisksNames]
1="
Имя диска","",1

;Перечисляете файлы, которые включены в данный диск
[SourceDisksFiles]
Example.exe=1
Example.vxd=1


;Перечисляете файлы для копирования (о цифрах через три запятые читайте ниже)
[ExampleCopyFiles]
Example.exe,,,1
Example.vxd,,,1


;Указываете папку, в которую будут копироваться файлы (10 - C:\WINDOWS)
[DestinationDirs]
ExampleCopyFiles=10

Цифры через три запятые обозначают дополнительные флаги при копировании файлов и могут быть следующими:

ЗначениеОписание
1Запрещает пользователю пропускать файлы, если их нет на исходном диске. (клавиша "Пропустить" не активна, установка невозможна)
2Разрешает пользователю пропускать файлы, если их нет на исходном диске. (клавиша "Пропустить" активна, установка возможна)
4Перезаписывает файлы в любом случае (проверка версии игнорируется).
8Если файл используеться, программа установки заменяет его после перезагрузки.
16Если файл существует, то копирование не происходит.
32Не перезаписывает новые файлы.

Раздел CopyFiles может копировать файл непосредственно в секции [DefaultInstall]. Для этого перед файлом нужно поставить символ @. Следующий пример копирует два файла (выделены красным):

CopyFiles=@myfile.txt, @anotherfile.txt

Секция переименования файлов (RenFiles).
Параметр RenFiles содержит секции, которые в свою очередь содержат имена файлов для переименования. Папка, где будет происходить переименование должна быть определена в секции [DestinationDirs] INF-файла. Следующий пример переименовывает два файла из *.bmp в *.txt:

[Version]
Signature=$Chicago$

[DefaultInstall]
RenFiles=ExampleRenameOldFiles

[SourceDisksNames]
1="
Имя диска","",1

;Перечисляете старые имена файлов
[SourceDisksFiles]
Example1.bmp=1
Example2.bmp=1


;Определяете файлы, которые будут переименовываться
[ExampleRenameOldFiles]
Example1.txt, Example1.bmp
Example2.txt, Example2.bmp


;Указываете папку, в которой будут преименовыватся файлы (10 - C:\WINDOWS)
[DestinationDirs]
ExampleRenameOldFiles=10

Все старые имена файлов (Example1.bmp, Example2.bmp) должны быть определены в секции [SourceDisksFiles].

Секция удаления файлов (DelFiles).
Параметр DelFiles содержит секции, которые содержат имена файлов для удаления. Папка, где будет происходить удаление, как всегда, должна быть определена в секции [DestinationDirs] INF-файла. Следующий пример удаляет два файла:

[Version]
Signature=$Chicago$

[DefaultInstall]
DelFiles=ExampleDelFiles

[SourceDisksNames]
1="
Имя диска","",1

;Перечисляете файлы для удаления
[SourceDisksFiles]
Example.dll=1
Example.ocx=1


;Определяете файлы, которые будут удалены
[ExampleDelFiles]
Example.dll
Example.ocx


;Указываете папку, в которой будут удалены определенные файлы (10 - C:\WINDOWS)
[DestinationDirs]
ExampleDelFiles=10

Секция добавления в реестр (AddReg).
В параметре AddReg указываются секции, которые содержат информацию о добавлении или изменении ключей, значений в реестре. Следующий пример регистрирует Вашу копию операционной системы Windows.

[Version]
Signature=$Chicago$

[DefaultInstall]
AddReg=ExampleAddRegistry


;Определяете информацию, которая будет добавлена в реестр
[ExampleAddRegistry]
HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion", "RegDone",,"1"
HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion\ Welcome\RegWiz","@",,"1"

С помощью этого файла в реестр добавляеться следующая информация:

Ключ реестра -
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
Параметр со значением -
"RegDone"="1"

Ключ реестра -
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Welcome\RegWiz
Параметр со значением -
"@"="1"

Обратите внимание на запятые в inf файле. Если нужно добавить в реестр параметр по умолчанию, запятые должны быть проставлены по-другому. Например, в расмотренном нами ключе реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion поставим параметр по умолчанию равным единице (1):

HKLM, "SOFTWARE\Microsoft\Windows\CurrentVersion",,,"1"

Ниже представлены корневые имена реестра:

HKCR - HKEY_CLASSES_ROOT
HKCU - HKEY_CURRENT_USER
HKLM - HKEY_LOCAL_MACHINE
HKU - HKEY_USERS
HKR - Относительный ключ, используеться классом installer. HKR обычно используеться дисками устройства.

Секция удаления из реестра (DelReg).
В параметре DelReg указываются секции, которые содержат информацию об удалении подключей с параметрами и значениями из реестра. Следующий пример удаляет подключ Graphviz со всеми параметрами и значениями раздела реестра - HKEY_CURRENT_USER\Software\AT&T\Graphviz.

[Version]
Signature=$Chicago$

[DefaultInstall]
DelReg=ExampleDelRegistry


;Определяете информацию, которая будет удалена из реестр
[ExampleDelRegistry]
HKLM, "HKEY_CURRENT_USER\Software\AT&T\Graphviz"

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

Отображение и запуск файлов.
В процессе установки можно прервать выполнение INF файла для показа пользователю какого-нибудь документа, после закрытия которого установка продолжиться, или запустить определенный процесс. Следующий пример отображает файл справки About.hlp, текстовый файл About.txt и запускает другой INF-файл - Example.inf.

[Version]
Signature=$Chicago$

[DefaultInstall]
AddReg=ExampleView


;Отображение файла справки About.hlp
[ExampleView]
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"WINHLP32.EXE - Main %1%\About.hlp"


;Отображение текстового файла About.txt
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"notepad %1%\About.txt"

;Запуск файла сценария Example.inf
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"rundll setupx.dll,InstallHinfSection DefaultInstall 132 %1%\Example.inf"

;Определяете название, которое будет отображатся в
;окне "Установка Windows..."

[Strings]
ABOUT="О программе ..."

После того, как определенные в секции [ExampleView] команды выполнятся, записи, добавленные в реестр, будут автоматически удалены из него. Таким способом можно запускать и другие процессы, например, аплеты Панели управления:

;Запуск апплета Панели управления - Свойства: Система (SYSDM.CPL)
HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup,%ABOUT%,,"rundll32 shell32,Control_RunDLL SYSDM.CPL"

Секция изменения данных в .INI-файлах (UpdateInis).
В данном примере показано как можно с помощью inf-файла изменить содержимое ini-файла.

[Version]
Signature=$Chicago$

[DefaultInstall]
UpdateInis=ExampleAddINIfiles


;Указываете папку, где находиться файл system.ini, например в папке
; Example, которая расположена в каталоге C:\Program Files - 30,PROGRA~1\Example

[DestinationDirs]
ExampleAddINIfiles=30,PROGRA~1\Example


;Определяете название файла и секции добавляемых, удаляемых или заменяемых строк
[ExampleAddINIfiles]

;Добавляете в секцию [boot] файла system.ini строку shell=Example.exe
system.ini, boot,, "shell=Example.exe"

;Удаляете из секции [boot] файла system.ini строку shell=Example.exe
system.ini, boot, "shell=Example.exe"

;Заменяете из секции [boot] файла system.ini строку shell=Example.exe на shell=Example8.exe
system.ini, boot, "shell=Example.exe", "shell=Example8.exe"

Как вы успели заметить мы указали каталог Program Files как PROGRA~1, т.е. указали с коротким именем. В INF-файлах есть некоторые проблемы применение длинных имен файлов. Но об этом мы поговорим в другой статье...

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

Следующий пример создает группу программ "Windows + +" в меню "Пуск\Программы" и ярлыки к утилитам winipcfg.exe (Конфигурация IP), Regedit.exe (Редактор реестра) и Winfile.exe (Диспетчер файлов). Все они есть у Вас на компьютере или должны быть в зависимости от операционной системы и находяться в папке С:\Windows.

[Version]
Signature=$Chicago$

[DefaultInstall]
UpdateInis=ExampleShortcut


;Определяете название и размещение ярлыков
[ExampleShortcut]
setup.ini, progman.groups,, "group1=""Windows + +"""
setup.ini, group1,, """Конфигурация IP"",""""""%30%\WINDOWS\winipcfg.exe"""""",,,,""%30%\WINDOWS"",""winipcfg.exe"""

setup.ini, progman.groups,, "group1=""Windows + +"""
setup.ini, group1,, """Редактор реестра"",""""""%30%\WINDOWS\Regedit.exe"""""",,,,""%30%\WINDOWS"",""Regedit.exe"""

setup.ini, progman.groups,, "group1=""Windows + +"""
setup.ini, group1,, """Диспетчер файлов"",""""""%30%\WINDOWS\Winfile.exe"""""",,,,""%30%\WINDOWS"",""Winfile.exe"""

Ярлык прописуеться в таком порядке:

1. Название группы программ "Windows + +". (выделено синим)
2. Имя ярлыка. (выделено зеленым)
3. Путь к программе, к которой создается ярлык. (выделено красным)
4. Рабочий каталог, обычно тот же, что и путь. Некоторые программы не работают, если Рабочий каталог задан другой. (выделено розовым)
5. Имя программы с расширением. (выделено коричневым)

Параметр %30%\ определяет корневой диск. Если Вы хотите создать ярлык к файлу, который находиться в каталоге Program Files смело прописывайте полный путь (не используйте короткие имена - 8.3 имена), например, %30%\Program Files\Setup Generator Pro\Sgpro.exe.

Для удаления ярлыка нужно убрать все записи, указанные после Имени ярлыка. В следующем примере удаляется ярлык Конфигурация IP из программной группы Windows + +

[ExampleShortcut]
setup.ini, progman.groups,, "group1=""Windows + +"""
setup.ini, group1,, """Конфигурация IP"""

Если Вы удаляете один ярлык из программной группы, а там присутствуют и другие, то удаление не затронет другие ярлыки. Для полного удаления программной группы нужно прописать данное действие для каждого ярлыка.

Выполнение INF-файла в командной строке.
В командной строке INF-файл можно выполнит следующей конструкцией:

%WINDIR%\rundll setupx.dll,InstallHinfSection DefaultInstall 132 Путь\inf_файл

Параметр DefaultInstall - это имя секции, которая будет выполняться. В команде его можно заменить на любое другое (если секция с таким именем не будет найдена, то ничего не будет "выполняться", и сообщений об ошибках тоже не будет).

Параметр 132 - режим перезагрузки после выполнения inf файла. Существуют следующие значения этого параметра:

0 или 128 - не перезагружать компьютер.
1 или 129 - обязательно и без вопросов перезагрузить компьютер.
2 или 130 - спросить у пользователя, перезагружать компьютер или нет.
3 или 131 - определить, надо или нет перезагружать компьютер. Если нужно перезагружать, то выполнить перезагрузку без вопросов.
4 или 132 - определить, надо или нет перезагружать компьютер. Если нужно перезагружать, то спросить у пользователя, перезагружать компьютер или нет.

Иногда нужно перезаписать файл, который используется системой. В таком случае примените значение, отвечающее за перезагрузку. Сразу после перезагрузки произойдет перезапись файлов.

Параметр Путь\inf_файл нельзя брать в кавычки. Пробелов в нeм тоже быть не должно т.е. надо использовать 8.3 имена.

Данная статья не претендует на полноту, но, надеюсь, поможет Вам освоить INF-файлы хотя бы поверхностно. Не бойтесь экспериментировать, но будьте предельно осторожны, особенно с процессами удаления.

Copyright © 2002-2008 by Vladimir Drigalkin aka LENIN INC. All Rights Reserved.