Роман Клименко - Недокументированные и малоизвестные возможности Windows XP
Глава 15
INF-файлы
Хотелось бы в этой главе описать некоторые возможности INF-файлов. Здесь не будет полностью рассмотрен язык INF-файлов и способы написания на нем сценариев, но тем не менее попробуем понять, как с помощью INF-файлов можно выполнять копирование и удаление файлов, создание и удаление параметров реестра, а также рассмотрим некоторые интересные возможности INF-файлов.
Основные сведения
INF-файлы предназначены для описания начального процесса установки новой программы или оборудования. Каждый INF-файл должен начинаться с заголовка. Этот заголовок определяет версию INF-файла, а также версию операционной системы, для которой этот INF-файл написан. От версии информационного файла (INF-файла) зависят те возможности, которые он поддерживает. Существует две версии INF-файлов — обычные и расширенные. В главе 1 уже рассматривались способы вызова обычных и расширенных INF-файлов. При этом расширенные INF-файлы поддерживают следующие новые возможности (это не все возможности, только основные): выполнение различных программ до или после выполнения INF-файла, архивирование изменяемых значений параметров реестра, а также вывод сообщений перед выполнением INF-файлов или после него.
ПРИМЕЧАНИЕ
Необходимость изучения INF-файлов во многом оправдана. Конечно, сейчас INF-файлы заменили пакетами установщика Windows и другими способами описания начальной установки программ. Тем не менее они обладают несколькими интересными возможностями, которые будут рассмотрены далее и которые довольно трудно выполнить без использования INF-файлов. С помощью INF-файлов можно также работать с реестром, даже когда возможность работы с программой regedit.exe и REG-файлами была отключена с помощью DWORD-параметра DisableRegistryTools, расположенного в ветви реестра HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciessystem. И не следует забывать, что INF-файлы могут использоваться системными процессами, то есть на их основе можно выполнить взлом операционной системы.
Обычные INF-файлы
Возможности обычных INF-файлов поддерживаются и расширенными, поэтому эти возможности будут рассмотрены первыми. Обычные INF-файлы начинаются со следующего заголовка:
[Version]
Signature="$WINDOWS NT$"
При этом после ключевого слова Signature идет описание версии операционной системы, которая будет поддерживать такие INF-файлы. Если после этого ключевого слова идет слово $WINDOWS NT$, то данный файл написан для операционных систем семейства NT и работать с ним в операционных системах семейства Windows 9x нельзя. Если же после ключевого слова идет слово $CHICAGO$, то данный INF-файл был написан для операционных систем семейства Windows 9x. При этом работать с этим файлом можно будет и в операционных системах семейства NT.
После заголовка должен идти начальный блок, с которого будет устанавливаться данный INF-файл. Стало традицией, что этот блок должен иметь название DefaultInstall. К тому же блок именно с таким заголовком ищет система при установке INF-файла с помощью команды Установить его контекстного меню. Если же предполагается, что создаваемый INF-файл не должен вызываться с помощью контекстного меню (а только с использованием команды rundll32.exe setupapi.dll, InstallHINFSection), то начальный блок можно указать любой.
В начальном блоке могут содержаться различные ключевые слова, указывающие на другие блоки INF-файла, с помощью которых выполняется работа с реестром и файловой системой Windows XP.
Создание ветвей реестра
Например, в начальном блоке может находиться ключевое слово AddReg, указывающее на блоки INF-файла, описывающие добавляемые или изменяемые параметры и ветви реестра. Рассмотрим формат этого ключевого слова на примере листинга 15.1. В данном листинге приведен пример редактирования DWORD-параметра AutoRun из ветви реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesCdrom. В примере этому параметру присваивается значение 0, то есть отключается возможность автоматического запуска дисков.
Листинг 15.1. Редактирование параметров реестра[version]
Signature="$CHICAGO$"
[DefaultInstall]
AddReg=AR_off
[AR_off]
HKLM, "SYSTEMCurrentControlSetServicesCdrom","Autorun",0x10001,0
Как видно из листинга 15.1, в блоке для редактирования ветвей реестра (в ключевом слове AddReg можно через запятую указать несколько блоков для редактирования ветвей реестра) описываются сами ветви реестра и параметры, в них изменяемые. Формат их описания таков:
«корневой раздел», «ветвь реестра», «параметр», «флаг типа параметра», «новое значение параметра»
Рассмотрим этот формат подробнее.
■ Корневой раздел — здесь содержится ключевое слово, определяющее корневой раздел реестра, в котором расположен изменяемый параметр. Возможны следующие значения:
• HKCU — определяет корневой раздел HKEY_CURRENT_USER;
• HKLM — HKEY_LOCAL_MACHINE;
• HKU — HKEY_USERS;
• HKCR — HKEY_CLASSES_ROOT;
• HKCC — HKEY_CURRENT_CONFIG.
■ Ветвь реестра — определяет остальной путь к ветви реестра, включающей в себя изменяемый параметр. Если ветвь реестра содержит пробелы, то ее нужно взять в кавычки.
■ Параметр — указывает изменяемый параметр реестра. Если название параметра содержит пробелы, то его нужно взять в кавычки. Если название параметра указано не будет, то будет изменено значение параметра (По умолчанию).
■ Флаг — определяет как тип параметра, так и в некоторых случаях дополнительные сведения о том, что же нужно делать с аналогичным параметром в реестре, если он уже существует. Флаг представляет собой битовую маску. Рассмотрим некоторые состояния этой битовой маски.
• 0x00000000 — тип REG_SZ.
• 0x00000001 — REG_BINARY.
• 0x00010000 — REG_MULTI_SZ.
• 0x00020000 — REG_EXPAND_SZ.
• 0x00010001 — DWORD.
• 0x00020001 — NONE.
• 0x00000002 — если изменяемый параметр уже существует в реестре, то изменять его значение запрещено.
• 0x00000004 — удалить раздел или параметр из реестра. Иными словами, в INF-файле можно обойтись даже без специального ключевого слова для описания блока удаления, который будет рассмотрен далее. Удалить параметр можно и с помощью блока редактирования параметров.
• 0x00000008 — только для параметров REG_MULTI_SZ-типа. Указанное в строке редактирования параметра значение не заменяет существующее значение, а добавляется к существующему значению параметра.
• 0x00000010 — создать раздел, но игнорировать создание или редактирование указанного в строке параметра. Вообще, если посмотреть на возможные значения данного флага, то можно подумать, что Microsoft намеревается создать целый язык сценария с условными значениями и переменными для INF-файла. Иначе зачем вообще нужны два только что рассмотренных значения флага, если аналогичные действия можно выполнить и без их использования?
• 0x00000020 — изменить значение параметра, только если данный параметр уже существует в реестре.
■ Значение параметра — определяет новое значение параметра.
Теперь рассмотрим пример INF-файла, добавляющего в реестр значения параметров. Пример, отображенный в листинге 15.2, является частью стандартного INF-файла Windows XP, предназначенного для настройки отключения автозапуска дисков для разных типов приводов компакт-дисков. В примере параметру Autorun присваивается значение только в том случае, если он не существует в реестре. А значение параметра AutoRunAlwaysDisable, имеющего тип REG_MULTI_SZ, формируется в несколько приемов, чтобы обеспечить хранение значений параметра в разных строках.
Листинг 15.2. Пример использования флагов для редактирования параметров реестра[version]
Signature="$CHICAGO$"
[DefaultInstall]
AddReg=autorun_addreg
[autorun_addreg]
HKLM,"SystemCurrentControlSetServicescdrom","AutoRun",0x00010003,1
HKLM,"SystemCurrentControlSetServicescdrom","AutoRunAlwaysDisable", 0x00010008, "NEC MBR-7 "
HKLM,"SystemCurrentControlSetServicescdrom","AutoRunAlwaysDisable", 0x00010008, "NEC MBR-7.4 "
HKLM,"SystemCurrentControlSetServicescdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CHANGR DRM-1804X"
HKLM,"SystemCurrentControlSetServicescdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-6324X"
HKLM,"SystemCurrentControlSetServicescdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-624X "
HKLM,"SystemCurrentControlSetServicescdrom","AutoRunAlwaysDisable", 0x00010008, "TORiSAN CD-ROM CDR_C36"
Удаление ветвей реестра
Параметр или ветвь реестра можно не только добавить в реестр, но и удалить из него. Для этого применяется ключевое слово DelReg, указывающее на блок INF-файла, содержащий сведения о ветвях реестра и параметрах, которые нужно удалить. Несмотря на то, что флаг для редактирования параметров позволяет также и удалять параметры, для их удаления рекомендуется все-таки использовать ключевое слово, так как это более наглядно и позволяет легче понять принцип работы INF-файла.