Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Секреты Windows: статьи о реестре, rundll32.exe, программах Недокументированные возможности Windows XP. INF. Часть 2


Продолжение, начало в выпусках: 1

В конец записи

оцените: 1 2 3 4 5

Книга "Недокументированные возможности Windows XP. Библиотека пользователя", Глава 4. Другие возможности Windows XP. Часть 5. Inf-файлы, продолжение.

Копирование файлов Копирование файлов реализовано в inf-файлах наиболее сложно. Для выполнения копирования необходимо не только использовать ключевое слово COPYFILES, но и создавать три отдельных блока inf-файла: DESTINATIONDIRS, SOURCEDISKSFILES и SOURCEDISKSNAMES. Давайте рассмотрим простой пример.

Листинг 4.7. Копирование файлов
[version]
Signature = $CHICAGO$

[DefaultInstall]
CopyFiles = infcopy

[infcopy]
1.inf

[DestinationDirs]
infcopy = 17

[SourceDisksFiles]
1.inf = 55

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

В этом примере для описания копируемых файлов используется блок inf-файла [infcopy], ссылка на которых содержится в ключевом слове COPYFILES. Этот блок содержит в себе только названия файлов, которые должны быть скопированы (если файлов несколько, тогда каждый из них пишется в отдельной строке). Кроме блока [infcopy] файл обязательно должен содержать в себе и три других стандартных блока inf-файлов.

Блок [DESTINATIONDIRS] определяет каталоги, в которые должны копироваться файлы, описанные в отдельных блоках inf-файла, предназначенных для описания копируемых файлов. При этом, все файлы, описанные в одном блоке inf-файла, должны копироваться только в один каталог (то есть, если бы в нашем блоке [INFCOPY] описывалось два файла, например, 1.inf и 2.inf, тогда оба этих файла будут копироваться в один каталог). Формат определения каталога, в который будут копироваться файлы, следующий: «блок описания копируемых файлов»=«числовой номер каталога»,«дальнейший путь к каталогу». Числовой номер каталога представляет собой число, идентифицирующее одну из системных папок. Давайте рассмотрим некоторые из этих чисел, а также каталоги, которые они определяют.

  • 10 — %systemroot%.
  • 11 — %systemroot%\system32.
  • 17 — %systemroot%\Inf.
  • 53 — %userprofile%.
  • 54 — %systemdrive%.
  • 1 — говорит о том, что необходимо использоваться абсолютный путь, который должен быть записан после числового номера (через запятую). Абсолютным путем называется путь, который не начинается с числового номера каталога. Например, числовым путем является путь d:\test\1.

С помощью блока [SOURCEDISKSFILES] осуществляется присваивание каждому копируемому файлу уникального идентификатора, который будет определять в блоке [SOURCEDISKSNAMES] название диска, из которого выполняется копирование файла. Формат строк этого блока следующий: «название копируемого файла»=«уникальный идентификатор диска, на котором находится этот файл».

Блок [SOURCEDISKSNAMES] определяет диски, на которых находятся копируемые файлы. Формат строк этого блока таков: «уникальный идентификатор диска»=«имя диска»,«метка диска»,«серийный номер диска». Метка диска отображается в диалоге копирования файлов. Также эта метка отображается в диалоге, выводимом если система не может найти указанные для копирования файлы. В этом случае система попросит вас вставить диск, название которого как раз и указано в блоке [SOURCEDISKSNAMES].

Удаление файлов Удаление файлов напоминает их копирование, поэтому мы рассмотрим этот процесс лишь поверхностно — в подсказках к листингу 4.8. Для определения блоков, содержащих описания удаляемых файлов, используется ключевое слово DELFILES.

Листинг 4.8. Удаление файлов
[version]
Signature = $CHICAGO$

;данный подраздел будет вызываться с помощью команды rundll32
[DefaultUninstall]
DelFiles = infdel

;мы будем удалять файл vfolder.inf
[infdel]
vfolder.inf

;теперь данный блок указывает не каталог, в который копируются файлы,
;а каталог, из которого удаляются файлы, описанные в блоке
[DestinationDirs]
infdel = 17

[SourceDisksFiles]
vfolder.inf = 55

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

Создание ярлыка на файл с меню Пуск Это еще одна возможность, которой можно воспользоваться при помощи inf-файла. С помощью ключевого слова PROFILEITEMS можно определить блок inf-файла, с помощью которого описывается создаваемый в меню ПУСК ярлык. Давайте рассмотрим пример, с помощью которого создается ярлык на программу ВОССТАНОВЛЕНИЕ СИСТЕМЫ в меню ПУСК (СТАНДАРТНЫЕ/СЛУЖЕБНЫЕ).

Листинг 4.9. Создание ярлыка
[version]
Signature="$CHICAGO$"

[DefaultInstall]
ProfileItems=SRProfile

[SRProfile]
Name="Восстановление системы"
CmdLine=11,restore,rstrui.exe
SubDir="Стандартные\Служебные"
InfoTip="Это подсказка, отображаемая при наведении указателя на ярлык"
DisplayResource="%systemroot%\system32\restore\rstrui.exe",2048
ProfileItems=SRProfile

Блок для описания ярлыка в меню ПУСК может содержать в себе следующие ключевые слова.

  • Name — определяет название создаваемого в меню ПУСК ярлыка.
  • CmdLine — определяет путь к программе, для которой создается ярлык. Формат данного ключевого слова немного необычен: «числовой путь к стандартному каталогу, размещение файла, название файла».
  • SubDir — определяет расположение ярлыка в меню ПУСК. Если точнее, тогда данное ключевое слово определяет дальнейший путь к каталогу, который будет содержать ярлык на программу. Дальнейший путь добавляется к пути %systemdrive%\Documents and Settings\All Users\Главное меню\Программы.
  • WorkingDir — определяет рабочие каталоги для программы, на которую создается ярлык (как правило, это ключевое слово не указывается).
  • INFOTIP — определяет подсказку, отображаемую при наведении указателя на созданный в меню ПУСК ярлык.

Расширенные inf-файлы Расширенные inf-файлы отличаются от обычных одной строкой, которую нужно добавить в блок [VERSION]. Например, ниже приведен пример блока версии для расширенного inf-файла.

[Version]
Signature="$CHICAGO$"
AdvancedINF=2.5, "Эта строка будет выводится, если на компьютере не найдено библиотеки advpack.dll "

Также для работы с расширенными inf-файлами необходима библиотека advpack.dll, по умолчанию расположенная в каталоге %systemroot%. Если перед началом выполнения расширенного inf-файла система не найдет данной библиотеки, тогда она выведет сообщение, указанное в ключевом слове AdvancedINF после запятой. К тому же, как мы знаем, расширенные inf-файлы вызываются с помощью команды rundll32.exe ADVPACK.dll, LaunchINFSectionEx «имя файла», «имя раздела», «имя cab-файла», «флаг». Тогда как обычные inf-файлы вызываются с помощью команды rundll32.exe setupapi.dll, InstallHinfSection «раздел в файле для начала установки», «флаг», «путь и имя файла».

Запуск программ до и после установки Расширенные inf-файлы поддерживают такую возможность, как запуск команд перед или после установки inf-файла. При этом для указания блока, описывающего программы, запускаемые перед установкой inf-файла, используется ключевое слово RUNPRESETUPCOMMANDS. А для указания блока, описывающего программы, запускаемые после установки inf-файла, используется ключевое слово RUNPOSTSETUPCOMMANDS. Давайте посмотрим на пример использования этих ключевых слов.

Листинг 4.10. Запуск программ до и после установки inf-файла
[version]
Signature = $CHICAGO$
AdvancedINF=2.5, "Эта строка будет выводится, если на компьютере не найдено библиотеки advpack.dll "

[DefaultInstall]
RunPreSetupCommands=RunPre
RunPostSetupCommands=RunPost

[RunPre]
calc.exe
cmd.exe

[RunPost]
"rundll32.exe IEAKENG.dll, DoReboot"

Приведенный на листинге inf-файл перед своей установки вызывает калькулятор Windows, а потом вызывает стандартный командный интерпретатор Windows. После же свей установки он вызовет диалоговое окно с вопросом о перезагрузке компьютера. Конечно, диалоговое окно с вопросом о перезагрузке принадлежит Internet Explorer, но зато оно работает.

Вопрос о перезагрузке компьютера можно было вызвать и с помощью флагов вызова inf-файла, но в листинге мы специально использовали команды rundll32.

Не забывайте также, что данный inf-файл не выполнится после выбора команды УСТАНОВИТЬ из контекстного меню inf-файла. Для его установки придется воспользоваться командой RunDll32 advpack.dll, LaunchINFSection d:\1.inf, DefaultInstall. Где d:\1.inf соответствует пути к Inf-файлу и его названию.

Вывод сообщения перед установкой Также перед или после установки inf-файла можно вывести окно сообщения с произвольным текстом. Диалог сообщения, выводимый перед установкой, позволяет эту установку отменить. Он содержит в себе две кнопки ОК и ОТМЕНА. Если нажать на кнопку ОТМЕНА, тогда установка inf-файла будет отменена. Диалог сообщения, выводимый после установки, является информационным и содержит только одну кнопку — ОК.

Чтобы вывести диалоговое окно перед установкой, необходимо воспользоваться ключевым словом BEGINPROMPT (окно сообщения будет выведено до вызова программ, описанных ключевым словом RUNPRESETUPCOMMANDS), а чтобы вывести окно сообщения после установки, необходимо воспользоваться ключевым словом BEGINPROMPT. В листинге 4.11 приведен простой пример использования как окна сообщения, выводимого перед установкой, так и окна сообщения, выводимого после установки.

Листинг 4.11. Вывод окна с произвольным текстом
[version]
Signature = $CHICAGO$
AdvancedINF=2.5, "Эта строка будет выводится, если на компьютере не найдено библиотеки advpack.dll "

[DefaultInstall]
RunPreSetupCommands = RunPre
BeginPrompt=BeginText
EndPrompt=EndText

[RunPre]
cmd.exe

[BeginText]
Prompt="Это пример текста, который выведется перед установкой"
Title=""Это заголовок для сообщения, которое выведется перед установкой"

[EndText]
Prompt="Это пример текста, который выведется после установки"

Блок для описания сообщения, выводимого перед установкой inf-файла (в нашем случае BEGINTEXT) содержит в себе следующие ключевые слова.

  • PROMPT — определяет саму строку выводимого сообщения.
  • TITLE — определяет заголовок окна сообщения. Следует учитывать, что данный заголовок будет использоваться не только для окна сообщения, отображаемого перед установкой, но и для окна сообщения, отображаемого после установки.

Продолжение следует

Оригинал статьи: http://www.onestyle.com.ua/txt.php?u=169

В избранное