OSzone.net
 
s  

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

Windows » Автоматическая установка » Руководство по созданию аддонов
В избранное | Версия для печати | Посетителей: 4133 | Просмотров: 5671 (сегодня 13)   Текущий рейтинг: 4.93 (проголосовало 15)

Содержание

 

Введение

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

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

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

 

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

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

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

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

 

Соглашения

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

 

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

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

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

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

 

К содержанию


 

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

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

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

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

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

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

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

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

 

К содержанию


 

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

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

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

UPDATE PACK-
     +ADDONS (папка аддонов)
          -+Example (папка конкретного аддона)
                --+Files (папка файлов конкретного аддона)
                       ---+Compresed
                       ---+ForceCopy
          -Run
          -KillWFP.lst
          -Finish
          -Addon.nfo         >(конфигурационные файлы)
          -Required
          -Conflict
          -Hive
             
     +FILES (папка файлов UpdatePack)

 

К содержанию


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

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

  •  Dosnet - содержимое добавляется в Dosnet.inf в чистом виде;
  •  Txtsetup - добавляется в Txtsetup.sif в чистом виде;
  •  Sysoc - добавляется в секцию [Components] файла Sysoc.inf; (должен заканчиваться пустой строкой)
  •  Run - добавляется в секцию [SetupHotfixesToRun] файла Svcpack.inf; (должен заканчиваться пустой строкой)
  •  SpecCase - специальные случаи (например, если нужно удалить что-то из дистрибутива перед тем, как скопировать туда новые файлы); фактически это cmd-файл, только без  расширения;
  •  KillWFP.lst - список файлов, для которых нужно отключить WFP;
  •  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 и выполняет, причем при выполнении текущей директорией становится папка аддона).

 К содержанию


Обработка аддона скриптом 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 нет? О синтаксисе файла 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. С помощью Sysoc.inf менеджер установки строит список файлов для установки дополнительных компонентов. Затем этот список сверяется с файлом Unattend.txt (Winnt.sif), если он есть. По результатам сверки образуется конечный список устанавливаемых компонентов. Файл Dosnet.inf содержит остальные данные для программы установки на текстовом этапе, в том числе папку установки Windows.

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

Пример аддона, использующего 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-файл устанавливался в будущем из контекстного меню (а не через rundll32), если предполагается использовать аддон на установленной системе. Пример: аддон 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] файла I386\svcpack.inf дистрибутива Windows.

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

Здесь нужно сделать отступление и рассказать об аддонах-конструкторах. Именно способ SVCPACK как нельзя лучше подходит для создания конструкторов. В таком конструкторе отсутствует дистрибутив. Это уменьшает размер скачиваемого аддона и оставляет выбор пользователю, так как зачастую конструктор подходит для разных билдов и даже версий программы (например, ACDSee 10 и ACDSee Pro2, KLite 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 их прописывать не надо!

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

 

К содержанию


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

Из названия следует, что данный тип использует оба вышеописанных типа: 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). Как ее обойти, читайте здесь: Приложение 6. Патч SFCFiles.DLL. Если по каким-либо причинам использовать патч sfcfiles.dll нельзя или невозможно, остается только посоветовать эту статью (раздел Modify PE).

 

 К содержанию


 Раздел 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-файлы рядом, я проверил, как устанавливается приложение. Хорошо устанавливается, клещами не вытянешь. На этом этапе мы и будем изобретать клещи - секции для удаления нашего приложения (uninstall). Сразу скажу, мне это далось нелегко. В теории (учебнике по INF-файлам) все выглядело просто. Указав в исполняемой секции AddReg= Секция добавления строк в реестр мы еще при установке приложения добавляем его в список установки/удаления программ. Сама секция незамысловата и подробно описана в Учебнике. Самая важная строка это
 

HKLM,"%Key%","DisplayName",,"Netlook 2.3"
HKLM,"%Key%","DisiplayIcon",,"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 файлов. По итогам консультаций на форуме пришлось создавать отдельные секции удаления файлов (по сути дублирование секций COPY). Зато результат был налицо - файлы удалялись. Дальше я создал секции удаления записей в реестре (чтобы сразу после удаления программы она исчезала из списка удаления программ), удаления ярлыка и удаления директорий. Все работало замечательно. Огорчало только, то что директории не удалялись. Учебник однозначно говорит, что вызвать 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 запускается через advapi.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 скрипт 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. учебный аддон Puntoswitcher (от 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 codek 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, для чего через Run создан пустой SFX-архив 7-zip с командами установки в коментарии архива.

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. Таблица префиксов. 

 

Цифровой префикс Пример записи и предлагаемый порядок аддонов
0 Служебные
0 0-HTMLINFO
1 Аддоны базового набора
1 1-BASECSP
1 1-FLASH
1 1-HDA
1 1-IE
1 1-IMAPI2
1 1-MMC3
1 1-MSXML
1 1-MU
1 1-PKGINST
1 1-PNRP
1 1-RDC6
1 1-ROOTSUPD
1 1-WEBFLDRS
1 1-W
2 Разного рода обновления и дополнения встроенных компонентов ОС.
2 2-SHOCKWAVE
2 2-DOTNET35
2 2-DX9U
2 2-HTMCD
2 2-WMP11RUS
3 Неофициальные обновления или не рекомендуемые обновления ОС.
3 3-KB893056-MSGINA
3 3-KB901190-IME
3 3-EXTREMEPACK
4 Хаки
4 4-OOBE
4 4-RAID
4 4-RCADMIN
4 4-NODEP
5 Различные DLL и OCX файлы.
5 5-EXPEXT
5 5-HASHTAB
5 5-PRIO
5 5-TARGET
6 Аддоны, предназначенные для внесения изменений в реестр и настройки ОС.
6 6-UNPNC
6 6-XPRIGHTS
6 6-MYCUSTOM
7 Программы сторонних производителей.
7 7-WINRAR
7 7-EMEDITOR7
7 7-REGSHOT
7 7-SALAMANDER
7 7-VOLUMEC
8 Аддоны, предназначенные для удаления компонентов ОС и драйверов.
8 8-DEL_CAM
8 8-DEL_LANDRV
8 8-DEL_MODEM
8 8-DEL_MULTIPORT
8 8-DEL_PRN
8 8-DEL_SCANER
8 8-DEL_SCSI-4
8 8-DEL_VIDEODRV
8 8-DELBMPINWIN
8 8-DELGAMES
8 8-DELMOUSETOUR
8 8-DELNETMEETING
8 8-DELPINBALL
8 8-DELSCR
8 8-DELWINTOUR
8 8-DELZONEGAMES
9 Служебные. Предназначены для пост-обработки информации или создания образа.
9 9-ZLOG
9 9-BCDW

 

 К содержанию


Приложение 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 для обработки команды 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. Создание ярлыков

  • 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- файлам. Ссылка 
  • Флаги ProfileItems (опять Gosh).

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

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

 

  • Копирование файлов из секции CopyFiles

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

 CopyFiles=@myfile.txt, @anotherfile.txt 

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

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

 

 К содержанию


 

 Приложение 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. Загрузка