Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...

Руководство по созданию аддонов

Текущий рейтинг: 4.62 (проголосовало 65)
 Посетителей: 45360 | Просмотров: 71417 (сегодня 0)  Шрифт: - +

Содержание

Введение

Данное руководство было написано большей частью для желающих постигнуть, как устроены и работают аддоны для Update Pack от Petya V4sechkin. Учитывая потрясающую активность в разделе “Наборы обновлений для Windows XP\2003”, связанную в первую очередь с аддонами, считаю, что данное Руководство будет не лишним, как для людей еще не умеющих создавать аддоны, так и для авторов аддонов (например, будет, куда отсылать надоедливых новичков :-).

Хотелось бы отметить, что многие материалы для статей в этом Руководстве почерпнуты в ветке Авторам аддонов, которая предназначена для обсуждения любых вопросов, связанных с написанием аддонов.

Все предложения по доработке и дополнению этого Руководства пишите в ветку обсуждения Руководства.

Как пользоваться руководством

Перед прочтением данного руководства ознакомьтесь со следующими руководствами:

Если Вы новичок в написании аддонов, то рекомендуется прочитать для начала следующие разделы :

Раздел I. Общие понятия и  Раздел II. Типы аддонов Глава 2. Аддоны, использующие для интеграции SVCPACK. Эти темы легче в изучении, и помогут Вам изучить основы написания аддонов. Затем, прочтя Руководство по написанию INF-файлов, можете приступать к изучению аддонов типа SYSOC и прочих разделов.

Соглашения

Данное руководство применимо только к скрипту Update Pack от Petya V4sechkin. Подразумевается что операционная система - Windows XP, если не сказано иначе.

Применяются следующие выделения текста:

Файлы ОС - жирный: File.ext

Файлы скрипта Update Pack- курсив: File

Прочие команды, секции - курсив: [Other]

Пути, папки заключены в квадратные скобки - [С:\Folder\Subfolder]

К содержанию


Раздел I. Общие положения.

Аддон (буквально дополнение) - программа, модифицированная специальным образом для интеграции посредством Update Pack в дистрибутив Windows XP, с целью последующей автоматической установки вместе с ОС.


Для лучшего понимания приведу пример. Есть программа Total Commander, которая является файловым менеджером. Она позволяет просматривать папки и файлы, но не умеет просматривать картинки сразу в панели. А вам очень нужна такая функция. Вы скачиваете (или создаете) плагин для Total Commander, который добавляет возможность просматривать картинки прямо в панели.

Аналогичным образом аддоны являются плагинами к набору обновлений. Update Pack служит для добавления в дистрибутив Windows обновлений и заплаток. Побочной функцией является возможность интегрировать программы в дистрибутив, используя тот же механизм, что и обновления (SVCPACK, SYSOC). Только в нашем случае эта возможность называется не плагин, а аддон.

Плюсы использования аддонов. При установке вместе с Windows устанавливаются все необходимые вам программы, утилиты и драйверы. Это происходит автоматически - без вашего участия. Нет необходимости во множестве перезагрузок. Аддоны просты в создании и не требуют специальных знаний (по крайней мере, аддоны типа SVCPACK). При установке ОС и программ на большое количество компьютеров аддоны сильно экономят ваше время. Аддоны позволяют интегрировать в дистрибутив новые драйверы, а также удалить лишние или ненужные компоненты.

Минусы использования аддонов. Самый главный минус состоит в том, что установщик Windows изначально не рассчитан на установку стороннего програмmного обеспечения, поэтому возможны различные конфликты и ошибки несовместимости. Справедливости ради стоит сказать, что происходит это очень редко. Кроме того, сформированный с помощью аддонов набор программ автоматически устанавливается вместе с системой, не давая пользователю возможности выбрать приложения для установки. Существуют варианты аддонов, которые позволяют делать какой-либо выбор на этапе установки (WinSIF и т.д.), но делается это путем различных хитростей и подменой дистрибутивных файлов, что тоже не очень хорошо. Лучше воспользоваться одной из программ позволяющей выбрать устанавливаемые приложения сразу после установки Windows.
Еще один минус - увеличение размера дистрибутива и времени установки (если интегрируются ресурсоемкие аддоны). Кроме того, при использовании плохо отлаженных или конфликтующих аддонов возникают различные трудно отлавливаемые ошибки в работе Windows, которые не исчезают даже при удалении установленных приложений-аддонов.

Имена файлов и папок.

Все файлы аддонов типа SYSOC должны иметь имена в формате 8.3. В этом же формате должны именоваться CAT-файлы используемые во всех типах аддонов.  Имена файлов и папок не должны содержать пробелов и спецсимволов (например, в Txtsetup Sysoc имена со спецсимволами и длинными именами не будут обработанны).

  • Для папки аддона лучше выбрать короткое и понятное название (например, DrWeb444, CCleaner). Для быстрого определения версии аддона можно в название папки включать дату создания аддона в формате Y.MM.DD (например, DrWeb_8.11.3).

 Важно! Для разделения смысловой информации в названии папки с аддоном можно использовать подчеркивание или точку. Эти два символа обрабатываются скриптом корректно.

  • Поскольку аддоны выкладываются и хранятся, в основном, в архивах, а названия самих папок разных версий аддона зачастую неизменны, в названии архива с аддоном обязательно указывать версию и дату создания аддона - дабы пользователи и авторы могли разобраться. Рекомендуемый формат имени архива: AddonName_YYYYMMDD, где AddonName в зависимости от ситуации, имя аддона; имя аддона и номер версии программы; имя аддона, версия программы и автор (если авторов несколько).
  • Вообще, в самом начале имеет смысл взять на вооружение следующую нумерацию версий аддона: Y.MM.DD. Одно дело, когда в год выходит 1 версия программы, другое - когда еженедельно выходят обновления, заплатки и соответственно переделываются аддоны. Так пользователям понятнее и экономятся цифры. Зачем писать и дату, и версию, когда можно совместить?
  • В целях совместимости с Update Pack, рекомендуется применение в описании аддонов (файл Addon.nfo) стандартных кодировок и форматирования.
  • Префиксы в названиях папок аддонов. В результате огромной популярности Update Pack и возросшего количества аддонов, возросли и "баги" в результате накладок при интеграции аддонов. Это происходит в результате воздействия несколькими аддонами на один и тот же конечный файл (запись в реестре, INF-файле). Чтобы получить рабочий дистрибутив, необходимо определить в каком порядке какой аддон должен устанавливаться. По умолчанию скрипт Update Pack обрабатывает аддоны в алфавитном порядке. Наверняка, вы заметили в списке аддонов на wiki аддоны с названиями, начинающимися на "zz_". Это сделано для того, чтобы аддон обработался в последнюю очередь. Также, можно воспользоваться префиксами и самостоятельно определить порядок обработки аддонов скриптом. В качестве префикса используется цифра с тире в начале названия папки аддона, причем, чем меньше цифра, тем раньше будет обрабатывается аддон. Посмотреть пример использования префиксов (составил Shido): Приложение 1. Префиксы

Важно! При переименовании папок аддонов всегда помните, что в конфигурационных файлах Required и Conflict  используется статичное имя папки аддона, то есть после переименования папки аддона (допустим, по причине добавления префиксов), он уже не будет проверятся на конфликты с другими аддонами.

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

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

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

Дополнительно про именование версий программ можно почитать в серии статей Занимательная нумерология (блог Проничкиных).

К содержанию


Структура аддонов

Структура аддонов почти полностью совпадает со структурой основного пакета (рекурсии не предусмотрено)

Пример структуры папок для Update Pack c аддонами:

UPDATE PACK-
+ADDONS (папка аддонов)
-+Example (папка конкретного аддона)
--+Files (папка файлов аддона)
---+Compresed
---+ForceCopy

----+SVCPACK


-Run
-KillWFP.lst
-Finish
-Addon.nfo         >(конфигурационные файлы)
-Required
-Conflict
-Hive

-+Example2 (папка второго аддона)
--+Files  (папка файлов второго аддона)
---+Compresed
---+ForceCopy
-Dosnet
-Sysoc
-Txtsetup
-Addon.nfo         >(конфигурационные файлы)
-Required
-Conflict


+FILES (папка файлов UpdatePack)

К содержанию


Конфигурационные файлы.

Данные файлы служат для управления скриптом Update Pack при интеграции аддона. .Они находятся в корневой папке каждого аддона.

Ни один из них не является обязательным, все зависит от конкретного аддона :

  • Dosnet - содержимое добавляется в Dosnet.inf в чистом виде;
  • Txtsetup - добавляется в Txtsetup.sif в чистом виде;
  • Sysoc - добавляется в секцию [Components] файла Sysoc.inf; (должен заканчиваться пустой строкой)
  • Run - добавляется в секцию [SetupHotfixesToRun] файла Svcpack.inf; (должен заканчиваться пустой строкой, не должен содержать символов '-','=')
  • SpecCase - специальные случаи (например, если нужно удалить что-то из дистрибутива перед тем, как скопировать туда новые файлы); фактически это CMD-файл, только без  расширения);
  • KillWFP.lst - список файлов, для которых нужно отключить Windows File Protection;
  • Finish - фактически это CMD-файл (без расширения), выполняется после завершения интеграции всех компонентов;
  • DelDrv.lst - файлы в любом виде удаляются из I386 и CAB-файлов, удаляются из Dosnet.inf и Txtsetup.sif, выводятся из списка защиты (патч Sfcfiles.dll);
  • DelOC.lst - файлы в любом виде удаляются из I386, удаляются из Dosnet.inf и Txtsetup.sif (а также из Sysoc.inf, если есть), выводятся из списка защиты;
  • Addon.nfo - краткая информация об аддоне и дата создания (при сборке все эти файлы сливаются в один Addons.txt, который пишется в корень дистрибутива); см. Приложение 8. Файл Addon.nfo
  • Required - содержит список аддонов, от которых зависит данный аддон. Если этих аддонов нет, интеграция прекращается.
  • Conflict - список аддонов, с которыми несовместим данный аддон. Если эти аддоны есть, интеграция прекращается.
  •  Hive - специфические твики реестра, при сборке из них формируется один Hivepck.inf, который прописывается в секцию [HiveInfs.Fresh] файла Txtsetup.sif и выполняется на текстовом этапе установки (см. руководство от Gosh); в файле Hive секции указывать не надо;
  • Start - выполняется до интеграции всех компонентов, фактически это CMD-файл без расширения;
  • Upd - файл для обновления (при его обнаружении скрипт удаляет папку Compressed, переименовывает Upd в Upd.cmd и выполняет его, причем при выполнении текущей директорией становится папка аддона).

Важно! При выполнении файлов Start, SpecCase, Finish первым параметром передается путь к аддону в виде [Addons\Имя_папки_аддона]. Из самого файла его можно получить через переменную командной строки %1.

К содержанию


Обработка аддонов скриптом Update Pack.

Изучив структуру папок и конфигурационные файлы скрипта Update Pack, давайте посмотрим, как он работает с аддонами.

После выполнения собственных действий скрипт приступает к обработке аддонов. Аддоны, находящиеся в папке скрипта [Addons], обрабатываются в алфавитном порядке. Скрипт проверяет условия, заданные в конфигурационных файлах Required, Conflict и, если все нормально, продолжает работу, в противном случае выдается ошибка. Затем скрипт выполняет конфигурационный файл Start до начала других действий, далее основные операции с аддонами и последним выполняется конфигурационный файл Finish (при условии, конечно, что эти конфигурационные файлы присутствуют в папке аддона).

Обработка файлов в папках аддона.

Структура папок

Addon Folder

+Files
-+Compressed
-+ForceCopy
--+SVCPACK

В корневой папке размещаются конфигурационные файлы аддона для скрипта. Эти файлы никуда не копируются.


В папке Files размещаются непосредственно файлы аддона. Файлы, размещенные в корне этой папки, скрипт копирует в дистрибутивную папку I386 без учета вложенных папок, с заменой файлов в случае совпадения, предварительно сжимая их в CAB-архив и приводя к виду File.ex_ , либо без дополнительной обработки, если файл дистрибутива не сжат (например, Telnet.exe). Все файлы из этой папки должны быть прописаны в конфигурационных файлах Txtsetup и Dosnet (иначе мастер установки не скопирует их потом из дистрибутива).

Подпапка Compressed служит для временного хранения ранее сжатых файлов из папки Files. Эти файлы могут использоваться скриптом в дальнейшем для экономии времени на упаковку.

Подпапка ForceCopy служит для прямого копирования размещенных в ней файлов с учетом вложенных папок в I386 без дополнительной обработки. Пример: файлы из вложенной папки SVCPACK копируются в [I386\SVCPACK] или из вложенной папки ASMS файлы копируются в [I386\ASMS].

Все записи в чистом виде из конфигурационных файлов Dosnet, Txtsetup добавляются в Dosnet.inf, Txtsetup.sif, а записи из SYSOC добавляются в секцию [Components] файла Sysoc.inf. Записи из конфигурационного файла Run добавляется в секцию [SetupHotfixesToRun] файла Svcpack.inf.

Далее скрипт модифицирует Svcpack.inf согласно имен *.cat - файлов, размещенных в каталоге SVCPACK аддона (если такие файлы требуются). В секцию [ProductCatalogsToInstall] файла Svcpack.inf добавляются имена всех *.cat файлов.

Обрабатывается список файлов, для которых нужно отключить WFP, посредством KillWFP.lst, удалются из дистрибутива и выводятся из-под защиты файлы посредством DelDrv.lst, DelOC.lst (патч Sfcfiles.dll);

Также обрабатывается Addon.nfo, при сборке все эти файлы сливаются в один - Addons.txt, который пишется в корень папки с собираемым дистрибутивом;

К содержанию


РАЗДЕЛ II. Типы аддонов.

В зависимости от способов интеграции в дистрибутив аддоны делятся на 4 типа:

Аддоны, использующие SYSOC

Аддоны этого типа иcпользуют особый вид установки – установку дополнительных компонентов Windows- System optional components (SYSOC). Разработчики решили дать выбор – устанавливать необязательные приложения или нет. Например: Игры, WMP и т.д. Это можно сделать путем правки Sysoc.inf или секции [Components] в файле Unnatend.txt (Winnt.sif).
В установленной системе за работу с дополнительными компонентами отвечает Sysocmgr.exe, который запускается при выборе вкладки “Установка компонентов Windows” в оснастке “Установка и удаление программ”. Все отображаемые данные Sysocmgr.exe, как и установщик Windows, берет из файла Sysoc.inf. Следовательно, именно этот файл и изменяется для добавления аддона в процесс установки Windows и в оснастку “Установка и удаление программ”. Для этого, в INF-файл добавляется секция [Optional Components] , а также дополнительные инструкции в исполняемую секцию. Подробнее об этой секции читайте в Приложении 5.

Кроме того, необходимо изменить сам файл Sysoc.inf, добавив в него запись об интегрируемом аддоне, иначе аддон не установится.  О синтаксисе файла Sysoc.inf читайте в  Приложении 4.

Метод SYSOC не делает аддон частью системы или дополнительным компонентом Windows, он только позволяет использовать механизм SYSOC для установки и удаления аддона. Например, если для вашего аддона достаточно скопировать файлы в определенные папки, то файл Sysoc.inf изменять вообще не нужно. Для копирования файлов достаточно сделать записи в файлах Txtsetup.sif и Dosnet, впрочем, это уже не будет метод SYSOC.

Основные конфигурационные файлы для этого типа аддона:

Txtsetup
Dosnet
Sysoc 

Аддоны этого типа устанавливаются с помощью INF-файлов. Настоятельно рекомендуется сначала прочитать Руководство по работе с INF-файлами. По сути собирается собственный установщик (в отличие от аддонов SVCPACK, где зачастую используются готовые установщики с ключами тихой установки).

Как создать собственный INF для установки нужной программы?

Практически любое приложение устанавливается в три этапа:

  1. Размещение необходимых файлов на жестком диске, создание ярлыков;
  2. Запись ключей реестра;
  3. Регистрация библиотек;

С помощью сторонних утилит (RegShot, Ashampoo Uninstaller) собираем эту информацию об установке программы, для которой будет создаваться аддон.

Затем упаковываем все необходимые файлы в СAB-архив (необязательно, но в целях экономии места желательно), а установка этих файлов осуществляется с помощью INF-файла, который пишется самостоятельно - на основе полученной информации о папках назначения, копируемых в них файлов, добавления ключей реестра, регистрации библиотек dll.

Для построения аддона данного типа необходимо использовать следующие конфигурационные файлы: Sysoc, Txtsetup, Dosnet. Строки из этих конфигурационных файлов добавляются в тело их "тезок" в дистрибутиве.

Файл Txtsetup.sif фактически является списком копируемых файлов для текстового этапа установки, с его помощью копируются файлы и кусты реестра с диска в папку установки Windows.
Файл Dosnet.inf содержит остальные данные для программы установки на текстовом этапе, в том числе папку установки Windows. Этот файл используется при установке Windows с жёсткого диска, по сети, со съемных устройств.
На графическом этапе с помощью Sysoc.inf менеджер установки строит список дополнительных компонентов и сверяет его с файлом ответов (Unattend.txt, Winnt.sif), если такой файл есть. По результатам сверки образуется конечный список устанавливаемых компонентов.
Фактически аддон типа SYSOC работает следующим образом. При компиляции скриптом Update Pack секции из Sysoc, Txtsetup, Dosnet, находящихся в корневой папке аддона, переносятся в дистрибутивные аналоги. Файлы из папки аддона [Files] копируются в папку дистрибутива [I386].
При установке Windows, на текстовом этапе установки файлы, прописанные в списке Txtsetup.sif, копируются из дистрибутива в папку назначения. Затем аддон устанавливается вместе с другими дополнительными компонентами из Sysoc.inf.

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

Пример аддона, использующего SYSOC (addon FoxIT Reader)

FOXITR2 (папка аддона)
+Files(папка файлов аддона)
-+Compresed
-+ForceCopy
--Foxitr2.cab (cab-архив содержит 3 файла собственно программы)
*---fxdecod1.dll
*---FoxitReader.exe
*---lang_ru_ru.xml
--Foxitr2.in_(INF-файл запакованный в CAB-архив)

-Addon.nfo
-Dosnet
-Txtsetup        >(конфигурационные файлы)
-Sysoc

Содержимое Foxitr2.inf (частично)

.......
[SourceDisksFiles]
;Generated with gen_sdf_section script
FoxitReader.exe = 1
fxdecod1.dll = 1
lang_ru_ru.xml = 1                           -Определение копируемых файлов
[DestinationDirs]                               и папок назначения;
DefaultDestDir = 11
FOXITR.Install.Copy = 16422, "Foxit Reader"
.......
[FOXITR.Install.Reg]
HKCR,".pdf",,%REG_SZ%,"FoxitReader.Document"
HKCR,".pdf","Content Type",%REG_SZ%,"application/pdf"   - Добавление параметров в реестр;
.......

Файл Sysoc.inf после компиляции аддона.

[Components]
....
DrWeb=ocgen.dll,OcEntry,DrWeb.inf,hide,7
FOXITR2=ocgen.dll,OcEntry,FOXITR2.INF,,7
klite=ocgen.dll,OcEntry,klite.inf,HIDE,7


Важно! При создании аддонов SYSOC с копированием файлов из CAB-файла, следите, чтобы имена файлов в CAB-файле не совпадали с именами файлов в i386 (сжатыми и несжатыми), в противном случае вместо файла из cab-файле будет скопирован файл из i386.

Важно! Чтобы интегрировать аддон, но при этом не уставить его, чтобы он был доступен впоследствии для установки через менеджер компонентов Windows, необходимо в установочных INF-файлах каждого аддона закомментировать параметр Modes точкой с запятой.

;Modes=0,1,2,3

Важно! Не забывайте про секцию [DefaultInstall] в вашем INF-файле. Она необходима для того, чтобы INF-файл можно было установить в будущем из контекстного меню (а не через вызов Advpack.dll), если предполагается использовать аддон на установленной системе. Пример: аддон Opera использует для автоустановки секцию [opera], но наряду с этим присутствует секция [DefaultInstal].

Важно! Файлы Sysoc, Txtsetup и Dosnet должны заканчиваться пустой строкой.

Важно! Про файлы Txtsetup.sif и Sysoc.inf подробнее читайте в Приложениях 3 и 4 соттветственно.

К содержанию


Аддоны, использующие для интеграции SVCPACK.

Изначально механизм SVCPACK предназначался для установки обновлений, вышедших после выпуска ОС. Однако вместо обновлений можно устанавливать и другие приложения. Самое главное преимущество этого способа - SVCPACK обрабатывается за 13 минут до окончания установки Windows (T13), так сказать на "высоком" уровне, что позволяет использовать оригинальный установщик программы.

Для создания аддона этого типа используется “тихая установка” (с помощью ключей приложений или программ, скрывающих окна). Из конфигурационных файлов обычно используется Run, в котором указывается имя исполняемого файла тихого установщика, располагающегося в папке [Files\SVCPACK ]аддона. Однако при необходимости можно применять и другие конфигурационные файлы: KillWFP.lst, Start, Finish, Required, Conflict, используемые на этапе интеграции аддона в дистрибутив (возможна ситуация, когда в аддоне вообще не нужны конфигурационные файлы, например аддон состоит из CAT-файлов).

В процессе работы скрипта Update Pack все файлы из папки аддона [Files\ForceCopy\SVCPACK ]копируются в папку [I386\SVCPACK] дистрибутива Windows. Вся последовательность записей из файла Run добавляется в секцию [SetupHotfixesToRun] файла Svcpack.inf дистрибутива Windows.

Приложения, внесенные в секцию [SetupHotfixesToRun] файла Svcpack.inf и находящиеся в [I386\SVCPACK], начинают поочередно выполняться на Т13, в порядке указания в секции.
В аддонах типа SVCPACK обычно используют SFX архивы (7z, RAR, и т.д.), либо исполняемые файлы, которые могут быть использованы и для установки на "живую" систему или "тихой" установки.

Здесь нужно сделать отступление и рассказать об аддонах-конструкторах. Именно способ SVCPACK как нельзя лучше подходит для создания конструкторов. В таком конструкторе отсутствует дистрибутив. Это уменьшает размер скачиваемого аддона и оставляет выбор пользователю, так как зачастую конструктор подходит для разных билдов и даже версий программы (например, ACDSee 10 и ACDSee Pro2, K-Lite Codec Pack Full и Mega Pack). Вместо дистрибутива в папку аддона[Files\ForceCopy\SVCPACK] помещают файл пустышку (для примера) или файл контейнер (архив с необходимыми для установки ключами), либо ничего не кладут (смотрите инструкцию к аддону). Рассмотрим пример такого аддона- конструктора типа SVCPACK: Total commander

Структура аддона:

TCPP70RU (папка аддона)
+Files (папка файлов аддона)
-+Compresed
-+ForceCopy
--+SVCPACK (папка, копируемая при интеграции в I386\SVCPACK)
---TCPP70RU.exe - файл пустышка

-Addon.nfo
-RUN           > (конфигурационные файлы)


Содержимое конфигурационного файла Run:


TCPP70RU.exe /s      - запускает инсталлятор на Т13 с ключом /s.


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

Важно! В конфигурационном файле Run также возможно указывать ключи запускаемых приложений: Setup.exe /s.

Важно! Если исполняемых файлов или SFX архивов в аддоне несколько, порядок их запуска определяется в конфигурационном файле Run.

Важно! Если аддон меняет какие-либо системные файлы, не забудьте про файлы каталогов безопасности ( *.cat). Если такие файлы необходимы, они просто размещаются в папке SVCPACK аддона, скрипт их скопирует и добавит в Svcpack.inf автоматически. В файле Run их прописывать не надо! Еще раз напомню, CAT-файлы, используемые как в SYSOC, так и в SVCPACK типах аддонов, должны именоваться формате 8.3!

Некоторые сложные моменты можно посмотреть в Приложении 9. Тонкости создания аддонов SVCPACK.

Еще один пример аддона-конструктора можно посмотреть здесь

К содержанию


Комбинированные аддоны.

Из названия следует, что данный тип использует оба вышеописанных типа: SYSOC и SVCPACK. Обычно это необходимо в тех случаях, когда после установки программы требуется установить обновления, либо, когда некоторые значения, записанные программой, затираются на более поздних этапах установки. Рассмотрим это на примере аддона WMP 11

Структура папок здесь сложнее, чем у простого аддона:

WMP11Rus
+Files
--wmplayer.adm - файлы аддона, находящиеся в папке files,
пакуются в CAB-архивы и копируются в i386
замещая оригинальные файлы WMP9
......

-+ForceCopy
--+SVCPACK
----KB894871.CA_ - файлы каталогов, необходимые для
установки через SVCPACK на Т13
......

---WMP11.CAB - файлы аддона, находящиеся в папке ForceCopy,
копируются в i386 без сжатия
.......

-Dosnet
-Sysoc
-Txtsetup
-Addon.nfo


Как работает этот аддон? Используется специальным образом подготовленный дистрибутив. Описание этого этапа выходит за рамки статьи. Часть дистрибутива, замещающая файлы WMP9, размещается в папке аддона Files. При интеграции аддонов в дистрибутив скрипт сжимает файлы и замещает файлы WMP9 файлами WMP11. Этот аддон хорош для нашего примера еще и тем, что он пересекается с еще одним типом аддонов - заменяющих системные ресурсы. Однако, цель аддона - это не только замена системных файлов, но и установка нового медиаплеера. Для установки используется метод SYSOC. Установка происходит с помощью файла Wmp11rus.inf, на который сделана ссылка в Sysoc.inf через одноименный конфигурационный файл. Txtsetup, Dosnet используются для копирования установочных файлов на текстовом этапе.

Однако для того, чтобы медиаплеер остался в составе компонентов Windows, и WFP не прервал установку из-за неправильных версий файлов, необходимо предоставить установщику файлы каталогов. Сделать это возможно только на этапе T13, когда устанавливаются обновления через SVCPACK. Вот из-за этого аддон и называется комбинированным. В папку аддона [Files\ForceCopy\SVCPACK] помещаются файлы каталогов, и скрипт копирует их в одноименную папку дистрибутива. Конфигурационный файл Run отсутствует, поскольку CAT-файлы подхватываются скриптом автоматически.

В целом комбинированные аддоны являются более сложным инструментом, но одновременно и более гибким. Они требуют основательной подготовки и знания всех нюансов установки Windows. Однако именно этот метод позволяет совместить удобство установки через INF-файл в Sysoc.inf и "высокоуровневые" возможности SVCPACK. С практической точки зрения этот способ будет полезен для установки дополнительных компонентов аддона, т. е. для выполнения действий, невозможных на этапе SYSOC. В принципе, возможна и обратная ситуация, когда сам аддон устанавливается через SVCPACK, а некоторые действия необходимо произвести заранее через SYSOC (добавление записей в реестр, копирование файлов).

К содержанию


Аддоны, изменяющие дистрибутив.

Это тип аддонов, изменяющих дистрибутив в процессе интеграции обновлений и других аддонов (не всегда), т. е. не в процессе установки, в отличие от других типов.
Относятся к категории т.н. служебных аддонов. Позволяет получить функциональность в процессе установки, которую невозможно получить другими способами. Описать типичную структуру такого аддона или привести общую инструкцию невозможно. Причины банальны: изменение ресурсов возможно несколькими способами, требует солидных знаний и длительного тестирования на стабильность.

Пример "мирного" применения аддона, изменяющего системные ресурсы, - это аддон Vista Path, изменяющий стандартные иконки на более красивые. Другой пример - аддон ZZ_multiboot, который не изменяет дистрибутивную папку [I386], но создает структуру папок и записывает необходимые файлы и модифицирует их для получения мультизагрузочного диска. Причем можно создавать диски N-in-1 (например, Windows Home и Proffesional версий + множество вариантов загрузки из стандартного аддона Z_DRV_INST).

Еще пример - это аддон Z_DRV_INST, который не модифицирует файлы в дистрибутиве, но слегка изменяет и дополняет его новой функциональностью (подменой Setup.exe во время установки ОС и установкой необходимых драйверов).

При затрагивании важных системных файлов приходится иметь дело с защитой системных файлов Windows (Windows File Protection). Как ее обойти, читайте здесь: Приложение 7. Патч Sfcfiles.dll. Если по каким-либо причинам использовать патч Sfcfiles.dll нельзя или невозможно, остается только посоветовать эту статью (раздел Modify PE).

Тонкости изменения дистрибутива.

Если необходимо создать аддон, который при интеграции копирует нужную папку в корень создаваемого дистрибутива силами UpdatePack, воспользуйтесь следующим способом:

Добавьте в корневую папку вашего аддона конфигурационный файл Start (Finish), содержащий строку:

COPY /V /Y /Z "%~1\Имя_папки" "%DISTR%"


Где,

[%~1] - возвращает скрипту путь к вашему аддону (соответственно, копируемая папка также должна располагаться в корневой папке аддона)

[%DISTR%] - это внутренняя переменная скрипта UpdatePack, содержащая путь к вашему дистрибутиву.

К содержанию


Раздел III. Примеры и приложения.

Пример 1. Создание аддона из утилиты Netlook (для новичков).

Для примера я выбрал программу Netlook. Причина заключается в желании совместить приятное с полезным - такого аддона еще нет, программка не очень большая, записей в реестр не делает (то есть практически переносная), и лично мне пригодится. Сознательно не использовались средства автоматизации создания аддона (смотрите во втором примере), чтобы пример был более наглядным. Аддон можно скачать здесь и подробно изучить.

Этап один.

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

[Version]
Signature = "$WINDOWS NT$"
SetupClass = BASE

$WINDOWS NT$ стоит использовать вместо $CHICAGO$, мы же не делаем аддон для win95? Кроме указания на базовый класс установки больше в заголовке ничего не пишем, пока и не нужно. Затем создаем самую главную секцию нашего INF-файла - исполняемую:

[DefaultInstall]
CopyFiles = CopyMain, CopyConfig, CopyHelp, CopyHist, CopyLang, CopySkin, CopySound, CopyTools, CopyInf, RenToolsLang
ProfileItems = NL.AddShortcut

Эта секция не обязательно должна иметь такое скучное имя, но поверьте от того, что она есть вам хуже не будет.

Разбираем по строчкам: CopyFiles копирует файлы, попутно создавая нужные папки, ProfileItems добавляет ярлык программы. В моем случае (хороший стиль написания INF-файла) я воспользовался уже кем-то созданной папкой по адресу Пуск\Все программы\Утилиты. На первый взгляд все выглядит просто. Но, для того чтобы создать секции копирования, которые так красиво смотрятся в строке CopyFiles=, придется попотеть-  создать все эти секции с перечислением файлов вручную. Вам никто не мешает проявить смекалку и, используя специальные утилитки, получить на руки в текстовом виде список файлов из папки куда вы их "распотрошили". Секции я поименовал в соответствии с названием папок аддона Copymain - корневая и т. д. Далее прописываем будущую структуру папок в секции [DestinationDirs]. Не буду вас утомлять и просто приведу ее:

[DestinationDirs]
CopyMain=16422, "Netlook"
CopyConfig=16422, "Netlook\Config"
CopyHelp=16422,"Netlook\Help"
CopyLang=16422,"Netlook\Languages"
CopySkin=16422,"Netlook\Skin"
CopySound=16422,"Netlook\Sound"
CopyTools=16422,"Netlook\Tools\Configurator"
RenToolsLang=16422,"Netlook\Tools\Configurator\Languages"

Здесь я поясню, почему так называется последняя секция. Оказалось, что создатель программы Netlook ничего не слышал про хороший стиль программирования и присвоил двум файлам в своей программе одинаковое имя. Вот и пришлось один из них переименовать (файлы-то лежат вместе), с тем чтобы далее, в секции [RenToolsLang] при копировании в отдельную папку, вернуть все обратно.

[RenToolsLang]
"russian.lng",russian2.lng,,4

И последняя секция, указывающая, откуда копировать [SourceDisksNames]. Я запаковал все файлы из одной папки в CAB-архив с гордым именем netlook.cab и прописал его в INF-файле:

[SourceDisksNames]
1="NetLook Files","netlook.cab",0

Создал секцию добавления ярлыка:

[NL.AddShortcut]
Name= "Netlook 2.3"
CmdLine= 16422,"Netlook",NetLook.exe
WorkingDir= 16422,"Netlook"
SubDir= "Утилиты"
Infotip= "Netlook 2.3"

Второй этап.


Поместив INF и CAB-файлы рядом, я проверил, как устанавливается приложение. Хорошо устанавливается, клещами не вытянешь. На этом этапе мы и будем изобретать клещи - секции для удаления нашего приложения. Сразу скажу, мне это далось нелегко. В теории (учебнике по INF-файлам) все выглядело просто. Указав в исполняемой секции директиву AddReg= Секция добавления строк в реестр мы еще при установке приложения добавляем его в список установки/удаления программ. Сама секция незамысловата и подробно описана в Учебнике. Самая важная строка это

HKLM,"%Key%","DisplayName",,"Netlook 2.3"
HKLM,"%Key%","DisplayIcon",,"16422,"Netlook",0"
HKLM,"%Key%","UninstallString",,"rundll32.exe advpack,LaunchINFSectionEx %17%\netlook.inf,NL.Uninstall"

нижняя запись, которая указывает, какую секцию выполнить в INF-файле при удалении программы. Наблюдательный человек сразу заметит, что путь к Netlook.inf необычный, %17% = Windows\INF\. Для корректной отработки нам необходимо скопировать наш файл именно в эту директорию. Добавляем секции копирования

[CopyInf]
netlook.inf

и добавляем в

[DestinationDirs]
CopyInf=17 (Знаки процента в этой секции использовать нельзя)

Собственно секция, которая отвечает за удаление, должна выглядеть так: удаление файлов, удаление директорий, удаление записей в реестре, удаление ярлыков программы. У вас, наверняка, как и у меня, сразу мелькнула мысль: "А может просто удалить всю папку с файлами и подпапками и дело с концом?". Сразу огорчу -  не получилось. Оговорюсь, что не получилось достичь этого методами, описанными в учебнике. Есть гораздо более действенные способы. См. Приложение 2. Тонкости использования INF файлов. По итогам консультаций на форуме пришлось создавать отдельные секции удаления файлов (по сути дублирование секций CopyFiles). Зато результат был налицо - файлы удалялись. Дальше я создал секции удаления записей в реестре (чтобы сразу после удаления программы она исчезала из списка удаления программ), удаления ярлыка и удаления директорий. Все работало замечательно. Огорчало только, то что директории не удалялись. Учебник однозначно говорит, что вызвать DelDirs проще простого:

1) Вызвать из секции деинсталяции

Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\netlook.inf"",NL.DD,4"

2) Затем указать в секции саму команду

[NL.DD]
DelDirs=dirs


3) И уже в секции [dir] указать директорию, которую необходимо удалить. Не буду вас мучить, мне помогли добрые люди на форуме и средства автоматизации создания аддонов, которые мы решили здесь не рассматривать. Оказалось, что во-первых DelDirs необходимо запускать только через RunPostSetupCommands, т. к. команда Run, которую я упорно использовал, принадлежит Setupapi.dll, а DelDirs запускается через Advpack.dll; во-вторых, необходимо было удалить всю структуру папок снизу. Только после этого мой скрипт заработал так, как надо.

Секции деинсталяции аддона:

[NL.Uninstall]
DelFiles=DelCopyMain, DelCopyConfig, DelCopyHelp, DelCopyHist, DelCopyLang, DelCopySkin, DelCopySound, DelCopyTools, DelCopyInf, DelRenToolsLang
DelReg=Dreg
ProfileItems = ShortcutD
RunPostSetupCommands=NL.AdinfCall

[NL.AdinfCall]
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\netlook.inf"",NL.DD,4"

[NL.DD]
DelDirs=dirs

[dirs]
"%16422%\Netlook\Tools\Configurator\Languages"
"%16422%\Netlook\Tools\Configurator"
"%16422%\Netlook\Tools"
"%16422%\Netlook\Sound"
"%16422%\Netlook\Skin"
"%16422%\Netlook\Languages"
"%16422%\Netlook\Help"
"%16422%\Netlook\Config"
"%16422%\Netlook"

[Dreg]
HKLM,"%Key%"

[ShortcutD]
Name  = "Netlook 2.3",0x00000002
SubDir  = "Утилиты"

Этап третий.


Создание собственно аддона. Все, что мы делали ранее, это создание собственного инсталлятора для программы. Инсталлятор готов, можно использовать его на здоровье. Вспомним структуру аддонов и приступим. Копируем откуда-нибудь скелет аддона. Сразу же присваиваем главной папке аддона собственное имя, правим файл Addon.nfo, где пишем информацию, которую все равно никто не будет читать. Копируем в папку [Files\Forcecopy] CAB и INF-файлы. Оттуда их проинтегрирует в i386 скрипт UP от Petya V4sechkin.

Важно! Поскольку мы все делаем вручную, надо проверить папку i386 на предмет совпадений с нашими файлами, чтобы не перезаписать что-нибудь важное или просто принадлежащее системе. В любом случае при совпадениях имен система копирует свой родной файл из дистрибутива, а не "чужой". К счастью, я нашел только нечто с именем Netloop.inf.

Теперь нам необходимо создать в корневой папке аддона три файла. Начнем по порядку. Сначала наш аддон будет скопирован из дистрибутива посредством Txtsetup.sif при помощи Dosnet.inf и только позднее будет обнаружен и установлен через Sysoc.inf. В такой последовательности я и предлагаю создавать файлы, не забывая о том, что в UpdatePack эти файлы без расширений. Здесь же в приложениях есть статья про Txtsetup. Поверьте, совсем не лишняя в багаже знаний.

Txtsetup

[SourceDisksFiles]
Netlook.inf = 100,,,,,,,20,0,0
Netlook.cab = 100,,,,,,_x,,3,3

При установке INF-файл копируется в [Windows\INF\], а CAB-архив не копируется, так как это наш дистрибутив.

Dosnet

[Files]
d1,Netlook.inf
d1,Netlook.cab
*здесь d1 это папка i386.

Ну и собственно,

Sysoc


Netlook=ocgen.dll,OcEntry,Netlook.inf,,7

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

[SourceDisksNames]
1="Netlook Files","netlook.cab",,"I386"

Но еще не все! Я, как и все новички, споткнулся на файле Sysoc. Запись Netlook=Ocgen.dll,OcEntry,Netlook.inf,,7 означает, что будет исполнена секция [netlook] в файле Netlook.inf. А моя исполняемая секция называлась DefaultInstall. Естественно, ничего не установилось. Кроме того, необходимо добавить в наш установочный файл секцию, указывающую SYSOC на то, что это "его" компонент, и команду для автоустановки аддона:

[Optional Components]
Netlook    (указатель для SYSOC на исполняемую секцию)
.....
[Netlook]
...
Modes=0,1,2,3

Также, после проверки работоспособности установщика удаляются записи о копировании INF-файла, так как Txtsetup.sif скопирует его самостоятельно.

Теперь аддон готов к интеграции в дистрибутив. Интегрируем, проверяем аддон, проверяем журнал событий и выполняем qfecheck, чтобы проверить отсутствие ошибок.

К содержанию


Пример 2. Учебный аддон Punto Switcher

Автор Jameszero. Текст автора сохранен. Перед разбором примера скачайте исходники .

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

Разберём пример создания аддона Punto Switcher (в дальнейшем PS). Я выбрал его для рассмотрения потому, что несмотря небольшой объём аддона, в нём присутствуют как секции копирования/деинсталляции файлов, так и секции добавления/удаления записей в реестр, ярлыков, регистрация/дерегистрация библиотек. Этих знаний вполне достаточно для изготовления 90% аддонов.

Проведение предварительной подготовки аддона доверим скрипту для создания секций копирования/удаления  от XXXler. Создаём пустую папку, в которой хотим получить аддон. Назовём её, к примеру, Punto_sw. Запустив скрипт, выбираем в качестве исходной папку с файлами PS и заполняем поля:

- Корневая папка – путь, куда будет установлена программа, в данном случае Program Files (перед ней стоит её цифровое обозначение согласно dirids)
- Подкаталог – папка, которая будет создана в Program Files [C:\Program Files\Punto Switcher]
- Название – имя программы в «Установке компонентов Windows»
- Подсказка – дополнительная информация при выборе программы в «Установке компонентов Windows»
- Иконка – иконка, которая будет отображена возле программы в «Установке компонентов Windows»
- Имя секции – идентификатор программы в системе (рекомендуемое имя до 8-и символов)

Нажимаем «Cоздать» и выбираем созданную на первом этапе папку Punto_sw. Ждём пару секунд, пока не откроется созданный INF-файл для дальнейшей, уже ручной, работы с ним.

Дальнейшая работа производится в любом текстовом редакторе.

1. Секция [punto_sw] приводится к следующему виду

[punto_sw]
OptionDesc="Punto Switcher"
Tip="Переключатель раскладок"
Modes=0,1,2,3
CopyFiles=punto_sw.Copy
;AddReg=Секции добавления в реестр
;DelReg =
;UnRegisterDlls=Секции регистрации библиотек
;ProfileItems=Секции создания ярлыков
SizeApproximation=502755
Uninstall=punto_sw.Uninstall

RegisterDlls меняем на UnRegisterDlls и добавляем DelReg (об этом ниже).

2. Приступаем к секции внесения записей в реестр.

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

Все настройки программы хранятся по пути [HKCU,"Software\Punto Switcher\2.5"]. Автозапуск PS происходит из [HKCU,"Software\Microsoft\Windows\CurrentVersion\Run"]. Необходимо настроить установленный PS по своему усмотрению, экспортировать вышеназванные ветки реестра и конвертировать их в INF-формат (на этом останавливаться не будем, необходимая информация есть в шапке темы Авторам аддонов.

Возвращаемся к INF-файлу аддона. В его секции [punto_sw] находим строчку ;AddReg=Секции добавления в реестр. Снимаем комментарий «;» и присваиваем ей значение, например, punto_sw.AddReg (значение может быть любым, точка перед AddReg, как и само буквосочетание AddReg не обязательны, важно чтобы имя было уникальным в листинге INF-файла)

Получаем следующее:

[punto_sw]
OptionDesc="Punto Switcher"
Tip="Переключатель раскладок"
Modes=0,1,2,3
CopyFiles=punto_sw.Copy
AddReg= punto_sw.AddReg
;DelReg =
;UnRegisterDlls=Секции регистрации библиотек
;ProfileItems=Секции создания ярлыков
SizeApproximation=502755
Uninstall=punto_sw.Uninstall

В дальнейшем, я не буду подробно останавливаться на редактировании строк «шапки» INF-файла. Создаём в INF-файле соответствующую секцию [punto_sw.AddReg] (название её должно совпадать со значением директивы AddReg). Я привожу секцию из реального аддона (у вас она может отличаться в зависимости от ваших настроек программы).

[punto_sw.AddReg]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","Punto Switcher",,"%16422%\Punto Switcher\ps.exe"
HKCU,"Software\Punto Switcher\2.5","Options",1,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,33,4c,37,44,31,38,63,\
67,00,00,00,00,56,e8,df,45,00,01,01,00,01,00,00,01,01,01,00,00,00,01,00,00,\
01,01,00,00,00,00,01,00,00,01,00,01,01,00,00,00,00,01,00,00,00,01,00,00,00,\
01,00,00,00,00,00,00,2c,01,00,00,2c,01,00,00,64,00,00,00,64,00,00,00,f4,01,\
00,00,5e,01,00,00,01,01,01,00,00,01,01,00,01,00,00,00,02,00,00,00
HKCU,"Software\Punto Switcher\2.5","Sound_0",,"%16422%\Punto Switcher\typerus.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_1",,"%16422%\Punto Switcher\typeeng.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_2",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_3",,"%16422%\Punto Switcher\misprint.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_4",,"%16422%\Punto Switcher\ru.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_5",,"%16422%\Punto Switcher\en.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_6",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_7",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_8",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_9",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_10",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_11",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_12",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_13",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_14",,"%16422%\Punto Switcher\switch.wav"
HKCU,"Software\Punto Switcher\2.5","Sound_15",,"%16422%\Punto Switcher\replace.wav"
HKCU,"Software\Punto Switcher\2.5","SoundState_0",0x10001,03,00,dc,05
HKCU,"Software\Punto Switcher\2.5","SoundState_1",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_2",0x10001,03,00,c4,09
HKCU,"Software\Punto Switcher\2.5","SoundState_3",0x10001,03,00,bc,02
HKCU,"Software\Punto Switcher\2.5","SoundState_4",0x10001,03,00,e8,03
HKCU,"Software\Punto Switcher\2.5","SoundState_5",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_6",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_7",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_8",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_9",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_10",0x10001,03,00,d0,07
HKCU,"Software\Punto Switcher\2.5","SoundState_11",0x10001,03,00,dc,05
HKCU,"Software\Punto Switcher\2.5","SoundState_12",0x10001,03,00,a4,06
HKCU,"Software\Punto Switcher\2.5","SoundState_13",0x10001,03,00,6c,07
HKCU,"Software\Punto Switcher\2.5","SoundState_14",0x10001,03,00,f4,01
HKCU,"Software\Punto Switcher\2.5","SoundState_15",0x10001,03,00,90,01
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msimtf",0x20000,"regsvr32.exe /s /u %11%\msimtf.dll"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msctf",0x20000,"regsvr32.exe /s /u %11%\Msctf.dll"

О двух последних строчках я расскажу ниже при рассмотрении дерегистрации библиотек. Поскольку PS предназначен для замены стандартного переключателя раскладок клавиатуры, то стандартный (Ctfmon.exe) в автозагрузке нам не нужен. Его запуск в системе происходит через реестр, и эти сточки необходимо удалить. Создаём в «шапке» INF-файла директиву DelReg = CTF.DelReg и пишем в INF-файле:

[CTF.DelReg]
HKLM,"Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE"
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE"
HKU,".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE"


3. Директива создания ярлыков - ProfileItems

Редактируем её в «шапке» INF-файла таким образом: ProfileItems = punto_sw.AddShortcut. Затем создаём в INF-файле секцию [punto_sw.AddShortcut].

[punto_sw.AddShortcut]
Name  = "Punto Switcher 2.9"
CmdLine  = 16422,"Punto Switcher" ps.exe
SubDir  = "Punto Switcher"
WorkingDir = 16422,"Punto Switcher"

Name – имя ярлыка
CmdLine – путь к исполняемому файлу (строка расшифровывается, как C:\Program Files\ Punto Switcher\ps.exe)
SubDir – подпапка в меню «Программы» (Пуск\Программы\Punto Switcher\) эта строчка может отсутствовать, тогда ярлык будет создан в Пуск\Программы\
WorkingDir – рабочая директория (C:\Program Files\ Punto Switcher\)

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

4. Дерегистрация библиотек

Создаём в «шапке» строчку UnRegisterDlls = CTF.UnRegister а в INF-файле прописываем:

[CTF.UnRegister]
11,,msimtf.dll
11,,Msctf.dll

Цифра 11, согласно dirids, означает, что файл находится в System32. Если бы файл находился, скажем, в Windows, то строчки выглядели бы таким образом - 10,,msimtf.dll. Возможна ситуация, когда файл находится, например, в Program Files\Prog1\file.dll, в таком случае отмена регистрации выглядела бы так: 16422,Prog1,file.dll

И вернёмся к двум последним строчкам нашей секции AddReg:

HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msimtf",0x20000,"regsvr32.exe /s /u %11%\msimtf.dll"
HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce","msctf",0x20000,"regsvr32.exe /s /u %11%\Msctf.dll"

Они, по сути, также выполняют дерегистрацию библиотек, но уже после перезагрузки, в данном случае в момент времени Т13. Двойная отмена регистрации необходима только в конкретном аддоне, потому что система регистрирует Msimtf.dll и Msctf.dll заново, а в большинстве случаев достаточно однократной дерегистрации.

5. Теперь приступим к секциям деинсталляции аддона.

Для PS недостаточно удалить только файлы – необходимо так же восстановить работу стандартного переключателя раскладок. В процессе удаления будет участвовать секция [punto_sw.Uninstall] и дальше по тексту, теперь её будем именовать «шапкой». Итак, редактируем «шапку» следующим образом:

[punto_sw.Uninstall]
DelFiles  =  punto_sw.Del
ProfileItems =  punto_sw.DelShortcut
DelReg  =  punto_sw.DelReg
AddReg  =  CTFMON.Restore
RegisterDlls = CTF.dll.Restore

С директивой DelFiles понятно – она вызовет соответствующую секцию со списком удаляемых файлов. ProfileItems – удаляет ярлык, но секции удаления ярлыков несколько отличаются от секций создания. Здесь всё просто - достаточно указать имя ярлыка и подпапку, в которой он находится. Приведу пример удаления того же ярлыка, который мы рассматривали в создании.


[punto_sw.DelShortcut]
Name  = "Punto Switcher 2.9",0x00000002
SubDir  = "Punto Switcher"

Далее в «шапке» INF-файла идут уже знакомые директивы AddReg и DelReg, а так же директива RegisterDlls, которая восстановит регистрацию файлов Msimtf.dll и Msctf.dll. Секции будут выглядеть так:

[punto_sw.DelReg]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","Punto Switcher"
HKCU,"Software\Punto Switcher"

[CTFMON.Restore]
HKCU,"Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE",,"%11%\ctfmon.exe"
HKU,".DEFAULT\Software\Microsoft\Windows\CurrentVersion\Run","CTFMON.EXE",,"%11%\CTFMON.EXE"

[CTF.dll.Restore]
11,,msimtf.dll,1
11,,Msctf.dll,1

Удаление записей реестра, так же как и ярлыков, отличается от добавления в реестр. Необходимо указать только корневой раздел, в данном случае, HKCU,"Software\Punto Switcher", и она будет удалена со всем подразделами. Секцией [CTFMON.Restore] мы восстанавливаем в автозагрузке стандартный переключатель раскладок, а в секции [CTF.dll.Restore] регистрируем связанные с ним библиотеки.

Следующие секции участвуют в деинсталляции аддона.

[punto_sw.AdvInfCall]
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\punto_sw.inf"",punto_sw.Uninstal.DelDirs,4"
TickCount=500

[punto_sw.Uninstal.DelDirs]
DelDirs=punto_sw.DelDirs

[punto_sw.DelDirs]
"%16422%/Punto Switcher"

На этом подробно останавливаться не будем, их вполне корректно создаёт Скрипт для создания секций копирования/удаления файлов, с которого мы начали изготовление аддона.

Аддон готов. Чтобы привести его к привычному виду, нужно удалить файлы PreCompile.exe, PreCompile.lst и папку src. Переименовать файл upd в Upd.cmd и запустить.

Общие замечания:

- Я не делал привязку аддона к 3rdParty, чтобы упростить описание.

- При установке/удалении аддона необходима перезагрузка компьютера, но автоматизацию этого процесса я рассматривать не стал. Посмотрите, как это реализовано в аддоне DrWeb (при установке/удалении SpiderGuard из компонентов Windows запрашивается перезагрузка).

- В секции копирования файлов рассмотренного аддона вы встретите такие строчки:

correct.dll,,,4
"ChooseLayouts.exe",ChooseLa.exe,,4

Первая копирует файл Correct.dll в директорию назначения в таком же виде, в каком он находится в CAB-архиве аддона, а вторая читается так: скопировать файл ChooseLa.exe в директорию назначения и переименовать его в ChooseLayouts.exe. Это сделано для соответствия имён файлов в CAB-архиве формату 8.3.

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

Пример был взят отсюда.

К содержанию


Пример 3. Разбор конструктора K-lite codec pack


В данном примере рассмотрим устройство аддона-конструктора. В основе аддона лежит возможность создания "тихой" установки K-lite с помощью ключа -unnatended, распознаваемого инсталлятором. После запуска установки с этим ключом происходит эмуляция установки с обычном набором диалоговых окон: выбор папки установки, выбор устанавливаемых кодеков. В результате мы получаем набор файлов для автоматической установки программы: Klmcp.ini, Klmcp.bat и сам дистрибутив, переименованный в Klmcp.exe для краткости.

Автоустановка запускается через командный файл который состоит из одной строки, запускающей установку в "тихом" режиме и подключающей INI-файл с настройками:

@klmcp.exe /verysilent /norestart /dir="%ProgramFiles%\K-Lite Codec Pack" /LoadInf=".\klmcp.ini"

В принципе, приведенной информации достаточно для того, чтобы создать аддон типа SVCPACK, запаковав файлы Winrar в виде SFX архива с "тихим" запуском батника при распаковке.
Для создания же конструктора лучше сократить количество действий пользователя при его сборке. Автор аддона рассудил так же и решил создать комбинированный конструктор (SYSOC+SVCPACK). Посмотрим на структуру папок готового аддона:

KLiteMega
+Files
-+ForceCopy
--+SVCPACK
---klinst.exe  - установка K-lite
--klmcp.bat
--klmcp.exe      > файлы автоустановки K-lite
--klmcp.ini
--KLITE.IN_     -  INF-файл для копирования файлов на текстовом этапе
-conflict
-dosnet
-Run
-sysoc
-txtsetup               > конфигурационные файлы
-addon.nfo

На текстовом этапе файлы аддона копируются во временную папку [%Windir%\Temp\KL]:

Klite.inf

.....
[DestinationDirs]
klite.Copy=10,"Temp\KL"

[klite.Copy]
klmcp.bat,,,4
klmcp.exe,,,4
klmcp.ini,,,4

Фактически это все, что делается на текстовом этапе через SYSOC.

Установка кодеков происходит на Т13, для чего создан пустой SFX-архив 7-zip с командами установки в комментарии архива, который запускается через Run.

Klite.exe

RunProgram="hidcon:\"klmcp.bat\""
InstallPath="%SystemRoot%\\Temp\\KL"
GUIMode="2"
Delete="%SystemRoot%\\Temp\\KL"

Как видно, ничего сложного в этом нет. Запускается командный файл в скрытом режиме, в качестве папки источника для установки указана [%SystemRoot%\\Temp\\KL], куда на текстовом режиме установки Windows были скопированы необходимые файлы. Затем временная папка удаляется. Это весь аддон. Файлы установки, лежащие в папке аддона [Files\ForceCopy], можно заменять новыми версиями K-lite по мере необходимости.

Можно спорить со способом реализации аддона, выбранным автором, но аддон работает, и это - главное.

К содержанию


Приложение 1. Префиксы.

Это пример, а не руководство к действию!
Переименование папок чужих аддонов недопустимо (особенно, если вы не понимаете последствий), так как это нарушит зависимость данного аддона от других. Также, это изменит порядок интеграции, который проверялся автором в ходе тестирования, и затруднит анализ ошибок.
Переименование папок готовых аддонов (в т.ч. для добавления префиксов), не даст обычному пользователю никаких преимуществ, а скорее создаст проблемы. Префиксы - это инструмент авторов аддонов для случаев, когда возникают проблемы с интеграцией и совместимостью аддонов.
При решении таких проблем имеет смысл использовать описанную ниже схему.
Аддон, который надо обработать до других аддонов (в том числе встроенных аддонов Update Pack), именовать префиксом [0-имя_аддона]. Аддон который надо обработат, после всех других аддонов, именовать префиксом [9-имя_аддона](либо [zz-имя_аддона]).

Пример использования префиксов:

Цифровой префиксПример записи и предлагаемый порядок аддонов
0Служебные, предназначены для подготовки других аддонов к процедуре интеграции
1Аддоны базового набора
2Разного рода обновления и дополнения встроенных компонентов ОС
3Неофициальные обновления или технические обновления ОС. Наборы библиотек, компоненты не входящие в ОС, и.т.д
4Хаки
5Программы сторонних производителей (SYSOC)
6Программы сторонних производителей (SVCPACK).
7Аддоны предназначенные для внесения изменений в реестр ОС
8Аддоны предназначенные для удаления компонентов ОС и драйверов
9Служебные, предназначены для пост-обработки информации или создания образа

К содержанию


Приложение 2. Тонкости использования INF-файлов.

1. DIR IDs

В руководстве по написанию INF-файлов дан наиболее полный перечень стандартных DIRID, однако по непонятной причине не
указаны специальные переменные оболочки. Привожу наиболее полный список от Gosh:

Value  Shell Special Folder

16384   %userprofile%\Desktop (Рабочий стол)
16386   %userprofile%\Start Menu\Programs (группа Программы меню Пуск)
16389   %userprofile%\My Documents (папка Мои документы)
16390   %userprofile%\Favorites (папка Избранное)
16391   %userprofile%\Start Menu\Programs\Startup (группа Автозагрузка)
16392   %userprofile%\Recent (Недавние документы)
16393   %userprofile%\SendTo (папка для меню Отправить)
16395   %userprofile%\Start Menu (меню Пуск или папка Главное меню)
16397   %userprofile%\My Documents\My Music (папка Моя музыка)
16398   %userprofile%\My Documents\My Videos (папка Мои видеозаписи)
16400   %userprofile%\Desktop (Рабочий стол)
16403   %userprofile%\NetHood (папка Сетевое окружение)
16404   C:\WINDOWS\Fonts (папка Шрифты)
16405   %userprofile%\Templates (папка Шаблоны)
 16406   %allusersprofile%\Start Menu
16407   %allusersprofile%\Start Menu\Programs (группа Программы меню Пуск)
16408   %allusersprofile%\Start Menu\Programs\Startup (меню Пуск или папка Главное меню)
16409   %allusersprofile%\Desktop (Рабочий стол)

16410    %userprofile%\Application Data
16411   %userprofile%\PrintHood (папка Принтеры)
16412   %userprofile%\Local Settings\Application Data
16415   %allusersprofile%\Favorites (папка Избранное)
16416   %userprofile%\Local Settings\Temporary Internet Files
16417   %userprofile%\Cookies
16418   %userprofile%\Local Settings\History
16419   %allusersprofile%\Application Data
16420   System Root (C:\WINDOWS)
16421   C:\WINDOWS\System32
16422   Program Files
16423   %userprofile%\My Documents\My Pictures (Мои рисунки)
16424   %userprofile%
16425   C:\WINDOWS\System32
16427   C:\Program Files\Common Files
16429   %allusersprofile%\Templates (папка Шаблоны)
16430   %allusersprofile%\Documents (папка Мои документы)
16431   %allusersprofile%\Start Menu\Programs\Administrative Tools

16432   %userprofile%\Start Menu\Programs\Administrative Tools
16437   %allusersprofile%\Documents\My Music (папка Моя музыка)
16438   %allusersprofile%\Documents\My Pictures (Мои рисунки)
16439   %allusersprofile%\Documents\My Videos (папка Мои видеозаписи)

16440   C:\WINDOWS\resources
16441   C:\WINDOWS\resources\0409
16443   %userprofile%\Local Settings\Application Data\Microsoft\CD Burning
*Для удобства зеленым цветом выделены DIRID ссылающиеся на %allusersprofile%


Важно! Помните, что во время установки Windows переменная %userprofile% =%defaultuser% (других пользователей еще не существует)

К содержанию

2. Методы деинсталляции.

Один из проблемных моментов - это корректное удаление установленного приложения.

Первое, что нужно сделать - это еще при установке приложения добавить строку в реестр для удаления приложения с указанием секции, отвечающей за деинсталляцию:

HKLM,"%Key%","DisplayName",,"SOMEAPP"
HKLM,"%Key%","DisplayIcon",,"16422,"SOMEAPP",0
HKLM,"%Key%","UninstallString",,"rundll32.exe advpack,LaunchINFSectionEx %17%\SOMEONE.inf,Uninstall"
HKLM,"%Key1%","SOMEAPP",0x00020000,"C:\Program Files\SOMEAPP\SOMEAPP.exe"
HKLM,"%Key2%","Start Minimized",0x10001,01,00,00,00

Способ 1. "По учебнику"

Используем инструкции DelDirs и DelFile.

[DefaultInstall]
CopyFiles=files

[files]
filename.ext

[DestinationDirs]
files= 11, APPDIR

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

[Uninstall]
DelFiles=files
RunPostSetupCommand=SOMEAPP.AdinfCall
; затем запускаем через RunPostSetupCommand библиотеку Advpack.dll для обработки команды Deldirs

[SOMEAPP.AdinfCall]
Commandline="""%11%\rundll32.exe"" advpack,LaunchINFSection ""%17%\SOMEONE.inf"",Del.Folders,4"

[Del.Folders]
Deldirs=dirs
;передаем список директорий для удаления

[dirs]
%11%, APPDIR

Важно! Нужно учитывать, что в случае, когда не все файлы удалены из папок, DelDirs не сработает. Если вы удаляете папку, содержащую подпапки (даже пустые), DelDirs не сработает.
Так что сначала надо удалить файлы, затем подпапки, начиная с наиболее глубоко вложенной, и только затем корневую папку приложения.

Способ 2. "Радикальный"

Используется внутренняя команда библиотеки rundll32 DelNodeRunDLL32 для удаления непустых директорий.

Будем продолжать работать с предыдущим примером:

[Uninstall]
DelFiles=files
RunPostSetupCommand=Del.Folders

[Del.Folders]
rundll32.exe advpack,DelNodeRunDLL32 "%11%, APPDIR"

Важно! Нужно учитывать, что в случае, когда файлы в удаляемой папке заняты системой или выполняются, DelNodeRunDLL32 не сработает. В следующем способе вы увидите метод решения этой проблемы с помощью консольной команды TASK KILL.

Способ 3. "Готовый шаблон"

Данный способ предложил Jameszero.

[Version]
Signature="$Windows NT$"
AdvancedINF=2.5

[Optional Components]
Programm_1

[Programm_1]
OptionDesc =%PROG_NAME%
Tip =%PROG_INFO%
Modes =0,1,2,3
AddReg =PROG.AddReg
ProfileItems =PROG.AddShortcut

[DefaultInstall]
AddReg =PROG.AddReg
ProfileItems =PROG.AddShortcut

[Uninstall]
BeginPrompt =BeginUnInsPrompt
RunPreSetupCommands =Close.Prog:1
RunPostSetupCommands =Dir.Delete
EndPrompt =EndUnInsPrompt
DelReg =PROG.DelReg
ProfileItems =PROG.DelShortcut
DelFiles =Del.PNF

[BeginUnInsPrompt]
Title =Деинсталляция %PROG_NAME%
Prompt =Вы действительно хотите удалить %PROG_NAME% и все компоненты программы?
ButtonType =YESNO

[Close.Prog]
TASKKILL /F /IM %PROG_1%
TSKILL %PROG_2%

[Dir.Delete]
rundll32.exe advpack.dll,DelNodeRunDLL32 %16422%\%PROG_DIR%

[EndUnInsPrompt]
Prompt =Программа %PROG_NAME% удалена.

[DestinationDirs]
Del.PNF =17

[Del.PNF]
%PROG_PNF%

[PROG.AddReg]
HKLM,"%SWUninstall%\%PROG_NAME%_addon","DisplayIcon",0,"%16422%\%PROG_DIR%\%PROG_1%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","DisplayName",,"%PROG_NAME%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","DisplayVersion",,"v%PROG_VERS%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","Publisher",,"%PROG_MADE%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","URLInfoAbout",,"%PROG_URL%"
HKLM,"%SWUninstall%\%PROG_NAME%_addon","UninstallString",,"rundll32.exe advpack.dll,LaunchINFSection %PROG_INF%,Uninstall"

[PROG.DelReg]
HKLM,"%SWUninstall%\%PROG_NAME%_addon"

[PROG.AddShortcut]
Name =%SRTC_NAME%
CmdLine =16422,%PROG_DIR%,%PROG_1%
WorkingDir =16422,%PROG_DIR%
SubDir =%PROG_SDIR%
InfoTip =%PROG_INFO%

[PROG.DelShortcut]
Name =%SRTC_NAME%,0x00000002
SubDir =%PROG_SDIR%

[Strings]
PROG_DIR ="Miranda IM"
PROG_NAME ="Miranda IM"
SRTC_NAME ="Miranda IM"
PROG_VERS ="0.7"
PROG_MADE ="oszone.net"
PROG_URL ="http://forum.oszone.net/forum-62.html"
PROG_INF ="miranda.inf"
PROG_PNF ="miranda.PNF"
PROG_1 =miranda32.exe
PROG_2 =miranda32
PROG_SDIR =""
PROG_INFO ="Программа для общения по ICQ протоколу"
SWUninstall ="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"

При редактировании только одной секции [String] и переименовании секции инсталляции, можно использовать этот INF-файл для установки/удаления других аддонов. Аддоны должны быть комбинированные, т. е. сначала из SYSOC срабатывает данный INF-файл, а затем из SVCPACK запускается SFX-архив, созданный любым доступным способом, при этом SFX-архив должен просто распаковать файлы в нужную директорию.

Создание ярлыков, внесение информации в реестр (в том числе о деинсталляции) реализовано в INF-файле.

Деинсталляция перенесена из привычного для SYSOC аддонов места "Установка компонентов Windows" в "Установку и удаление программ". При деинсталляции будет выдан запрос "Вы действительно хотите удалить такую-то программу?". Если программа в данный момент запущена, она будет выгружена из памяти, далее произойдёт удаление директории с программой, ярлыков и записей реестра. По окончании деинсталляции будет сообщено "Программа такая-то удалена".

Удаляется PNF-файл созданный при установке программы. PNF-файл это компилированный (pre-compilled) INF-файл, необходим один раз при установке.

К содержанию

3. Создание ярлыков

При создании\удалении ярлыков через директиву ProfileItems используются флаги добавления\удаления ярлыков, а также специальные флаги. В обоих случаях работает сложение флагов. Также при создании ярлыков используется прием с многоточием [..] для изменения рабочей папки.

  • Флаги создания\удаления ярлыков (директива ProfileItems).

Есть в руководстве по INF-файлам, но по этому списку более понятна логика складывания флагов: 

0x00000001  Создать пункт меню для текущего пользователя
0x00000002  Удалить пункт меню
0x00000003  Удалить пункт меню для текущего пользователя
0x00000004  Создать пункт меню для профиля All Users в папке Пуск\Все программы
0x00000005  Создать пункт меню для профиля Current User в папке Пуск\Все программы
0x00000006  Удалить пункт меню для профиля All Users в папке Пуск\Все программы
0x00000007  Удалить пункт меню для профиля Current User в папке Пуск\Все программы

  • Специальные флаги создания\удаления ярлыков (Special ProfileItems Flags).

0x00000008,2 = "%UserProfile%\Start Menu\Programs"
0x00000008,5 = "%UserProfile%\My Documents"
0x00000008,6 = "%UserProfile%\Favorites" <- Perfect for adding custom IE Bookmarks
0x00000008,7 = "%UserProfile%\Start Menu\Programs\Startup"
0x00000008,8 = "%UserProfile%\Recent"
0x00000008,9 = "%UserProfile%\SendTo"
0x00000008,11 = "%UserProfile%\Start Menu"
0x00000008,13 = "%UserProfile%\My Documents\My Music"
0x00000008,14 = "%UserProfile%\My Documents\My Videos"
0x00000008,16 = "%UserProfile%\Desktop"
0x00000008,19 = "%UserProfile%\NetHood"
0x00000008,20 = "%WinDir%\Fonts"
0x00000008,21 = "%UserProfile%\Templates"
0x00000008,22 = "%AllUsersProfile%\Start Menu"
0x00000008,23 = "%AllUsersProfile%\Start Menu\Programs"
0x00000008,24 = "%AllUsersProfile%\Start Menu\Programs\Startup"
0x00000008,25 = "%AllUsersProfile%\Desktop"

0x00000008,26 = "%UserProfile%\Application Data" <- Perfect for QuickLauch
0x00000008,27 = "%UserProfile%\PrintHood"
0x00000008,28 = "%UserProfile%\Local Settings\Application Data"
0x00000008,31 = "%AllUsersProfile%\Favorites"
0x00000008,32 = "%UserProfile%\Local Settings\Temporary Internet Files"
0x00000008,33 = "%UserProfile%\Local Settings\Cookies"
0x00000008,34 = "%UserProfile%\Local Settings\History"
0x00000008,35 = "%AllUsersProfile%\Application Data"
0x00000008,36 = "%WinDir%"
0x00000008,37 = "%WinDir%\system32"
0x00000008,38 = "%ProgramFiles%"
0x00000008,39 = "%UserProfile%\My Documents\My Pictures"
0x00000008,40 = "%UserProfile%"
0x00000008,41 = "%WinDir%\system32"
0x00000008,43 = "%CommonProgramFiles%"
0x00000008,45 = "%AllUsersProfile%\Templates"
0x00000008,46 = "%AllUsersProfile%\Documents"
0x00000008,47 = "%AllUsersProfile%\Start Menu\Programs\Administrative Tools"

0x00000008,48 = "%UserProfile%\Start Menu\Programs\Administrative Tools"
0x00000008,53 = "%AllUsersProfile%\Documents\My Music"
0x00000008,54 = "%AllUsersProfile%\Documents\My Pictures"
0x00000008,55 = "%AllUsersProfile%\Documents\My Videos"

0x00000008,56 = "%WinDir%\Resources"
0x00000008,57 = "%WinDir%\Resources\0409"
0x00000008,59 = "%UserProfile%\Local Settings\Application Data\Microsoft\CD Burning"

Удаление ярлыков:

Для специальных флагов тоже действует правило сложения – специальный флаг + флаг удаления =0x00000008+0x00000002=0x0000000A
Чтобы удалить ярлык, созданный с помощью специальных флагов, используйте:

0x0000000A, номер специального флага равный номеру специального флага при создании ярлыка (таблица выше).

Важно! При использовании директивы ProfiledItems в вашей секции создания ярлыка в параметре CmdLine= необходимо указать путь к файлу и имя файла в формате 8.3.

В качестве примера рассмотрим следующий раздел:

  • Cоздание/удаление ярлыка в контекстном меню "Отправить" (SendTo):

[Version]
Signature="$Windows NT$"

[DefaultInstall]
ProfileItems  =PROG.AddShortcut

[Uninstall]
ProfileItems  =PROG.DelShortcut

[PROG.AddShortcut]
Name       = "Send_To_Shortcut",0x00000008,9
CmdLine    = 11,,prog.exe

[PROG.DelShortcut]
Name       = "Send_To_Shortcut",0x0000000A,9

  • Cоздание и удаление ярлыка в Quick Launch:

[Version]
Signature="$Windows NT$"

[DefaultInstall]
ProfileItems =PROG.AddShortcut

[Uninstall]
ProfileItems =PROG.DelShortcut

[PROG.AddShortcut]
Name  =%SRTC_NAME%,0x00000001
CmdLine  =16422,%PROG_DIR%,%PROG_1%
WorkingDir =16422,%PROG_DIR%
SubDir  =%PROG_SDIR%
InfoTip  =%PROG_INFO%

[PROG.DelShortcut]
Name  =%SRTC_NAME%,0x00000003
SubDir  =%PROG_SDIR%

[Strings]
PROG_DIR ="test_dir"
SRTC_NAME ="Test_Shortcut"
PROG_1  =test.exe
PROG_SDIR ="..\..\Application Data\Microsoft\Internet Explorer\Quick Launch"
PROG_INFO ="Test_Info"

  • Cоздание и удаление ярлыка на Рабочем Столе


[DefaultInstall]
ProfileItems =PROG.AddDeskShortcut

[Uninstall]
ProfileItems =PROG.AddDeskShortcut

[PROG.AddDeskShortcut]
Name =%SRTC_NAME%,0x00000001
CmdLine =16422,%PROG_DIR%,%PROG_1%
WorkingDir =16422,%PROG_DIR%
SubDir =%PROG_SDIR3%
InfoTip =%PROG_INFO%

[PROG.DelDeskShortcut]
Name =%SRTC_NAME%,0x00000003
SubDir =%PROG_SDIR3%

[Strings]
SRTC_NAME = "Имя ярлыка"
PROG_DIR = "Путь к папке программы в Program Files"
PROG_1 = ИмяФайла.exe
PROG_INFO="Всплывающее сообщение"
PROG_SDIR3 ="..\..\Рабочий стол"

Из выше приведенных примеров видно, что ярлык практически в любой локальной папке пользователя в [Documents and Settings] можно создать при помощи конструкции

SubDir = "..\..\ "


Как это работает? Рабочей директорией для директивы ProfileItems по умолчанию является папка Программы в меню Пуск или другими словами [%профиль%\Главное меню\Программы]. Конструкцией [..\..\] мы поднимаемся на два уровня вверх, т. е. в [%профиль%] и затем указываем путь, например в [%профиль%\Рабочий стол] или в [%профиль%\SendTo]. Также можно подняться еще выше, например,

SubDir ="..\..\..\Default User\Рабочий стол"

  • Cоздание и удаление нескольких ярлыков

[DefaultInstall]
ProfileItems =PROG.AddShortcut1, PROG.AddShortcut2, PROG.AddShortcut3

[Uninstall]
ProfileItems =PROG.DelShortcut1, PROG.DelShortcut2, PROG.DelShortcut3

[PROG.AddShortcut1]
Name =%SRTC_NAME1%,0x00000001
CmdLine =16422,%PROG_DIR%,%PROG_1%
WorkingDir =16422,%PROG_DIR%
SubDir =%PROG_SDIR1%
InfoTip =%PROG_INFO%

[PROG.AddShortcut2]
...аналогично

[PROG.AddShortcut3]
...аналогично

[PROG.DelShortcut1]
Name =%SRTC_NAME1%,0x00000003
SubDir =%PROG_SDIR1%

[PROG.DelShortcut2]
...аналогично

[PROG.DelShortcut3]
...аналогично


Важно! Пока нет профиля текущего пользователя (а его нет до первого входа в систему), ярлыки, имеющие флаг 0x00000001, будут создаваться в профиле Default User, откуда он будет копироваться во все вновь создаваемые профили. На установленной системе ярлык с флагом 0x00000001 будет создан только у текущего пользователя. Соответственно 0x00000003 - Удалить пункт меню (ярлык) для текущего пользователя.

К содержанию

4. Разное

  • Cоздание папки.

Если надо просто создать пустую папку, без копирования файлов:

"rundll32.exe IEAKENG.dll, BToolbar_SaveA d:\Folder"

Пример:

[version]
Signature = "$CHICAGO$"
AdvancedINF=2.5

[DefaultInstall]
RunPreSetupCommands=RunPre

[RunPre]
;создаем папку backup на диске d:.
;После создания папки экспортируем в нее REG-файл.
"rundll32.exe IEAKENG.dll, BToolbar_SaveA d:\backup"
"reg export HKLMSOFTWAREMicrosoftWindowsCurrentVersionExplorerAppKey d:\backupAppKeyBackup.reg"

Отмечу интересный момент. Если писать "rundll32.exe IEAKENG.dll, BToolbar_SaveA d:Folder" без слэша, и папка Folder существует, то она удаляется! (по крайней мере в Cmd).

  • Полезные утилиты при работе с INF- и CAB-файлами. Ссылка
  • Несколько команд интерпретатора advpack, не включенных в Руководство по INF- файлам. Ссылка
  • Копирование файлов из секции CopyFiles

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

CopyFiles=@myfile.txt, @anotherfile.txt

  • Определение каталога копирования по умолчанию

В секции [DestinationDirs] определяются папки назначения для всех операций копирования, удаления и переименования, где бы они не находились в INF-файле. Организованно это в виде списка секций и путей копирования для них. Для секций, не заданных явно в этой папке, или для файлов, скопированных прямо из секции копирования (с помощью символа @) можно задать каталог копирования по умолчанию.

Синтаксис:

DefaultDestDir=dirid,подпапка

Пример:


[DefaultInstall]
CopyFiles=SomeSection,@somefile.txt

[DestinationDirs]
DefaultDestDir=16409,Temp
SomeSection=10


Секция [SomeSection] будет скопирована (переименована, удалена) по пути, определенному в [DestinationDirs] (в данном случае [%WINDIR%]). Файл Somefile.txt и другие секции или файлы, не указанные в [DestinationDirs], будут копироваться по умолчанию в папку [Temp] на рабочем столе. Избегайте использования директивы DefaultDestDir с несколькими вложенными INF-файлами (использующими директивы Include и Needs). Если во вложенных файлах будет определена директива DefaultDestDir, отличная от основного файла, она будет игнорироваться, и все файлы будут скопированы в папку, определенную в основном INF-файле.Если в секции [DestinationDirs] нет ни одной записи, все файлы по умолчанию копируются в [%WINDIR%\system32].

  • Отображение и запуск файлов.

В процессе установки можно прервать выполнение 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"

  • Копирование одного и того же файла в разные папки.


[DestinationDirs]
File.Copy=16422,"Prog"
FileYet.Copy=16422,"Prog\Subdir"

[File.Copy]
filename.dll,,,4

[FileYet.Copy]
filename.dll,,,4

5.Выполнение INF-файла через Rundll32.exe

INF-файл можно выполнить путем вызова из командной строки через системную библиотеку Rundll32.exe (также в Win98 Rundll.exe). Кроме того, Rundll32 можно вызывать прямо из INF-файла, используя директивы RunPreSetupCommands и RunPostSetupCommands (например, вызвать секцию из другого или текущего INF-файла).

  • Вызов через интерпретатор Setupx.dll (Setupapi.dll)

Синтаксис:

RunDll32.exe setupx.dll, InstallHinfSection <section> <reboot-mode> <inf-name>

RunDll32.exe setupapi.dll, InstallHinfSection <section> <reboot-mode> <inf-name>

1. <section> - Исполняемая секция
2. <reboot-mode> - Флаг перезагрузки
3. <inf-name> - имя и путь к inf- файлу

После такого вызова в INF-файле Setupx.dll повторно ее вызывать нельзя, так как это может привести к перезагрузке или другим неприятным последствиям. Для многократных вызовов из файла интерпретатора лучше использовать RunOnce (см.ниже).

Имя исполняемой секции: если секция с таким именем не будет найдена, то ничего не будет "выполняться", и сообщений об ошибках тоже не будет.

Флаги перезагрузки:

Интерпретатор понимает следующие значения этого параметра:
NeverReboot                  0 или 128 - не перезагружать компьютер.
AlwaysSilentReboot      1 или 129 - обязательно (и без вопросов) перезагружать компьютер.
AlwaysPromptReboot   2 или 130 - спросить у пользователя, перезагружать компьютер или нет.
SilentReboot                   3 или 131 - определить, надо или нет перезагружать компьютер. Если оказалось, что перезагружать надо, то выполнить перезагрузку (без вопросов).
PromptReboot                4 или 132 - определить, надо или нет перезагружать компьютер. Если оказалось, что перезагружать надо, то спросить у пользователя, перезагружать компьютер или нет.

Параметр 132 - рекомендованный режим перезагрузки (после "выполнения").


Каким образом интерпретатор определяет необходимость перезагрузки? Если при "выполнении" обновлялись системные файлы, и хотя бы один из них не смог быть обновлён из-за того, что в это время использовался системой, то перезагрузка необходима (сразу после перезагрузки произойдёт обновление файлов и процесс будет завершён).

Rundll32.exe может работать в режиме совместимости с Win9X (rundll32 Setupx.dll) и в режиме совместимости с NT (rundll32 Setupapi.dll). Одним из отличий 9X и NT вариантов выполнения является набор используемых констант LDID (logical directory identifier - переменных путей к системным папкам).

Важно! Именно через Setupx.dll (Setupapi.dll), происходит выполнение INF-файла при запуске его из контекстного меню командой "Установить".

  •  Вызов через Advpack.dll

Синтаксис

RunDll32.exe advpack.dll, LaunchINFSectionEx <inf-file>, <section>, <cab>, <flag1>, <flag2>, 0


1. <inf-file> имя и путь к INF-файлу
2. <section> Исполняемая секция
3. <cab> Путь к CAB-файлу если INF-файл запакован (в этом случае параметр <inf-file> просто содержит имя файла без пути)

4. <flag1> - Флаг режима установки

5. <flag2> - Флаг перезагрузки
6. <0- nShow> не используется, равен 0, приведен только для информации о синтаксисе функции.

Флаг режима установки:

4      Тихий режим без UI
8      Не запускать GrpConv
16   Обновление программы (Force self-updating on user's system)
32   Сделать резервные копии файлов (точку отката) до установки
64   Откатиться до предыдущего состояния
128 Проверить резервные копии файлов
256 Полностью откатиться до предыдущего состояния
512 Принудительная задержка регистрации OCX (Force delay of OCX registration)

Эти флаги могут складываться. Например, довольно распространеный режим Quiet | Backup (32+4) = 36.

Флаг перезагрузки:

Без данного флага используется Smart Reboot, т. е. перезагрузка по требованию.

A - Перезагрузка всегда
I - Тот самый Smart Reboot, по умолчанию стоит этот флаг
N - Не перезагружаться

Пример с распаковкой INF из CAB:

rundll32.exe advpack.dll,LaunchINFSectionEx myinf.inf,,c:\temp\mydata.cab,36

Пример с откатом установки INF:

rundll32.exe advpack.dll,LaunchINFSectionEx c:\windows\inf\myinf.inf,,,256

Важно! При использовании в INF-файле инструкции Reboot и вызове через Rundll32 данного INF-файла, будет обработан режим перезагрузки, указанный в строке вызова через Rundll32.exe. Напомню, что в руководстве по INF-файлам написано:

Reboot= Флаг перезагрузки после выполнения пакета процедур. Этот флаг может быть отменён флагом вызова скрипта (через точку входа LaunchINFSectionEx)

Важно! Синтаксис описанных команд содержит запятые и пробелы. Не забывайте их ставить, иначе команда не сработает.

Важное замечание по синтаксису INF- скрипта. При вызове интерпретатора из INF-файла имеются различия вызова через Setupapi.dll и Advpack.dll. Вызов Setupapi.dll должен осуществляться через директиву Run= , а вызов Advpack.dll - только через RunPostSetupCommands=

Пример:

[DefaultInstall]

RunPostSetupCommands=Section.advpack

Run=Section.setupapi

[Section.advpack]

Rundll32.exe advpack.dll, LaunchINFSectionEx infname.inf, SectionToRun , , 4, 64

[Section.setupapi]

Rundll32.exe setupapi.dll, InstallHinfSection SectionToRun 132 infname.inf

  • Использование RunOnce

Для запуска исполняемых файлов после того, как INF-файл исполнен, можно использовать раздел реестра RunOnce. Команды из RunOnce выполняются после перезагрузки или следующего входа в систему. Ключ регистрации RunOnce дает возможность выполнить файлы в "тихом" режиме (без подсказок пользователю) или в виде списка программ или действий ("Установка Windows устанавливает следующие элементы"), которые видит пользователь. После выполнения программ записи из RunOnce удаляются.

  • Для "тихого режима" добавляется путь к приложению в раздел реестра: [HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce, "APPNAME", "APP_PATH"]
  • Для режима с отображением установки в виде окна со списком устанавливаемых программ добавляется путь к приложению в раздел реестра: [HKLM, Software\Microsoft\Windows\CurrentVersion\RunOnce\Setup, "APPNAME", "APP_PATH"]

"APPNAME" - во втором варианте будет отображаться в окне установки.

К содержанию


Приложение 3. Файл Txtsetup.sif

(с) Gosh http://gosh.msfn.org/txtsetup.htm
авторский перевод + мелкие дополнения - Volk1234


Txtsetup.sif - это, как следует из названия файла, Text setup system information file - файл установки текстового режима. После текстового режима этот файл не нужен системе, поэтому он не копируется из дистрибутива, не защищен цифровой подписью и не включен в состав файлов, защищаемых SFC. В связи с этим, Txtsetup.sif идеально подходит для целей автоустановки, добавления- удаления компонентов и записей реестра.

Добавление\удаление записей

Удалить строку из Txtsetup.sif проще простого - любой текстовый редактор это может. Также, можно закомментировать строку точкой с запятой (что лучше, если вы не знаете что делаете). А вот добавить строку сложнее, требуется знать синтаксис.

Синтаксис записи в секции копирования Txtsetup.sif:
filename_on_source= diskid, , , , , , , subdir, upgradecode, newinstallcode, spare, spare, newfilename, flag, unknown

Рассмотрим пример:

locsecw.chm = 1, , , , , , , 21, 0, 0, localsec.chm

[Locsecw.chm] - файл дистрибутива (понятно, что он находится в i386)
[1] - соответствует секции [SourceDisksNames.x86] в Txtsetup.sif. В данном случае параметр [1] означает,
что файл из оригинальной (RTM) сборки. Значение [100], например, означает принадлежность файла к SP1, SP2.
Отвечает на вопрос ОТКУДА?

[,,,,,,,] - пустые параметры, отделенные знаками запятой специфика winnt систем. Точные значения неизвестны.

[21] - указывает папку назначения, секция [WinntDirectories], в данном случае в [%Windir%\Help]
Отвечает на вопрос КУДА?

[0] - upgradecode - режим копирования файла. Предназначен для корректного обновления с более старых ОС.
значения:

0 - Копировать всегда
1 - Копировать только в том случае, если файл присутствует в папке назначения
2 - Не копировать, если файл присутствует в папке назначения
3 - Не копировать файл

[0] - newinstalcode - указывает на "чистую" установку. Необязателен. Если не указан, используется значение по умолчанию = 3, а файл не копируется.

[Localsec.chm] - новое имя, переименование происходит при копировании.

Интересное отступление: в первоначальном имени присутствует буква w. Gosh предполагает, что w - это сокращение от workstation, а p - Personal. Так планировалось называть версии XP, аналогично Professional и Home:

cmconW.chm = 1, , , , , , , 21, 0, 0, cmconcepts.chm - xp pro txtsetup.sif
cmconP.chm = 1, , , , , , , 21, 0, 0, cmconcepts.chm - xp home txtsetup.sif

[flag] - флаг копирования (подробнее смотрите Руководство по работе с INF-файлами).
[unknown] - пока не могу сказать, что это, но в родном файле используется для драйверов и системных файлов, принимая значения от 2 до 180.

Теперь рассмотрим другой пример:

autofmt.exe = 1, , , , , , _x, 2, 0, 0, , 1, 2

[_x] означает, что файл дистрибутива не сжат. Если [_x] отсутствует, программа установки предполагает, что файл сжат. Каждый файл XP перечислен в Layout.inf, вместе с размером в байтах. Размер в байтах, очевидно, зависит от того, сжат файл или нет. Если Txtsetup.sif укажет программе установки, что файл не сжат, то установщик будет сравнивать размер файла с Layout.inf, чтобы удостовериться что размер не был изменен. Если файл сжат, то установщик будет сравнивать с записью в Layout.inf размер распакованного файла. Если размер файла не соответствует тому, что указан в Layout.inf, установка XP может быть прервана ошибкой.

Важно! Если устанавливается сторонняя программа, размера и имени которой нет в Layout.inf, необходимость использования параметра [_x] отпадает.

Важно! Txtsetup.sif не сообщает программе установки местоположение файлов. Его единственная функция - скопировать нужный файл в нужную папку. Txtsetup.sif запускается после того, как Dosnet.inf скопирует дистрибутив в C:\$WIN_NT$. ~ LS. Txtsetup.sif предполагает, что исходные файлы постоянно находятся в этой папке. При установке с CD\DVD все проще, потому что файлы сразу переписываются в %windir%. В таком варианте Dosnet.inf скорее выполняет второстепенные функции по указанию путей копирования.

Фактически, Txtsetup.sif отвечает за копирование файлов, обеспечение удаления старых папок при апгрейде, создании кустов реестра, первоначальной загрузкой критических драйверов.

Пример Txtsetup.sif для аддона CCleaner

[SourceDisksFiles]
Cleaner.inf = 100,,,,,,,20,0,0
CCleaner.cab = 100,,,,,,_x,,3,3

1. Как видим, использован параметр [100], то есть указание на SP2 (что не очень принципиально).
2. INF-файл копируется в папку [%Windir%\inf] -20 для возможности деинсталяции аддона.
3. CAB-файл в папку Windows не копируется - ,,3,3 и не сжат _x (?). Файлы из CAB-архива просто устанавливаются с помощью одноименного INF-файла.

К содержанию


Приложение 4. Файл Sysoc.inf

Здесь то немногое, что удалось собрать.

SYSOC (System Optional Components) - это диспетчер установки дополнительных компонентов ОС. В процессе выполнения программы установки выполняется файл Sysoc.inf, посредством Ocgen.dll и других библиотек. Файл Состоит в основном из секций [Components] где указываются устанавливаемые дополнительные компоненты.

Синтаксис:
WGA=Ocgen.dll, OcEntry, Pck_WGA.inf, HIDE, 7

WGA - имя исполняемой секции
Ocgen.dll - библиотека обработчик sysoc
OcEntry - команда Ocgen.dll (нечто вроде точки входа)
Pck_WGA.inf - название INF-файла устанавливаемого компонента
Hide - скрыть компонент
7- флаг (неизвестно); для Ocgen.dll всегда равен 7

  • Для установки через SYSOC в ваш INF-файл необходимо добавить секцию:

[Optional Components]
Имя исполняемой секции

  • Для размещения вашего приложения, устанавливаемого через SYSOC в группе 3rdParty (Программы сторонних разработчиков), добавьте в исполняемую секцию инструкцию Parent=NonMS. Также, уберите параметр HIDE из строки в SYSOC.
  • Параметр Modes=0,1,2,3 точное значение неизвестно, однако разместить его в исполняемой секции можно двумя способами:

Modes=0,1,2,3     ;аддон будет установлен по умолчанию
;Modes=0,1,2,3    ;аддон не будет установлен по умолчанию, его доустановка возможна из "Установки компонентов Windows"

Без параметра Modes=0,1,2,3 аддон не будет установлен.

К содержанию


Приложение 5. Секция [Optional Components]


Бродя по темным закоулкам Technet и просматривая одним глазом DDK и SDK KIT для Win98, я наткнулся на описание загадочной секции, использующейся для установки через Sysoc.inf. Я подозревал, что это штатная секция INF-файлов, просто не сильно афишировавшаяся. Итак, подробнее об этой секции.

Синтаксис:

[Optional Components]
Имя секции - ссылка на секцию в файле, которую надо исполнить для установки
.....
[Имя секции] - сама установочная секция

Данная секция служит для добавления устанавливаемого приложения в список оснастки "Установка/Удаление программ - Компоненты Windows". Секция не будет исполнена при попытке выполнить файл по правому щелчку мышью и выбору пункта "Установить". Ее также нельзя выполнить с помощью команды [Setupx.dll InstallHinfSection точка_входа]. В первом случае будет выполняться секция [DefaultInstall], a во втором секция - указанная точкой входа. В обоих случаях параметры секции [Optional Components] будут игнорированы.

Насколько я понимаю, для обработки дополнительных инструкций секции [Optional Components] и существуют файлы Sysoc.inf, Ocgen.dll и Sysocmgr.exe. В основном инструкции [Optional Components] служат для управления отображения компонентов в окне "Компоненты Windows".

Вернемся к синтаксису. В секцию установки могут быть добавлены следующие инструкции OC:

OptionDesc=название дополнительного компонента
Tip=Подсказка в поле "Описание".
InstallDefault=0 | 1 ; Устанавливать компонент по умолчанию. 1=Да, 0=Нет.
IconIndex=Номер иконки для отображения
Parent= (имя секции\группы) группа или подгруппа в  "Компоненты Windows" (Пример: "Игры Windows" относятся к Parent=AccessUtil, аддоны 3dParty к Parent=NonMS)
Needs=имя секции, имя секции
Include=INF-файл, [INF-файл]

OptionDesc - это строковой параметр задающий название дополнительного компонента отображающегося в "Компоненты Windows". Может быть задан через Strings.

Tip - это текст подсказки в поле "Описание", ограничение - 255 символов. Может быть задан через Strings.

IconIndex - это иконка, которая будет отображаться рядом с названием компонента. Привожу список* иконок в оригинале:

0 Machine (base and display)
1 Integrated circuit chip
2 Display
3 Network wires
4 Windows flag
5 Mouse
6 Keyboard (3 keys)
7 Phone
8 Speaker
9 Hard disks
10 Comm connector
11 Diamond (default value)
12 Checked box
13 Un-checked box
14 Printer
15 Net card
16 Same as 0
17 Same as 0 w/ a sharing hand underneath
18 Unknown (question mark)
19 Atwork
20 Greyed check box
21 Dial-up networking
22 Direct cable connection
23 Briefcase
24 Exchange
25 Partial check
26 Accessories group
27 Multimedia group
28 Quick View
29 MSN
30 Calculator
31 Defrag
32 Generic document
33 DriveSpace
34 Solitaire
35 HyperTerminal
36 Object Packager
37 Paint
38 Screen saver
39 WordPad
40 Clipboard Viewer
41 Accessibility
42 Backup
43 Bitmap document
44 Character map
45 Mouse pointers
46 Net Watcher
47 Phone Dialer
48 System Monitor
49 Help book
50 Globe (international settings)
51 Audio compression
52 CD player
53 Media Player
54 Sound scheme
55 Video clip
56 Video compression
57 Volume control
58 Musica sound scheme
59 Jungle sound scheme
60 Robotz sound scheme
61 Utopia sound scheme

*Эти иконки находятся в  Setupapi.dll и их там больше, но похоже работают только приведенные в списке.


Parent - это инструкция, указывающая, является компонент подчиненным или родительским. Если параметр отсутствует, то менеджер дополнительных компонентов считает что компонент родительский. Если указать несуществующий родительский компонент (например, сам аддон), менеджер компонентов зависнет в попытке найти такого родителя. Для всех авторов аддонов должен быть только один вариант - Parent=NonMS (аддон 3dParty), чтобы не загромождать менеджер дополнительных компонентов (конечно, кроме особых случаев).

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

Include присоединяет INF-файл стороннего компонента к текущей установке, что позволяет ссылаться на секции в присоединенном файле.

InstallDefault, скорее всего, достался в наследство от Win98. Я пробовал ставить аддон с этим параметром = 1 вместо Modes= 0,1,2,3. Аддон не поставился, но в списке
компонентов появился и позволил доустановить себя. У кого получится установить - сообщите. Пока могу посоветовать использовать Modes=0,1,2,3.

Пример:

[Optional Components]
InstallMyToys
InstallGames

[InstallMyToys]
OptionDesc=%Toys_DESC%
Tip=%Tomytoysys_TIP%
IconIndex=35 ;Иконка "Телефон"
Parent=MailApps
Needs=MSMAIL, MAPI, MicrosoftNetwork
Include=mos.inf, msmail.inf
CopyFiles=MyToysFiles
UpdateInis=MyToysLinks
AddReg=MyToysRegItems

[InstallOtherApps]
OptionDesc=%Other_DESC%
Tip=%Other_TIP%
IconIndex=4 ;windows mini icon for dialogs
CopyFiles=OtherFiles
UpdateInis=OtherLinks
AddReg=OtherRegItems

[Strings]
Toys_DESC="Почтовая утилита"
Toys_TIP="Дополнительные почтовые инструменты"
Other_DESC="Другие полезные утилиты"
Other_TIP="Калькулятор, очистка диска и монитор производительности"

  • Дополнительно можно прочесть про файл ответов Sysocmgr.exe (для установленной системы) здесь.

К содержанию


Приложение 6. Этапы и механизмы установки Windows XP/2003. Log-файлы, создаваемые в процессе установки.

Этапы текстового режима различаются в зависимости от режимов установки. Здесь рассматриваются этапы установки с дистрибутивного CD, из удаленного сетевого дистрибутива и с локального дистрибутива на жестком диске (zip, flash). В принципе, мастер установки рассматривает любой вариант установки, кроме установки с CD, как установку из удаленного источника, отсюда и дополнительный этап копирования во временную папку $win_nt$.~ls, перезагрузку и уже только затем копирование в папку установки.

Первый этап проходит в текстовом режиме:

  1. Запуск загрузчика установочного диска Ntboot.bin (для CD).
  2. Запуск Bootfix.bin (для CD).
  3. Запуск Setupldr.bin. Если установка выполняется не с CD, то файл Setupldr.bin (запускаемый через Winnt.exe) переименовывается в $LDR$ и копируется на диск установки для использования в качестве временного загрузчика для дополнительного этапа копирования.
  4. Setupldr.bin ($LDR$) передает, через Winnt.exe, управление Setupdd.sys, который с помощью Txtsetup.sif и Winnt.sif выполняет основные фазы текстового этапа, такие как копирование файлов и сбор информации о оборудовании для последующих этапов установки.
  5. Чтение и интерпретация Txtsetup.sif, Winnt.sif и некоторых других файлов. Для установки не с CD используется dosnet.inf, содержащий сведения о файлах в папке [$win_nt$.~ls]
  6. Загрузка драйверов оборудования.
  7. Запуск Ntoskrnl.exe, Ntdll.dll и Smss.exe (фактически загружено ядро системы).
  8. Копирование файлов с дистрибутивного диска в [%WINDIR%]. Или в случае установки из удаленного источника (пусть даже со второго раздела диска) копирование производится в локальный источник: папку [$win_nt$.~ls]. Затем следует перезагрузка, и с помощью загрузчика $LDR$ управление передается Setupdd.sys, который повторяет этапы 4-8, только на этот раз файлы копируются из [$win_nt$.~ls] в [%WINDIR%].
  9. Копирование прототипов реестра в %WINDIR%\system32\config\*.sav было выполнено вместе с другими файлами, после чего производится обновление и инициализация реестра с помощью Hive*.inf.
  10. Setupdd.sys создает файл $wint$.inf в зависимости от конфигурации оборудования и содержимого файлов Txtsetup.sif , Syssetup.inf, Layout.inf, Winnt.sif (Unnatend.txt). Файлы $wint$.inf [%windir%\System32], Syssetup.inf, Layout.inf [%windir%\inf] будут использованы мастером установки в графическом этапе установки.
  11. Создание загрузочного сектора, загрузчика NTLDR, файла Boot.ini.
  12. Перезагрузка.

Второй этап продолжается в графическом режиме:

  1. T39 – запуск Setup.exe который передает управление библиотеке Syssetup.dll. Эта библиотека координирует весь процесс установки в графическом режиме, используя информацию для установки из файлов Syssetup.inf, $wint$.inf, Layout.inf. При этом используется множество динамически подключаемых библиотек, таких как Setupapi.dll, Netshell.dll, Ocgen.dll и др., для выполнения различных действий в процессе установки. Отрабатывает параметр DetachedProgram секции [GuiUnattended]
  2. Загрузка Nt5.cat и прочих файлов безопасности каталогов.
  3. Запуск Ocmanage.dll (диспетчер дополнительных компонентов).
  4. Определение установленного оборудования (Machine.inf).
  5. T37 – установка драйверов устройств.
  6. Создание и запуск Intl.cpl используя информацию из Intl.inf (конфигурируются региональные настройки).
  7. Запрос ключа продукта.
  8. Установка дополнительных компонентов ОС (Sysoc.inf) С помощью Sysoc.inf менеджер установки строит список файлов для установки этих компонентов. Затем этот список сверяется с файлом Unattend.txt (Winnt.sif) если он есть. По результатам сверки образуется конечный список устанавливаемых компонентов..
  9. T32 – установка поддержки сети.
  10. T29 – копирование всех необходимых файлов ОС.
  11. T25 – завершение установки.
  12. T22 – установка меню «Пуск» (Shell.inf) и сохранение сделанных изменений в реестре.
  13. T18 – регистрация компонентов (OLE regsrv).
  14. T13 – обработка Svcpack.inf.
  15. T12 – запуск [$OEM$/Cmdlines.txt].
  16. T9 – сохранение параметров, установка административных разрешений для системных папок и реестра, запуск команд из секции [SetupParams].
  17. T8 – сохранение настроек (Sfc.dll сканирует все системные файлы для создания базы WFP и заменяет неоригинальные файлы).
  18. Создание signhash Hardware ID.
  19. Удаление временных файлов.
  20. Перезагрузка.

Третий этап продолжается в графическом режиме:

  1. Включение oobeinfo, активация копии системы.
  2. Добавление пользовательских профилей.
  3. Применение установок.
  4. Настройка пользовательских профилей.
  5. Запуск команд из секции GuiRunOnce.
  6. Загрузка рабочего стола.

Здесь на сайте есть более короткий список этапов установки.


Log-файлы, создаваемые в процессе установки.

Размещение log-файлов: [%Windir%]

  • Setupapi.log

Файл протоколирования Setupapi.dll, которая обрабатывает INF-файлы во время установки аппаратных средств и регистрации. Этот файл может содержать записи, которые начинаются c [#E], что указывает на проблемы или ошибки. Отслеживает установку через INF-файлы и на установленной системе. Запись вносится каждый раз при исполнении строки из inf- файла.

  • Setuperr.log

Общий журнал ошибок в процессе установки.

  • Setuplog.txt

Общий журнал установки. Содержит все действия, совершаемые во время последней установки.

  • Upgrade.txt

Лог менеджера установки после запуска проверки на совместимость с Windows XP.

  • Setupact.log

Журнал регистрации операций. Содержит записи об операциях программы установки в хронологическом порядке. Например, это операции копирования файлов и создания записей и системном реестре, определения аппаратных устройств и установки драйверов. В нем также содержатся записи журнала ошибок - Setuperr.log .

  • Winnt32.log

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

  • Wsdu.log

Лог динамического обновления установки (только если используется динамическое обновление)

  • Сomsetup.log

Описывает установку дополнительных компонентов и компонентов СОМ+

  • NetSetup.log

[%windir%\debug\NetSetup.log] Регистрирует процесс вхождения в домен или рабочую группу.

  • Setup.log

[%windir%\repair\Setup.log] - Хранит информацию, которая используется консолью восстановления.

  • Log-файлы, генерируемые дополнительными компонентами.

К содержанию


Приложение 7. Патч Sfcfiles.dll

В составе Update pack приcутствует патч Sfcfiles.dll, написанный участником конференции BoaSoft. Взаимодействовать с патчером возможно путем конфигурационных файлов KillWFP.lst, DelDrv.lst, DelOC.lst. Синтаксис простой: имя файла (с расширением), для которого необходимо отключить WFP и/или который необходимо удалить из дистрибутива.

Описание патча Sfcfiles.dll предоставим автору:

Зачем это нужно?

Большая часть важных для системы файлов в Windows XP защищена от удаления и изменения функцией WPF (Windows File Protection). Если вы хотите удалять или изменять некотрые файлы, система не даст этого сделать. Точнее, это ограничение можно обойти, но при запуске SFC произойдет замена файлов на оригинальные или же последует запрос на вставку диска с дистрибутивом. Можно полностью отключить защиту, но тогда система становится беззащитной перед шаловливыми руками пользователя или криво перепакованными дистрибутивами игрушек. Результат - отсутствующие файлы и падение системы.

В большинстве случаев требуется исключить лишь несколько фалов. Этого можно легко достичь патчем Sfcfiles.dll, заставив библиотеку "забыть" о этих файлах.

Алгоритм работы

Программа действует очень просто. Операционная система определяет, какие файлы защищены, на основе информации, содержащейся в библиотеке Sfcfiles.dll. Эта библиотека не несет в себе прямых функций защиты, а только выдает список защищенных файлов. Там находятся списки защищаемых файлов, целых 5 штук для разных систем:

XP Pro
XP Home
Xp Tablet PC
XP Media Center Edition
XP Starter

В серверной библиотечке тоже 5 списков, но их назначения (соответствия версиям продуктов) не выяснены. Система защиты получает список защищенных файлов с полными путями из этой библиотеки, вызывая API - функцию SfcGetFiles. Нам же требуется, чтобы в этот список не попали нужные нам файлы.

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

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

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

Проверялось с Sfcfiles.dll от Windows XP SP2 rus/ SP2 en/ SP1/2003 Server rus. (Во всей линейке ОС одного семейства и пакета обновлений библиотека одинакова!). С другими версиями программа также должна работать. Проверить правильность работы можно на рабочей ОС, временно заменив оригинальную библиотеку на патченую, проигнорировав запрос о вставке диска и перезагрузившись.

Патчер не нарушает работу функции восстановления системных файлов командой SFC /scannow.

К содержанию


Приложение 8. Файл Addon.nfo

Addon.nfo обязателен для всех аддонов в целях удобства пользователей. Стандартная структура файла Addon.nfo:

  1. Название аддона и версия программы, для которой делается аддон: Аддон (Аддон-конструктор) Example 3.1.1.2
  2. Дата создания аддона: 01.01.2008
  3. Версия аддона: v 0.8
  4. Тип интеграции аддона: SVCPACK.inf
  5. Требуемые компоненты: аддон 3rdParty
  6. Краткое описание: Эту замечательную программу испробовали многие пользователи по всему свету. Вот я и решил сделать небольшой аддончик.
  7. Сайт производителя программы: www.site.org
  8. Сайт\ветка аддона. forum.oszone.ru/example
  9. Автор аддона: Author_name

Итого имеем:
Addon.nfo

Аддон (Аддон-конструктор) Example 3.1.1.2
Дата создания аддона: 01.01.2008
Версия аддона: v 0.8

Тип интеграции аддона: SVCPACK.inf
Требуемые компоненты: аддон 3rdParty

Эту замечательную программу испробовали многие пользователи по всему свету.
Вот я и решил сделать небольшой аддончик.

Сайт производителя программы:www.site.org
Ветка аддона в форуме OSzone: forum.oszone.ru/example
Автор аддона: Author_name

Свое развитие этот конфигурационный файл получил в служебном аддоне HTMLINFO, созданным участником конференции asmol. Данный аддон формирует в корневой папке вашего дистрибутива файл Addons.htm. В данном файле используются многие преимущества языка HTML, и это позволяет красиво оформить список установленных аддонов. Используя в вашем аддоне файл Html.nfo, вы можете добавить описание вашего аддона в Addons.htm.

К содержанию


Приложение 9. Тонкости создания аддонов SVCPACK

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

1. Использование установщиков.

Как правило, использование установщиков в аддонах SVCPACK сводится к запуску инсталлятора в «тихом» режиме. Однако есть и тонкости.

1.1 Использование установщика Windows (Windows Installer).

Самая распространенная конструкция аддонов типа SVCPACK  это строка с использованием ключей тихой установки конкретного установщика в конфигурационном файле Run, либо в коментарии архива. Также используются MST-файлы для заданных заранее параметров установки. Этот метод не всегда гибок. Данный факт сподвиг меня на исследования, которые вылились в целую статью. Повторять ее здесь нет смысла, поэтому обязательно почитайте статью по ссылке. Здесь же небольшие замечания по использованию свойств установщика Windows.

Свойства (Properties) установщика, заданные в командной строке, имеют приоритет выше, чем MST-файл, что делает их отличным средством повышения гибкости вашего аддона. Можно исправить одну строку с параметрами, а не редактировать специальными программами MST-файл.

Синтаксис использования:

msiexec.exe /i Example.msi СВОЙСТВО

Если MSI-файл установки упакован установщиком в EXE-файл, то следует использовать стандартный ключ /v для передачи параметров в MSI-файл.

Синтаксис использования:


Example.exe /s /v”TRANSFORMS=unatend.mst /qn”

Обсуждение применения различных свойств установщика Windows в ветке Msiexec - список ключей и свойств

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

К содержанию


Лог изменений

23.06.2009 версия статьи 2.30
+ Приложение 9. Тонкости создания аддонов SVCPACK - новое
+ Раздел I. Общие положения.
Имена файлов и папок.
Префиксы в названиях папок аддонов.
Конфигурационные файлы.
+ РАЗДЕЛ II. Типы аддонов.
Аддоны, использующие SYSOC
Аддоны, использующие для интеграции SVCPACK.
Аддоны, изменяющие дистрибутив.
+ Раздел III. Примеры и приложения.
Приложение 1. Префиксы.
Приложение 2. Тонкости использования INF-файлов.
3. Создание ярлыков - переработанно
4. Разное. Определение каталога копирования по умолчанию.
Приложение 3. Файл Txtsetup.sif
Приложение 8. Файл Addon.nfo
*Добавлены отсутствующие ссылки и и проверены все ссылки. А их около 40 штук !
*Более 68 мелких смысловых правок текста (добовление слов, предложений, перемена слов местами)
*Приведение всех папок к виду [путь\папка]
*Приведение слов SVCPACK и SYSOC к единому виду(прямой шрифт, заглавные буквы)
*Приведение всех файлов(кроме кода) к виду File.exe

06.10.2008 версия статьи 1.41

*Маленькая смысловая правка статьи по SYSOC аддонам.

02.10.2008 версия статьи 1.40

+ Определение аддонов.Их плюсы и минусы. Раздел I.

+ Схема структуры аддонов дополнена вторым аддоном (SYSOC). Раздел I.

+ Что такое конфигурационные файлы. Раздел I.

+ Предупреждение о влиянии изменения имен папок на конфигурационные файлы Required и Conflict. Раздел I.

-  Удалена строка описания Sysoc.inf в разделе Аддоны, использующие Sysoc, не подходящяя по стилистике.

* Оформление таблицы префиксов. Приложение I.

* Орфографические правки, пост 239 из темы руководства.

31.07.2008 версия статьи 1.36

+ Дополнено описание лог файлов - Приложение 6.
+ Дополнен (доведен до логического завершения) подраздел 3.Создание ярлыков в Приложении 2.
+ Флаг удаления ярлыков в подразделе 4.Разное в Приложении 2.
+ "Копирование одного и того же файла в разные папки" подраздел 4.Разное в Приложении 2.
* Аддоны использующие Sysoc - выбор устанавливаемых компонентов.
* Приложение 5. Указан файл с иконками Optional Components.

09.07.2008 версия статьи 1.32

*Обновлено определение метода Sysoc: Раздел II. Глава 1. Аддоны, использующие SYSOC

*Готовый шаблон от jameszero: Раздел 3. Приложение 2. Подраздел 2. Методы деинсталяции.

23.05.2008 версия статьи 1.3

* орфографические и стилистические правки в большом количестве :)

14.05.2008 версия статьи 1.3rc2

+Добавлена статья "Выполнение INF-файла через Rundll32.exe" 

*орфографические и стилистические правки.

Легенда: [+] Добавлено [-] Удалено [*] Редактирование, несущественные дополнения

К содержанию


Благодарности

Я сам не люблю читать благодарности - наверное потому, что меня там не упоминают :) Но когда заканчиваешь такой большой проект, как это руководство, начинаешь любить всех и вся. Хочу сказать спасибо:

  • Сайту oszone.net - всем участникам форума, всем кто его создал и поддерживает
  • Petya V4sechkin за Update Pack и возможность писать под него свои аддоны, а также за всегда квалифицированную помощь
  • Vadikan за фантастическую поддержку от сайта (ну и за моральную тоже), а также за правку моей худой орфографии.
  • jameszero за техподдержку и выдержку
  • gora за советы по работе над Руководством
  • Master Fess за помощь в проверке Руководства
  • Drinko (неустанно жавшему "Полезное сообщение" и не только... :)
  • Shido и vserd ставшие уже постоянными генераторами идей для Р.

и всем, всем, всем....

При написании неизбежно цитирование и заимствование, привожу список тех у кого были заимствованы идеи: Petya V4sechkin, gora, Vek, XXXler, jameszero, vserd, Gosh (msfn.org), Drinko, BoaSoft, Master Fess, Stanner, Habetdin, otsheln1k, okshef  ...  Это те, кого помню :)IDDQDesnik за пост #14 - определившего название одной из групп аддонов в Руководстве.

К содержанию


Автор: volk1234  •  Иcточник: forum.oszone.net  •  Опубликована: 18.04.2008
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:  


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.