УЧЕБНИК ПО АВТОУСТАНОВКЕ WINDOWS

       

учебный аддон 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.
- Если путь к папке или файлу содержит пробелы, не забывайте заключать его в кавычки.
Пример был взят отсюда.
К содержанию

Содержание раздела