Книга "Реестр Windows Vista. На 100%", Глава 1. Основные сведения о реестре, 1.3. Языки сценариев и реестр: INF-файлы.
Получить доступ к реестру можно не только при помощи различных редакторов реестра, но и при помощи языков сценариев Windows. Ниже мы с вами рассмотрим возможности по работе с реестром нескольких стандартных языков сценариев и компонентов операционной системы. Мы с вами не будем вдаваться в тонкости программирования на описываемых сценариях — единственное, что нас интересует, это их возможности работы с реестром. Файлы с расширением .inf представляют собой обычные текстовые файлы, которые могут содержать в себе специальные команды по работе с реестром, файловой системой, службами и другими компонентам операционной системы Windows Vista. Как правило, используются inf-файлы для установки дополнительного оборудования или программного обеспечения. Данные файлы не являются нововведением операционной системы Windows Vista — они были доступны еще в Windows 95. Начиная же с Windows 98 возможности inf-файлов были существенно расширены дополнительной библиотекой advapi32.dll. При этом сценарии, которые используют в своей работе библиотеку advapi32.dll (ее можно подключать к сценарию или нет), называются расширенными inf-файлами. С тех пор функциональность inf-файлов практически не менялась. С помощью inf-файлов вы можете выполнить следующие действия с реестром: добавление, удаление и редактирование параметров реестра, а также редактирование состояния отдельных битов параметра. Для этого используются отдельные ключевые слова AddReg, DelReg, BitReg. Основной синтаксис inf-файлов Перед тем, как описывать ключевые слова, с помощью которых можно работать с реестром, давайте все-таки вкратце остановимся на основном синтаксисе обычного inf-файла (то есть, не расширенного). Прежде всего обратите внимание на листинг 2.02. Данный листинг содержит в себе шаблон самого простого inf-файла.
Листинг 2.01. Структура inf-файла [version] Signature="$CHICAGO$"
[«Раздел файла»] «команда» «команда» … Файлы .inf состоят из ключевых слов, разделов и команд. Системные и пользовательские разделы Разделы могут быть пользовательские, названия которых могут быть любыми, и системными, названия которых строго определены. Например, в файле, приведенном на листинге 2.01, системными являются разделы Version и DefaultInstall. Version Раздел version является обязательной частью любого inf-файла. Как минимум, он должен содержать в себе одно ключевое слово — Signature. С помощью этого ключевого слова определяется версия операционной системы, для которой был создан данный inf-файл. Например, если inf-файл создан для операционных систем семейства Windows 9x (как правило, такие inf-файлы поддерживают все операционные системы Windows, независимо от семейства, к которому они принадлежат), тогда значением данного ключевого слова должна быть строка $CHICAGO$. Если же файл создан для операционных систем семейства Windows NT, тогда значением данного ключевого слова должна быть строка $Windows NT$. DefaultInstall Еще одним обязательным разделом inf-файла является раздел DefaultInstall. Данный раздел является первым разделом inf-файла, который начнет обрабатывать операционная система. Именно в этом разделе должны описываться все необходимые ключевые слова. Ключевые слова
Как правило, ключевые слова представляют собой специальные строки, которые указывают на пользовательские разделы inf-файла. В зависимости от названия ключевого слова, содержимое соответствующего пользовательского раздела может трактоваться по разному. Способы запуска inf-файлов Основной синтаксис inf-файлов мы с вами разобрали. Но перед тем, как начать описание специализированных ключевых слов, следует дополнительно рассмотреть способ запуска inf-файлов. Запуск при помощи оболочки Самым простым способом запуска inf-файла, является отображение его контекстного меню и выбор команды УСТАНОВИТЬ. После того, как вы это сделаете, запуститься программа InfDefaultInstall.exe. Программа InfDefaultInstall.exe является нововведением операционной системы Windows Vista. Данная программа является лишь оболочкой, которая запускает команду rundll32.exe setupapi,InstallHinfSection DefaultInstall 132 «путь к inf-файлу». Использование команды rundll32.exe Запустить inf-файл вы можете и самостоятельно — при помощи команды rundll32.exe setupapi,InstallHinfSection «начальный раздел» «флаги» «путь к inf-файлу». Именно эту команду использует программа InfDefaultInstall.exe. • Начальный раздел. Определяет раздел inf-файла, который содержит в себе ключевые слова. При использовании программы InfDefaultInstall.exe таким разделом всегда должен быть раздел DefaultInstall. Если же вы запускаете inf-файл при помощи команды rundll32.exe, вы самостоятельно можете указать начальный раздел. • Флаги. Флаги позволяют указать действия, которые произойдут после установки inf-файла. Существуют следующие флаги. o 128. После установки inf-файла компьютер перезагружать не нужно. o 129. После установки inf-файла выполнить перезагрузку компьютера. o 130. После установки inf-файла спросить у пользователя о перезагрузке компьютера. o 131. Если операционная система определила необходимость перезагрузки компьютера, выполнить ее. o 132. Если операционная система определила необходимость перезагрузки компьютера, спросить перед перезагрузкой у пользователя. • Путь к inf-файлу. Определяет путь к inf-файлу, который нужно установить, и его имя. Запуск расширенных inf-файлов Если же вы создали расширенный inf-файл, тогда стандартный способ установки inf-файлов вам не подойдет. Для установки расширенного inf-файла необходимо использовать команду rundll32.exe ADVPACK.dll, LaunchINFSectionEx «имя inf-файла», «начальный раздел», «имя cab-файла», «флаг». Такие части данной команды, как имя inf-файла и начальный раздел нам уже знакомы по команде rundll32.exe для установки обычных inf-файлов. Остальные же части команды мы рассмотрим ниже. • Имя cab-файла. При установке расширенного inf-файла можно использовать дополнительный cab-файл (хотя это и не обязательно), который содержал бы в себе все файлы, необходимые для работы устанавливаемого inf-файла (например, файлы, которые inf-файл копирует или перемещает). • Флаг. Флаг, указываемый в команде установки расширенного inf-файла, позволяет определить настройки инсталляции inf-файла. Например, флаг может содержать в себе следующие битовые маски.
o 4. Не отображать на экране промежуточные результаты установки расширенного inf-файла.
o 16. Выполнить перезагрузку оболочки Windows после установки расширенного inf-файла.
o 32. Выполнить резервное копирование данных перед установкой расширенного inf-файла.
o 64. Выполнить откат установленного ранее расширенного inf-файла (то есть, восстановить значения всех параметров реестра, которые были изменены соответствующим расширенным inf-файлом).
o 256. Не выполнять построение списка файлов во время установки расширенного inf-файла.
o 512. Не регистрировать ActiveX-объекты, пока расширенный inf-файл не будет полностью установлен.
Под твиками пользователи операционной системы Windows понимают различные приемы изменения параметров реестра, с помощью которых активируется какая-то дополнительная функция Windows, либо в лучшую сторону изменяется поведение самой операционной системы. Как было сказано выше, единственным способом установки расширенного inf-файла является использование команды rundll32.exe. Однако, если вы довольно часто работаете с такими inf-файлами, это может показаться вам неудобным. В этом случае можно создать в контекстном меню inf-файлов дополнительную команду для их установки в расширенном режиме. Для этого достаточно присвоить параметру (по умолчанию) ветви реестра HKCR\inffile\shell\extended install\command значение rundll32.exe ADVPACK.dll, LaunchINFSectionEx %1, DefaultInstall. После этого в контекстном меню inf-файлов появится новая команда extended install. Например, вышеописанный твик можно выполнить при помощи простого reg-файла, приведенного на листинге 2.03.
Листинг 2.03. Добавляет команду для запуска установки расширенных inf-файлов
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\inffile\shell\extended install\command] ="rundll32.exe ADVPACK.dll, LaunchINFSectionEx %1, DefaultInstall" Изменение параметров реестра Для редактирования параметров и разделов реестра при помощи inf-файлов применяется ключевое слово AddReg. Данное ключевое слово указывает на разделы inf-файла (если необходимо указать несколько разделов, просто перечислите их через запятую), которые содержат в себе описание редактируемых параметров реестра. Разделы, которые описываются данным ключевым словом, обрабатываются последовательно. Данные разделы имеют следующий формат (листинг 2.04). Листинг 2.04. Формат разделов, содержащих редактируемые параметры реестра [имя раздела] «Корневой раздел первого параметра», «ветвь», «параметр», «флаг типа параметра», «новое значение» «Корневой раздел второго параметра», «ветвь», «параметр», «флаг типа параметра», «новое значение» … Каждая строка, которая находится в разделе, может состоять из нескольких частей, отделенных друг от друга запятыми. Давайте подробнее опишем части строк, которые могут создаваться в разделах, определяемых ключевым словом AddReg. Корневой раздел Данная часть строки определяет корневой раздел реестра, в котором расположен изменяемый параметр. При этом вместо названия корневых разделов нужно указывать уже знакомые нам по программе reg.exe обозначения HKCU, HKLM, HKU, HKCR (заменяет корневой раздел HKEY_CLASSES_ROOT), HKCC (заменяет корневой раздел HKEY_CURRENT_CONFIG), HKR (заменяет ветвь реестра HKLM\SYSTEM\CurrentControlSet\Control\Class\{GUID-класса устройства}\«номер устройства» и используется при установке нового оборудования). Ветвь реестра Данная часть строки определяет остальной путь к ветви реестра, в которой расположен изменяемый параметр. Если ветвь реестра содержит пробелы, ее нужно взять в кавычки. Параметр Данная часть строки содержит название параметра, значение которого изменяется. Если название параметра содержит пробелы, его нужно взять в кавычки. В том случае, если вам нужно изменить значение параметра (по умолчанию) данной ветви реестра, просто ничего не указывайте в данной части строки, оставив ее пустой. Флаг типа параметра В первую очередь с помощью флага типа параметра указывается тип изменяемого параметра. Кроме того, с помощью данного флага можно указать дополнительные сведения об изменении параметра. Флаг типа параметра представляет собой битовую маску, назначение битов которой описано ниже. • 0х00000000. Указывает на то, что параметр имеет тип REG_SZ. Данный флаг используется по умолчанию, если никакой другой флаг не указан. • 0х00000001. Указывает на то, что параметр имеет тип REG_BINARY. • 0х00010000. Указывает на то, что параметр имеет тип REG_MULTI_SZ. • 0х00020000. Указывает на то, что параметр имеет тип REG_EXPAND_SZ. • 0х00010001. Указывает на то, что параметр имеет тип REG_DWORD. • 0х00020001. Указывает на то, что параметр имеет тип NONE. • 0х00000002. Запретить изменение значения указанного в строке параметра, если оказывается, что он уже существует в реестре. • 0х00000004. Вместо того, чтобы изменить значение параметра, выполнить его удаление из реестра. • 0х00000008. Если изменяемый параметр уже существует в реестре и значение, которое в нем находится, отлично от значения, которое ему нужно присвоить, тогда вместо того, чтобы заменить его значение на указанное в строке, новое значение добавляется к уже существующему в параметре значению. Данный флаг может использоваться только для параметров типа REG_MULTI_SZ. • 0х00000010. Вместо того, чтобы создать или изменить значение параметра, выполнить создание только указанного раздела реестра. • 0х00000020. Изменить значение параметра разрешено только в том случае, если данный параметр уже существует в реестре. Значение параметра Данная часть строки содержит новое значение изменяемого или добавляемого параметра. Подводим итоги Давайте обобщим все возможности, которые предоставляет нам ключевое слово AddReg. Чтобы создать параметр или отредактировать его значение, нужно воспользоваться строкой вида «корневой раздел», «ветвь реестра», «название параметра», «флаг», «значение параметра». Добавляя к флагу соответствующие битовые маски, также можно определить, будет ли выполняться изменение значения параметра, если он уже присутствует в реестре (или если он отсутствует в реестре). Чтобы добавить строку к значению параметра REG_MULTI_SZ типа, нужно воспользоваться строкой вида «корневой раздел», «ветвь реестра», «название параметра»,0x00010008, «значение параметра». Чтобы удалить параметр из реестра, нужно воспользоваться строкой вида «корневой раздел», «ветвь реестра», «название параметра»,0x00000004. Чтобы создать ветвь реестра, нужно воспользоваться строкой вида «корневой раздел», «ветвь реестра»,,0х00000010.
Пример
В качестве примера давайте рассмотрим простой inf-файл (листинг 2.05), который отключает возможность автоматического запуска вставленных в привод компакт-дисков. Для этого он присваивает параметру REG_DWORD типа Autorun значение 0.
Кроме того, данный inf-файл также добавляет к значению параметра типа REG_MULTI_SZ AutoRunAlwaysDisable названия приводов, автоматический запуск компакт дисков на которых запрещен в любом случае.
Листинг 2.05. Отключение автозапуска для конкретных версий приводов
Несмотря на то, что удалить параметр реестра можно и с помощью ключевого слова AddReg, специально для этой операции также создано новое для нас ключевое слово DelReg. Как и рассмотренное нами ключевое слово AddReg, ключевое слово DelReg указывает на пользовательский раздел inf-файла. Только теперь раздел будет содержать сведения о ветви или параметре, которые нужно удалить из реестра. Формат строк данного раздела следующий: «корневой раздел реестра», «ветвь реестра», «параметр», «флаг операции удаления», «пример для удаления». Назначение таких частей строки, как корневой раздел, ветвь реестра и параметр нам уже известно по описанию ключевого слов AddReg. Остальные же части строки мы с вами сейчас рассмотрим. Флаг операции удаления Существуют следующие флаги операции удаления. • 0х00002000. Выполнить раздела реестра. • 0х00004000. Произвести указанные изменения в 32-разрядном реестре, а не в 64-разрядном. Данная битовая маска может применяться в 64-разрядных операционных системах. • 0х00018002. Выполнить удаление только строк параметра типа REG_MULTI_SZ, соответствующих части строки раздела пример для удаления. Пример для удаления Данная часть строки применяется только при удалении параметра типа REG_MULTI_SZ (битовая маска флага 0х00018002) и определяет часть значения параметра, которая будет исключена из параметра. Работа с битовой маской Уникальной возможностью стандартных inf-файлов является реализация возможности работы с отдельными битами значения параметра реестра. Для этого предназначено ключевое слово BitReg. Данное ключевое слово указывает на пользовательские разделы, которые могут содержать в себе строки следующего формата: «корневой раздел реестра», «ветвь реестра», «параметр», «флаг операции», «маска операции», «номер байта параметра». После знакомства с ключевыми словами AddReg и DelReg нам неизвестны только следующие части строк данного формата. Флаг операции С помощью флага операции можно определить то действие, которое мы собираемся выполнить над конкретными битами параметра — либо сбросить их, либо установить. Данный флаг может принимать следующие значения. • 0х00000000. Сбросить указанный бит. • 0х00000001. Установить указанный бит. • 0х00040000. Произвести указанные изменения в 32-разрядном реестре, а не в 64-разрядном. Данная битовая маска может применяться в 64-разрядных операционных системах. Маска операции Данная часть строки позволяет указать биты одного байта значения параметра (сразу можно редактировать только биты одного из байтов параметра), над которыми нужно произвести операцию, определенную флагом операции (сбросить или установить параметры). Маска операции должна состоять из 8 цифр — либо единиц, либо нулей. Все биты соответствующего байта параметра, на месте которых в маске операции указана единица, будут сброшены или установлены (в зависимости от значения флага операции). Номер байта в значении параметра Поскольку при помощи одной строки inf-файла можно отредактировать только биты одного из байтов значения параметра, данное поле указывает байт параметра, к которому будет применяться маска операции. Заметьте, что начало нумерации байтов значения параметра зависит от типа параметра. Если редактируется значение параметра типа REG_DWORD, самый старший (то есть, самый правый) байт данного параметра имеет номер 0. Если же редактируется значение параметра типа REG_BINARY, тогда самый младший байт значения параметра (самый левый) имеет номер 0.