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

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


Вот и закончился очередной опрос, результаты которого окажутся судьбоносными для нашего сайта и этой рассылки - "Содержимое какой из книг вы бы хотели прочитать в будущих статьях нашего сайта?". И что вы думаете? Абсолютное большинство посетителей наконец взялось за ум и проголосовало за книгу "Реестр Windows Vista. На 100%" =) Благодарим всех, кто отдал свои голоса за понравившуюся книгу - а тех, кто проголосовал за книгу "Реестр Windows Vista. На 100%" еще и награждаем первой частью этой книги.
В конец записи

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

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

Хотелось бы в этом разделе описать некоторые возможности inf-файлов. Мы не будем полностью описывать язык inf-файлов и способы написания на нем скриптов, но, тем не менее, попробуем понять, как с помощью inf-файлов можно выполнять такие задачи, как копирование и удаление файлов, создание и удаление параметров реестра, а также рассмотрим некоторые интересные возможности inf-файлов.

Основы

Inf- файлы предназначены для описания начального процесса установки новой программы или оборудования. Каждый inf-файл должен начинать с заголовка. Этот заголовок определяет версию inf-файла, а также версию операционной системы, для которой этот inf-файл написан. От версии информационного файла (inf-файла) зависят те возможности, которые он поддерживает. Существует две версии inf-файлов — обычные и расширенные inf-файлы. В первой главе книги мы уже рассматривали способы вызова обычных и расширенных inf-файлов. При этом расширенные inf-файлы поддерживают следующие новые возможности (это не все возможности, только основные): выполнение различных программ до или после выполнения inf-файла, архивирование изменяемых значений параметров реестра, а также вывод сообщений перед или после выполнения Inf-файлов.

Довольно интересна необходимость знания inf-файлов. Конечно, сейчас inf-файлы заменили пакетами установщика Windows и другими способами описания начальной установки программ. Тем не менее, inf-файлы обладают несколькими интересными возможностями, которые мы рассмотрим далее и которые довольно трудно выполнить без использования inf-файлов. Также с помощью inf-файлов можно работать с реестром, даже когда возможность работы с программой regedit.exe и reg-файлами была отключена с помощью параметра DWORD-типа DisableRegistryTools, расположенного в ветви реестра HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\system. И не следует забывать, что inf-файлы могут использовать системными процессами, то есть, на их основе можно выполнить взлом операционной системы.

Обычные inf-файлы Возможности обычных inf-файлов поддерживаются и расширенными, поэтому эти возможности мы рассмотрим первыми. Обычные inf-файлы начинаются со следующего заголовка.

[Version]
Signature="$WINDOWS NT$"

При этом после ключевого слова Signature идет описание версии операционной системы, которая будет поддерживать такие INF-файлы. Если после этого ключевого слова идет слово $WINDOWS NT$, тогда данный файл написан для операционных систем семейства NT, и работать с данным файлом в операционных системах семейства Windows 9x нельзя. Если же после ключевого слова идет слово $CHICAGO$, тогда данный inf-файл был написан для операционных систем семейства Windows 9x. При этом, работать с этим файлом будет можно и в операционных системах семейства NT.

После заголовка должен идти начальный блок, с которого будет выполняться установка данного inf-файла. Стало традицией, что данный блок должен называться DefaultInstall. К тому же, именно блок с таким заголовком ищет система при установке inf-файла с помощью команды УСТАНОВИТЬ из контекстного меню inf-файла. Если же предполагается, что создаваемый inf-файл не должен вызываться с помощью контекстного меню (а только с помощью команды rundll32.exe setupapi.dll, InstallHinfSection), тогда начальный блок можно указать любой.

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

Создание ветвей реестра Например, в начальном блоке может находиться ключевое слово AddReg, указывающее на блоки inf-файла, описывающие добавляемые или измененяемые параметры и ветви реестра. Формат этого ключевого слова давайте рассмотрим в примере листинга 4.1. В данном листинге приведен пример редактирования параметра DWORD-типа AUTORUN из ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES\CDROM. В примере листинга мы присваиваем этому параметру значение 0, то есть, отключаем возможность автоматического запуска дисков.

Листинг 4.1. Редактирование параметров реестра
[version]
Signature="$CHICAGO$"

[DefaultInstall]
AddReg=AR_off

[AR_off]
HKLM, "SYSTEM\CurrentControlSet\Services\Cdrom","Autorun",0x10001,0

Как видно на листинге 4.1, в блоке для редактирования ветвей реестра (в ключевом слове AddReg можно через запятую указать несколько блоков для редактирования ветвей реестра) описываются сами ветви реестра и параметры, в них изменяемые. Формат их описания таков: «корневой раздел», «ветвь реестра», «параметр», «флаг типа параметра», «новое значение параметра». Давайте рассмотрим этот формат подробней.

Корневой раздел Здесь содержится ключевое слово, определяющее корневой раздел реестра, в котором расположен изменяемый параметр. Возможны следующие значения этого корневого раздела.

  • HKCU — определяет корневой раздел HKEY_CURRENT_USER.
  • HKLM — определяет корневой раздел HKEY_LOCAL_MACHINE.
  • HKU — определяет корневой раздел HKEY_ USERS.
  • HKCR — определяет корневой раздел HKEY_CLASSES_ROOT.
  • HKCC — определяет корневой раздел HKEY_CURRENT_CONFIG.

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

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

Флаг Флаг определяет как тип параметра, так и, в некоторых случаях, дополнительные сведения о том, что же нужно делать с аналогичным параметром в реестре, если он уже существует. Флаг представляет собой битовую маску. Давайте рассмотрим некоторые состояния этой битовой маски.

  • 0х00000000 — тип REG_SZ.
  • 0х00000001 — тип REG_BINARY.
  • 0х00010000 — тип REG_MULTI_SZ.
  • 0х00020000 — тип REG_EXPAND_SZ.
  • 0х00010001 — тип DWORD.
  • 0х00020001 — тип NONE.
  • 0х00000002 — если изменяемый параметр уже существует в реестре, тогда изменять его значение запрещено.
  • 0х00000004 — удалить подраздел или параметр из реестра. То есть, в inf-файле можно обойтись даже без специального ключевого слова для описания блока удаления, который мы рассмотрим ниже. Удалить параметр можно и с помощью блока редактирования параметров.
  • 0х00000008 — только для параметров типа REG_MULTI_SZ. Указанное в строке редактирования параметра значение не заменяет существующее значение, а добавляется к существующему значению параметра.
  • 0х00000010 — создать подраздел, но игнорировать создание или редактирование указанного в строке параметра. Вообще, если посмотреть на возможные значения данного флага, можно подумать, что Microsoft намеревается создать целый язык скрипта с условными значениями и переменными для inf-файла, иначе зачем вообще нужны два только что рассмотренных значения флага, если аналогичные действия можно выполнить и без их использования.
  • 0х00000020 — изменить значение параметра, только если данный параметр уже существует в реестре.

Значение параметра Определяет новое значение параметра.

А теперь давайте рассмотрим пример inf-файла, добавляющего в реестр значения параметров. Пример, отображенный на листинге 4.2, является частью стандартного inf-файла Windows XP, предназначенного для настройки отключения автозапуска дисков для разных типов CD-ROM приводов. В нем параметру AUTORUN присваивается значение только в том случае, если данный параметр не существует в реестре. А значение параметра AUTORUNALWAYSDISABLE, имеющего тип REG_MULTI_SZ, формируется в несколько приемов, чтобы обеспечить хранение значений параметра в разных строках.

Листинг 4.2. Пример использования флагов для редактирования параметров реестра
[version]
Signature="$CHICAGO$"

[DefaultInstall]
AddReg=autorun_addreg

[autorun_addreg]
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRun",0x00010003,1
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "NEC     MBR-7   "
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "NEC     MBR-7.4 "
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CHANGR DRM-1804X"
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-6324X"
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-624X "
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "TORiSAN CD-ROM CDR_C36"

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

Давайте рассмотрим пример удаления параметра. В этом примере мы удаляем из реестра ветвь HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES, чтобы отключить все пользовательские расшаренные папки. При этом в начале нужно удалить все расположенные в данной ветви подразделы, чтобы можно было удалить саму ветвь реестра. Как правило, ветвь для хранения сведений о расшаренных папках содержит только один подраздел — SECURITY.

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

Листинг 4.3. Удаление сведений о расшаренных папках
[version]
Signature="$CHICAGO$"

[DefaultInstall]
DelReg=shared_del

[shared_del]
HKLM,"SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES\Security"
HKLM,"SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES"

Как можно заметить, содержимое блока для удаления ветвей и параметров реестра похоже на содержимое блока редактирования ветвей и параметров реестра. Строка для удаления ветви или параметра имеет следующий формат: «корневой раздел», «ветвь реестра», «параметр», «флаг операции удаления», «пример для удаления».

  • Корневой раздел. Указывает на корневой раздел, в котором расположен удаляемый параметр или ветвь реестра.
  • Ветвь реестра. Определяет удаляемую ветвь реестра, или ветвь, в которой хранится удаляемый параметр.
  • Параметр. Определяет название удаляемого параметра. Если параметр отсутствует, тогда предполагается, что удаляться будет конечный подраздел указанной ветви реестра.
  • Флаг операции удаления. Может принимать следующие значения. 0х00002000 — удалить весь конечный подраздел указанной ветви. 0х00004000 — произвести указанные изменения в 32-разрядном реестре. 0х00018002 — удаляет из параметра все строки, соответствующие примеру для удаления.
  • Пример для удаления. Определяет строку значения параметра типа REG_MULTI_SZ все соответствия которой должны быть удалены из параметра.

Редактирование отдельных битов значения параметра Это довольно интересная и, можно сказать, уникальная возможность, с помощью которой можно изменить отдельный бит параметра, не изменяя другие его биты. Для реализации этой возможности применяется ключевое слово BITREG, указывающее на блок inf-файла, содержащий сведения об изменяемых битах параметров. При этом блок inf-файла должен содержать в себе строки следующего формата: «корневой раздел», «ветвь реестра», «параметр», «флаг операции», «маска операции», «номер байта параметра».

  • Корневой раздел. Был рассмотрен ранее.
  • Ветвь реестра. Был рассмотрен ранее.
  • Параметр. Был рассмотрен ранее.
  • Флаг операции. Может принимать следующие значения. 0х00000000 — сбросить указанный бит. 0х00000001 — установить указанный бит. 0х00040000 — выполнить эти операции в 32-разрядном реестре.
  • Маска операции. Определяет биты в значении параметра, которые должны быть модифицированы. То есть, маска должна состоять из 8 ноликов или единиц (определяют 8 бит одного байта значения параметра). Все биты, на месте которых в маске указана единица, будут модифицироваться в зависимости с флагом операции. Маска указывается в виде битовой маски.
  • Номер байта значения параметр. Указывает на байт значения параметра, к которому будет применяться маска и биты которого будут модифицироваться. При этом номер байта зависит от типа параметра. Для параметров типа DWORD самый правый байт имеет номер 0, а для параметров типа REG_BINARY номер 0 имеет самый младший байт.

Для примера давайте попробуем изменить отдельные биты параметра ATTRIBUTES контекстного меню КОРЗИНЫ. После данной модификации в контекстном меню КОРЗИНЫ будут команды ПЕРЕИМЕНОВАТЬ, СВОЙСТВА и УДАЛИТЬ. Такие команды, как КОПИРОВАТЬ, ВЫРЕЗАТЬ, ВСТАВИТЬ будут удалены из контекстного меню КОРЗИНЫ (если они там присутствуют). В результате применения приведенного inf-файла значение параметра ATTRIBUTES DWORD-типа станет равным 0х????0070.

Заметьте, что сначала желательно сбрасывать биты отдельного байта, а потом уже устанавливать другие биты этого байта.

Если в ветви реестра HKEY_CLASSES_ROOT\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\SHELLFOLDER присутствует параметр DWORD-типа CALLFORATTRIBUTES, тогда ему будет присвоено значение 0 (если в ветви данного параметра не существует, тогда параметр создан не будет).

Листинг 4.4. Пример модификации отдельных битов параметра.
[version]
Signature="$CHICAGO$"

[DefaultInstall]
BitReg=RecicleBit
AddReg=CallAttrOff

[CallAttrOff]
HKCR,"CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder",CallForAttributes,0x00010021,0

[RecicleBit]
HKCR,"CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder",Attributes,0,0xff,0
HKCR,"CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder",Attributes,0,0xff,1
HKCR,"CLSID\{645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder",Attributes,1,0x70,0

Создание службы Еще одной оригинальной возможностью, которой обладают inf-файлы, является упрощенное создание служб на компьютере. Для этого применяется не только ключевое слово ADDSERVICE, но и специальный стандартный блок inf-файла [DEFAULTINSTALL.SERVICES] (то есть, к блоку по умолчанию добавляется строка .SERVICES). при этом следует сказать, что этот блок не заменяет стандартный, а дополняет его. То есть, если в inf-файле будет два блока, тогда сначала выполняться ключевые слова блока [DEFAULTINSTALL], а потом блока [DEFAULTINSTALL.SERVICES].

Так как мы с вами уже знаем, как хранятся сведения о службе в реестре, для нас будет не сложно понять пример создания службы. Поэтому давайте сначала посмотрим на листинг 4.5. Этот листинг содержит в себе часть inf-файла, регистрирующего в системе службу ВОССТАНОВЛЕНИЕ СИСТЕМЫ.

Листинг 4.5. Пример регистрации службы Восстановление системы
[version]
Signature="$CHICAGO$"

[DefaultInstall.Services]
AddService=sr,,SRFlt_service,SRFlt_event

[SRFlt_service]
DisplayName    = "Имя службы"
ServiceType    = 2    
StartType      = 0    
ErrorControl   = 1    
ServiceBinary  = %12%\sr.sys
LoadOrderGroup = "FSFilter System Recovery"

[SRFlt_event]
AddReg=SRFlt_event_addreg
DelReg=SRFlt_event_delreg

Ключевое слово ADDSERVICE, отличие от большинства других ключевых слов, содержит в себе не только название блока inf-файла, описывающего службу, но и некоторые другие сведения. Формат этого ключевого слова следующий: «название службы»,«тип службы», «блок inf-файла»

Название службы Определяет название подраздела в ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES, в который будет заноситься информация о службе. Как мы знаем, название этого подраздела является и названием службы.

Тип службы Определяет, является ли данная служба самостоятельной. Может принимать значения 0x01, 0x2 и 0x3.

Блок inf-файла Определяет один или несколько блоков inf-файла (в этом случае они пишутся через запятую), в которых определены сведения о службе. На примере листинга первый блок содержит информацию о службе, а второй блок регистрирует возможность записи в системные журналы Windows (оснастка ПРОСМОТР СОБЫТИЙ).

А теперь давайте рассмотрим блок inf-файла для регистрации службы. Он может включать в себя следующие ключевые слова.

  • DisplayName — имя службы, отображаемое в оснастке services.msc.
  • Description — описание службы, отображаемое в оснастке services.msc.
  • ServiceType — тип службы. Значение этого параметра соответствует уже рассмотренному нами значению параметра реестра TYPE (в главе о реестре).
  • StartType — режим запуска службы. Значение этого параметра соответствует уже рассмотренному нами значению параметра реестра START (в главе о реестре).
  • ErrorControl — действие при возникновении ошибки при запуске службы. Значение этого параметра соответствует уже рассмотренному нами значению параметра реестра ERRORCONTROL (в главе о реестре).
  • ServiceBinary — путь и имя файла службы. Значение данного ключевого слова заносится в уже рассмотренный нами параметр IMAGEPATH реестра.
  • Dependencies — определяет службы, необходимые для работы данной службы. Эти значения заносятся в параметр реестра DEPENDONSERVICE.
  • LoadOrderGroup — определяет группу, к которой принадлежит данная служба. Эти значения заносятся в параметр реестра GROUP.

Удаление службы Для удаления службы предназначено ключевое слово DELSERVICE, которое также указывается в блоке, названным в формате [«БЛОК УДАЛЕНИЯ».SERVICES]. Удаление службы выполняется намного проще — просто указывается имя службы, которую нужно удалить (название подраздела реестра, в котором служба описана).

Листинг 4.6. Пример удаления службы
[version]
Signature="$CHICAGO$"

[Uninstall.Services]
DelService=sr

В листинге ключевое слово DELSERVICE указано в блоке [UNINSTALL.SERVICES], так как именно блок [UNINSTALL] используется в примере при вызове inf-файла для удаления службы с помощью команды rundll32.

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

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

В избранное