Листинг 15.6. Пример удаления службы
Хотелось бы в этой главе описать некоторые возможности INF-файлов. Здесь не будет полностью рассмотрен язык INF-файлов и способы написания на нем сценариев, но тем не менее попробуем понять, как с помощью INF-файлов можно выполнять копирование и удаление файлов, создание и удаление параметров реестра, а также рассмотрим некоторые интересные возможности INF-файлов.
Выше были рассмотрены лишь основы работы с INF-файлами. Кроме приведенных ключевых слов, INF-файлы поддерживают многие другие, но если начать их описывать, то понадобится отдельная книга. Закончим на этом рассказ о ключевых словах INF-файлов. Теперь рассмотрим несколько примеров не совсем стандартного использования INF-файлов. Без описания этих примеров рассказ о возможностях INF-файлов был бы не полон.
Удаление файлов напоминает их копирование, поэтому рассмотрим этот процесс лишь поверхностно — в подсказках к листингу 15.8. Для определения блоков, содержащих описания удаляемых файлов, используется ключевое слово DelFiles.
Листинг 15.8. Удаление файлов
Signature = $CHICAGO$
;данный раздел будет вызываться с помощьюкоманды rundll32
DelFiles = INFdel
;мы будем удалять файл vfolder.INF
;теперь данный блок указывает не каталог, в который копируются файлы,
;а каталог, из которого удаляются файлы, описанные в блоке
INFdel = 17
vfolder.INF = 55
55 = "имя диска", , 1
Всем привет!
Сегодня я хочу, поговорит о полезности файла « autorun.inf
». Файл «autorun.inf» используют для быстрого запуска программ, игр и других приложений с CD/DVD диска или USB-накопителей.
Как это работает?
Каждый раз, когда вы вставляете в комп флешку, дискетку, CD/DVD диск, операционная система Windows в первую очередь будет просматривать в самом корне файл «autorun.inf». Если «autorun.inf» присутствует, тогда операционная система прочитывает и запускает весь код, который был прописан в этом фале.
Итак, « autorun.inf
» – это текстовый файл с расширением (.inf), в котором содержатся некоторые команды для автозапуска различных приложений.
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-файла, а также версию операционной системы, для которой этот INF-файл написан. От версии информационного файла (INF-файла) зависят те возможности, которые он поддерживает. Существует две версии INF-файлов — обычные и расширенные. В главе 1 уже рассматривались способы вызова обычных и расширенных INF-файлов. При этом расширенные INF-файлы поддерживают следующие новые возможности (это не все возможности, только основные): выполнение различных программ до или после выполнения INF-файла, архивирование изменяемых значений параметров реестра, а также вывод сообщений перед выполнением INF-файлов или после него.
Копирование в INF-файлах реализовано наиболее сложно. Для его выполнения необходимо не только использовать ключевое слово CopyFiles, но и, кроме того, создать три отдельных блока INF-файла: DestinationDirs, SourceDisksFiles и SourceDisksNames. Рассмотрим простой пример.
Листинг 15.7. Копирование файлов
Signature = $CHICAGO$
CopyFiles = INFcopy
INFcopy = 17
1.INF = 55
55 = "имя диска", , 1
«блок описания копируемых файлов»=«числовой номер каталога»,«дальнейший путь к каталогу»
Числовой номер каталога представляет собой число, идентифицирующее одну из системных папок. Рассмотрим некоторые из этих чисел, а также каталоги, которые они определяют.
? 10 — %systemroot%.
? 11 — %systemroot%\system32.
? 17 — %systemroot%\Inf.
? 54 — %systemdrive%.
? 1 — говорит о том, что необходимо использовать абсолютный путь, который должен быть записан после числового номера (через запятую). Абсолютным называется путь, который не начинается с числового номера каталога. Например, числовым является путь d:\test\1.
«название копируемого файла»=«уникальный идентификатор диска, на котором находится этот файл»
«уникальный идентификатор диска»=«имя диска»,«метка диска»,«серийный номер диска»
Возможности обычных INF-файлов поддерживаются и расширенными, поэтому эти возможности будут рассмотрены первыми. Обычные INF-файлы начинаются со следующего заголовка:
При этом после ключевого слова Signature идет описание версии операционной системы, которая будет поддерживать такие INF-файлы. Если после этого ключевого слова идет слово $WINDOWS NT$, то данный файл написан для операционных систем семейства NT и работать с ним в операционных системах семейства Windows 9x нельзя. Если же после ключевого слова идет слово $CHICAGO$, то данный INF-файл был написан для операционных систем семейства Windows 9x. При этом работать с этим файлом можно будет и в операционных системах семейства NT.
После заголовка должен идти начальный блок, с которого будет устанавливаться данный INF-файл. Стало традицией, что этот блок должен иметь название DefaultInstall. К тому же блок именно с таким заголовком ищет система при установке INF-файла с помощью команды Установить его контекстного меню. Если же предполагается, что создаваемый INF-файл не должен вызываться с помощью контекстного меню (а только с использованием команды rundll32.exe setupapi.dll, InstallHINFSection), то начальный блок можно указать любой.
В начальном блоке могут содержаться различные ключевые слова, указывающие на другие блоки INF-файла, с помощью которых выполняется работа с реестром и файловой системой Windows XP.
Так как вам уже известно, как хранятся сведения о службе в реестре, то будет не сложно понять пример создания службы. По этой причине сначала посмотрим на листинг 15.5, который содержит часть INF-файла, регистрирующего в системе службу Восстановление системы.
Листинг 15.5. Пример регистрации службы Восстановление системы
DisplayName = "Имяслужбы"
ServiceType = 2
StartType = 0
ErrorControl = 1
ServiceBinary = %12%\sr.sys
LoadOrderGroup = "FSFilter System Recovery"
Ключевое слово AddService, в отличие от большинства других, содержит не только название блока INFфайла, описывающего службу, но и некоторые другие сведения. Формат этого ключевого слова следующий:
«название службы»,«тип службы», «блок INF-файла»
? Название службы — определяет название раздела в ветви системного реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services, в который будет заноситься информация о службе. Как известно, название этого раздела является и названием службы.
? Тип службы — указывает, является ли данная служба самостоятельной. Может принимать значения 0x01, 0x2 и 0x3.
? Блок INF-файла — определяет один или несколько блоков INFфайла (в этом случае они пишутся через запятую), в которых определены сведения о службе. В листинге 15.5 первый блок содержит информацию о службе, а второй блок регистрирует возможность записи в системные журналы Windows (оснастка Просмотр событий).
Теперь рассмотрим блок INFфайла для регистрации службы. Он может включать в себя следующие ключевые слова.
? DisplayName — имя службы, отображаемое в оснастке services.msc.
? Description — описание службы, отображаемое в оснастке services.msc.
? ServiceType — тип службы. Значение этого параметра соответствует уже рассмотренному значению параметра реестра Type (см. часть 2).
? StartType — режим запуска службы. Значение этого параметра соответствует уже рассмотренному значению параметра реестра Start.
? ErrorControl — действие при возникновении ошибки при запуске службы. Значение этого параметра соответствует уже рассмотренному значению параметра реестра ErrorControl.
? ServiceBinary — путь и имя файла службы. Значение данного ключевого слова заносится в уже рассмотренный параметр ImagePath реестра.
? Dependencies — определяет службы, необходимые для работы данной службы. Эти значения заносятся в параметр реестра DependOnService.
? LoadOrderGroup — определяет группу, к которой принадлежит данная служба. Эти значения заносятся в параметр реестра Group.

Цикл подошел к концу. В этой статье я расскажу об еще нескольких способах инсталляции драйверов
(в прошлый раз мы рассмотрели инсталляцию с помощью простого изменения
реесстра (вручную или с использованием .reg – файла) и с использованием программы Monitor из состава Driver Studio) – с помощью inf – файла и с использованием возможностей SCM – менеджера. А последний пункт вплотную подводит нас к написанию собственной консольной проги для тестирования возможностей нашего драйвера.
Ну а в качестве маленького бонуса я расскажу, как обещала, о правке солюшенов для визуальной студии, для того, чтобы ты смог писать в ней драйвера
(а правка нужна для корректной подсветки синтаксиса кода и компиляции). Приступим.
Инсталляция драйвера (продолжение)
В данной статье мы рассмотрим еще два способа инсталляции драйвера: с помощью inf – файла и с использованием возможностей SCM – менеджера. Начнем с первого.
Для того, чтобы мы могли корректно установить наш драйвер с использованием виндошного Мастера Установка, нам необходимо создать inf – файл с правильной структурой. Пример оного вместе с комментариями читай ниже:
Перейдем к SCM – менеджеру. S CM – менеджер – это сервис Windows NT, предоставляющий удобную возможность работать с драйвером без использования Мастера Установки – с помощью функций, вызываемых из пользовательского приложения. Для того, чтобы начать работать с SCM – мененджером, необходимо вызвать функцию OpenSCManager, а для завершения работы – CloseServiceHandle. Но, к сожалению, работать с помощью SCM – менеджера можно не со всеми типами драйверов.
Ну а теперь мы приступим к написанию своего консольного приложения, тестирующего драйвер и использующего SCM – менеджер.
Написание консольного приложения для тестирования драйвера
Во-первых, нужно создать файл Ioctl.h. Его содержимое
(которое, надо думать, тебе знакомо по файлу Driver.h :)):
#ifndef _IOCTL_H_05703_ BASHBD_1UIWQ1_4763_ 1NJKDH256_801_
#define _IOCTL_H_05703_ BASHBD_1UIWQ1_4763_ 1NJKDH256_801_
#define IOCTL_PRINT_DEBUG_ MESS CTL_CODE( \FILE_DEVICE_UNKNOWN, 0x701, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_CHANGE_IRQL CTL_CODE(\
FILE_DEVICE_UNKNOWN, 0x702, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MAKE_SYSTEM_CRASH CTL_CODE(\
FILE_DEVICE_UNKNOWN, 0x703, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_TOUCH_PORT_378H CTL_CODE(\
FILE_DEVICE_UNKNOWN, 0x704, METHOD_BUFFERED, FILE_ANY_ACCESS)
Вот содержимое файла resource.h:
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_ READONLY_SYMBOLS
#define _APS_NEXT_ RESOURCE_VALUE 101
#define _APS_NEXT_ COMMAND_VALUE 40001
#define _APS_NEXT_ CONTROL_VALUE 1000
#define _APS_NEXT_ SYMED_VALUE 101
#endif
#endif
//Microsoft Developer Studio generated resource script.
//
#include “resource.h”
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include “afxres.h”
/////////////////////////////////////////////////////////////////////////////
// Russian resources
#ifndef _MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#endif // !_MAC
#endif // Russian resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U. K.) resources
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE MOVEABLE PURE
BEGIN
“resource.h\0”
END
2 TEXTINCLUDE MOVEABLE PURE
BEGIN
“#include “”afxres.h””\r\n”
“\0”
END
3 TEXTINCLUDE MOVEABLE PURE
BEGIN
“\r\n”
“\0”
END
#endif // APSTUDIO_INVOKED
#endif // English (U. K.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
Ну а теперь головной .cpp – шник программы с комментариями:
Консольное приложение для тестирования драйвера Primer.sys
Заголовочные файлы, которые необходимы данной проге:
#include <windows.h>
#include <stdio.h>
#include <winioctl.h>
#include <tchar.h>
Имя объекта драйвера и местоположение загружаемого файла
#define DRIVERNAME _T(“Primer”)
//#define DRIVERBINARY _T(“C:\\Primer\\Primer.sys”)
//#define DRIVERBINARY _T(“C:\\Ex\\objchk_w2k\\i386\\Primer.sys”)
#define DRIVERBINARY _T(“C:\\Ex\\tester\\Primer.sys”)
CloseServiceHandle (Service);
return ret;
}
CloseServiceHandle (Service);
return ret;
}
#define SCM_SERVICE ; //
вводим элемент условной компиляции, при помощи
которого можно отключать использование SCM установки драйвера
в тексте данного приложения.
Основная функция тестирующего приложения.
Здесь диагностике ошибочных ситуаций уделено очень мало внимания.
В реальных приложениях так делать
делаем попытку установки драйвера
res = InstallDriver(scm, DRIVERNAME, DRIVERBINARY);
if(!res) //
неудача, но, быть может, драйвер уже установлен ?
printf(“Cannot install service”);
Вот и все, компиль и тестируй. Напоминаю еще раз: запусти вьювер дебаг-информации из Monitor
(например) и посмотри все дебаговые сообщения драйвера!
Правка солюшенов визуальной студии
Теперь я расскажу тебе, как исправить солюшены визуальной студии, чтобы ты смог писать драйвера в ней. Тем не менее, код драйвера, откомпилированный с помощью DDK
(а лучше всего использовать именно его),
считается эталонным. Ниже я привожу текст файла Primer.sln
(Visual Studio 7) (для компиляции не-WDM драйвера):
Ну вот и все. Желаю удачи и интересных находок в плавании по увлекательному океану драйверов и железа! Да не облысеют твои пятки!
Диалог установки компонентов Windows
идентификатор»=«библиотека для работы компонентов», «функция библиотеки», «INF-файл, описывающий компоненты»,«отображение компонентов»,«номер»
Следующие элементы являются наиболее важными.
? INF-файл, описывающий компоненты — описывает разделы, отображаемые в диалоге Установка и удаление программ. Именно такой INF-файл сейчас и будет создан.
? Отображение компонентов — если в данном поле будет стоять слово HIDE, то данный компонент не будет отображаться в диалоге дополнительных компонентов Windows. Чтобы компонент отображался в диалоге, необходимо чтобы это поле было пустым.
? Например, чтобы добавить в диалог компонентов возможность удаления игр, необходимо в строке, начинающейся с идентификатора games, удалить строку HIDE.
На рис. 15.2 показан пример содержимого этого файла.
Рис. 15.2 . Содержимое файла sysoc. INF
Другой возможностью является добавление в данный диалог своих компонентов. Для этого необходимо сначала создать INF-файл, описывающий новые компоненты, а потом создать в файле sysoc.inf ссылку на созданный INF-файл. Сначала посмотрим на простой пример INF-файла. В этом примере сразу создается корневой раздел, отображаемый непосредственно в диалоге установки компонентов Windows, два вложенных в этот раздел подраздела, а также еще два раздела, которые и будут устанавливать или удалять компоненты. В нашем случае эти разделы будут просто скрывать (или отображать, в зависимости от состояния флажка) версию Windows на Рабочем столе, а также скрывать (или отображать) название значка Мой компьютер.
Листинг 15.13. Создание разделов в диалоге компонентов
OptionDesc = Мои настройки
Tip = Варианты настройки интерфейса и конфигурации
IconIndex = 0
OptionDesc = Интерфейс Windows
Tip = Варианты настройки интерфейса
IconIndex = 4
Parent = TopMain
OptionDesc = Конфигурация Windows
Tip = Варианты настройки конфигурации компьютера
IconIndex = 16
Parent = TopMain
OptionDesc = Скрыть название моего компьютера
Tip = Скрывает название значка Мой компьютер
IconIndex = 0
Parent = Interface
AddReg = AddHTM
Uninstall = HTMUn
Modes = 0,1,2,3
OptionDesc = Отобразить версию на Рабочем столе
Tip = отображает версию операционной системы на Рабочем столе пользователя
Parent = Interface
Modes = 0,1,2,3
HKCU, "Control Panel\Desktop", PaintDesktopVersion, 0x00010001, 1
DelReg = HTMDel
HKCU, "Control Panel\Desktop", PaintDesktopVersion, 0x00010001, 0
Блок описания раздела установки компонента содержит следующие ключевые слова.
? OptionDesc — определяет название раздела, отображаемого в диалоге Установка компонентов Windows.
? Tip — указывает подсказку для раздела, отображаемого в нижней части диалога Установка компонентов Windows.
? Icon Index — определяет индекс значка, отображаемого напротив данного раздела в диалоге Установка компонентов Windows. Например, идентификатор 0 определяет значок компьютера, идентификатор 2 — монитора, 14 — принтера.
? Parent — указывает название блока INF-файла, описывающего раздел, который будет родителем для нашего раздела в диалоге установки компонентов Windows. Если данное ключевое слово отсутствует, то наш раздел будет отображаться непосредственно в диалоге установки конфигурации Windows.
? Uninstall — определяет блок INF-файла, вызываемый для данного компонента при установке созданного раздела (устанавливать можно только разделы, входящие непосредственно в список диалога установки компонентов (корневые), а не отдельно разделы, вложенные в корневой), если флажок напротив данного компонента будет снят.
В блоке установки компонента можно также пользоваться такими стандартными ключевыми словами, как AddReg, BitReg, DelReg, CopyFiles и т.д. Все блоки, описанные в этих ключевых словах, будут выполняться при установке флажка напротив соответствующего компонента.
В строке также указывается название библиотеки и функция из этой библиотеки, которая будет устанавливать наши компоненты. Как правило, нет никакой разницы между различными функциями различных библиотек. Главное, чтобы они умели работать с диалогом установки компонентов. Поэтому была выбрана первая попавшаяся в файле sysoc.inf библиотека и функция для нее.
На рис. 15.3 показан результат добавления компонентов.
Рис. 15.3. Создание разделов диалога
INF-файл для логического диска
Еще одной возможностью, которую предоставляют INF-файлы, является добавление в контекстное меню логических дисков своих команд, а также изменение значка логического диска. Для этого необходимо создать специальный файл, который должен называться autorun.inf. Созданный INF-файл необходимо поместить в корень логического диска. Рассмотрим пример создания файла autorun.inf.
Листинг 15.14. Пример создания файла autorun.inf
icon = E:\images\fotoo\Art_galery\p.BMP
shell = open
shell\RunPh\command = photoshop.exe
shell\RunPh = Запустить photoshop
? shell = open — добавляет в параметр (По ум олчанию) раздела shell строку open. Эта строка говорит о том, что по умолчанию при двойном щелчке на диске он должен открываться.
? Shell\RunPh = Запустить photoshop — добавляет в параметр (По умолчанию) раздела RunPh строку Запустить photoshop. Эта строка определяет название команды в контекстном меню нашего диска.
? Shell\RunPh\command = photoshop.exe — добавляет в параметр (По умолчанию) раздела command строку photoshop.exe. Эта строка определяет команду, которая будет выполняться при выборе из контекстного меню нашего диска соответствующей команды.
Как можно заметить, с помощью INF-файлов можно выполнить довольно много интересного. При этом рассмотренные возможности являются только каплей в море. Например, с помощью INF-файлов можно выполнить такие действия, как запуск или остановка служб, назначение прав на доступ к файлам, архивирование реестра и многое другое. Кроме того, INF-файлы постоянно усовершенствуются и еще неизвестно, что с их помощью можно будет выполнить завтра.
Хотелось бы в этой главе описать некоторые возможности INF-файлов. Здесь не будет полностью рассмотрен язык INF-файлов и способы написания на нем сценариев, но тем не менее попробуем понять, как с помощью INF-файлов можно выполнять копирование и удаление файлов, создание и удаление параметров реестра, а также рассмотрим некоторые интересные возможности INF-файлов.
Запуск программ до и после установки
Листинг 15.10. Запуск программ до и после установки INF-файла
Signature = $CHICAGO$
AdvancedINF=2.5,"Эта строка будет выводиться, если на компьютере не найдено библиотеки advpack.dll"
"rundll32.exe IEAKENG.dll, DoReboot"
Приведенный в листинге 15.10 INF-файл перед своей установкой вызывает Калькулятор, а потом — стандартный командный интерпретатор Windows. После своей установки он вызовет диалоговое окно с вопросом о перезагрузке компьютера. Конечно, это окно принадлежит Internet Explorer, но зато оно работает.
Вопрос о перезагрузке компьютера можно было вызвать и с помощью флагов вызова INF-файла, но в листинге специально были использованы команды rundll32.exe.
Не забывайте также, что данный INF-файл не выполнится после выбора команды Установить контекстного меню INF-файла. Для его установки придется воспользоваться командой RunDll32 advpack.dll, LaunchINFSection d:\1. INF, DefaultInstall. Здесь d:\1. INF соответствует пути к INF-файлу и его названию.
Удаление ветвей реестра
Параметр или ветвь реестра можно не только добавить в реестр, но и удалить из него. Для этого применяется ключевое слово DelReg, указывающее на блок INF-файла, содержащий сведения о ветвях реестра и параметрах, которые нужно удалить. Несмотря на то, что флаг для редактирования параметров позволяет также и удалять параметры, для их удаления рекомендуется все-таки использовать ключевое слово, так как это более наглядно и позволяет легче понять принцип работы INF-файла.
Вообще-то можно удалять и ветви реестра, хранящие другие разделы, но лучше перестраховаться. На памяти у автора были случаи, когда ветвь реестра не удалялась из-за того, что в ней содержались вложенные разделы.
Листинг 15.3. Удаление сведений об общедоступных папках
Как можно заметить, содержимое блока для удаления ветвей и параметров реестра похоже на содержимое блока редактирования ветвей и параметров реестра. Строка для удаления ветви или параметра имеет следующий формат:
«корневой раздел», «ветвь реестра», «параметр», «флаг операции удаления», «пример для удаления»
? Корневой раздел — указывает на корневой раздел, в котором расположен удаляемый параметр или ветвь реестра.
? Ветвь реестра — определяет удаляемую ветвь реестра или ветвь, в которой хранится удаляемый параметр.
? Параметр — определяет название удаляемого параметра. Если параметр отсутствует, то предполагается, что удаляться будет конечный раздел указанной ветви реестра.
? Флаг операции удаления — может принимать следующие значения:
• 0x00002000 — удалить весь конечный раздел указанной ветви;
• 0x00004000 — произвести указанные изменения в 32-разрядном реестре;
• 0x00018002 — удаляет из параметра все строки, соответствующие примеру для удаления.
? Пример для удаления — определяет строку значения параметра, имеющего REG_MULTI_SZ-тип, все соответствия которой должны быть удалены из параметра.
Как создать файл «autorun. inf».
Чтобы создать загрузочный файл «autorun.inf», сделайте такие действия:
1. Откройте . ( Для тех, кто не знает, где найти Блокнот: => => =>
).
2. В Блокноте впишите стандартный код
– этот параметр указывает, какой файл нужно запускать при подключении диска или флешки
– этот параметр служит для отображения иконки (маленькая картинка, логотип) при просмотре дисков через «Мой компьютер».

3. Сохраните в блокноте этот файл как «autorun.inf» в корне флэш или диска.
Если файл и иконку разместить в какую-то папку, например «», тогда в файле autorun нужно указать к ним путь.
Это будет выглядеть следующим образом:
Давайте посмотрим пример, как я использовал «autorun.inf» для DWD-диска. Моей задачей было сделать автоматический запуск программы с красивой иконкой.
Приступим:
1. Я создал файл «autorun.inf» с таким кодом:
2. Все файлы, которые я подготовил для диска вместе с файлом «autorun.inf» я записываю на диск через программу «NERO».
файл «autorun.inf», WPI.exe, icon.ico должны находиться в корне диска.

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

Если зайти и посмотреть на вид диска через «Мой компьютер», можно увидеть красивую иконку, которая тоже загружается автоматически, благодаря параметру «».
Кстати, если вы хотите создать красивые иконки ico
, вы можете прочитать об этом тут
.
Дополнительные возможности файла «autorun.inf».
Запуск
PDF документа и HTML-страницы.
При помощи загрузочного файла «autorun.inf» можно запускать не только приложение «exe», но и файлы PDF или документы HTML-страницы.
Для этого в созданном файле «», пропишите такой код:
Теперь таким же образом, как вы создавали файл «», создайте файл «», и впишите следующий код:
Есть другой вариант с использованием команды :
Еще одна возможность в авторане, в меню автозапуска можно отобразить текст запуска. Для этого следует использовать команду.
Это выглядит вот так:
Если ваши глаза устали видеть надпись и вы желаете ее поменять, то это можно сделать при помощи параметра . Пропишите в файле такой код:
Конечно, изменить на флэшке надписи «Съемный диск» можно и без использования файла Autorun.inf, но это работает только в Windows XP. Думаю, вам эта информация пригодится.
Достаточно нажать правой кнопкой мыши на флэшку и в открывшемся окне выбрать . Пишите любое название и THE END.
Создание ярлыка файл в меню Пуск
Это еще одна возможность, которой можно воспользоваться благодаря INF-файлу. С помощью ключевого слова ProfileItems можно определить блок INF файла, в котором описывается создаваемый в меню Пуск ярлык. Рассмотрим пример, с помощью которого создается ярлык программы Восстановление системы в меню Пуск (Стандартные?Служебные).
Листинг 15.9. Создание ярлыка
InfoTip="Это подсказка, отображаемая при наведении указателя на ярлык"
Блок для описания ярлыка в меню Пуск может содержать следующие ключевые слова.
? Name — определяет название создаваемого в меню Пуск ярлыка.
? CmdLine — указывает путь к программе, для которой создается ярлык. Формат данного ключевого слова немного необычен: «числовой путь к стандартному каталогу, размещение файла, название файла».
? WorkingDir — указывает рабочие каталоги для программы, на которую создается ярлык (как правило, это ключевое слово не указывается).
? InfoTip — определяет подсказку, отображаемую при наведении указателя на созданный в меню Пуск ярлык.
Создание ветвей реестра
Например, в начальном блоке может находиться ключевое слово AddReg, указывающее на блоки INF-файла, описывающие добавляемые или изменяемые параметры и ветви реестра. Рассмотрим формат этого ключевого слова на примере листинга 15.1. В данном листинге приведен пример редактирования DWORD-параметра AutoRun из ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom. В примере этому параметру присваивается значение 0, то есть отключается возможность автоматического запуска дисков.
Листинг 15.1. Редактирование параметров реестра
Как видно из листинга 15.1, в блоке для редактирования ветвей реестра (в ключевом слове AddReg можно через запятую указать несколько блоков для редактирования ветвей реестра) описываются сами ветви реестра и параметры, в них изменяемые. Формат их описания таков:
«корневой раздел», «ветвь реестра», «параметр», «флаг типа параметра», «новое значение параметра»
Рассмотрим этот формат подробнее.
? Корневой раздел — здесь содержится ключевое слово, определяющее корневой раздел реестра, в котором расположен изменяемый параметр. Возможны следующие значения:
• HKLM — HKEY_LOCAL_MACHINE;
• HKCR — HKEY_CLASSES_ROOT;
• HKCC — HKEY_CURRENT_CONFIG.
? Ветвь реестра — определяет остальной путь к ветви реестра, включающей в себя изменяемый параметр. Если ветвь реестра содержит пробелы, то ее нужно взять в кавычки.
? Параметр — указывает изменяемый параметр реестра. Если название параметра содержит пробелы, то его нужно взять в кавычки. Если название параметра указано не будет, то будет изменено значение параметра (По умолчанию).
? Флаг — определяет как тип параметра, так и в некоторых случаях дополнительные сведения о том, что же нужно делать с аналогичным параметром в реестре, если он уже существует. Флаг представляет собой битовую маску. Рассмотрим некоторые состояния этой битовой маски.
• 0x00000000 — тип REG_SZ.
• 0x00000001 — REG_BINARY.
• 0x00010000 — REG_MULTI_SZ.
• 0x00020000 — REG_EXPAND_SZ.
• 0x00010001 — DWORD.
• 0x00000002 — если изменяемый параметр уже существует в реестре, то изменять его значение запрещено.
• 0x00000004 — удалить раздел или параметр из реестра. Иными словами, в INF-файле можно обойтись даже без специального ключевого слова для описания блока удаления, который будет рассмотрен далее. Удалить параметр можно и с помощью блока редактирования параметров.
• 0x00000008 — только для параметров REG_MULTI_SZ-типа. Указанное в строке редактирования параметра значение не заменяет существующее значение, а добавляется к существующему значению параметра.
• 0x00000010 — создать раздел, но игнорировать создание или редактирование указанного в строке параметра. Вообще, если посмотреть на возможные значения данного флага, то можно подумать, что Microsoft намеревается создать целый язык сценария с условными значениями и переменными для INF-файла. Иначе зачем вообще нужны два только что рассмотренных значения флага, если аналогичные действия можно выполнить и без их использования?
• 0x00000020 — изменить значение параметра, только если данный параметр уже существует в реестре.
? Значение параметра — определяет новое значение параметра.
Теперь рассмотрим пример INF-файла, добавляющего в реестр значения параметров. Пример, отображенный в листинге 15.2, является частью стандартного INF-файла Windows XP, предназначенного для настройки отключения автозапуска дисков для разных типов приводов компакт-дисков. В примере параметру Autorun присваивается значение только в том случае, если он не существует в реестре. А значение параметра AutoRunAlwaysDisable, имеющего тип REG_MULTI_SZ, формируется в несколько приемов, чтобы обеспечить хранение значений параметра в разных строках.
Листинг 15.2. Пример использования флагов для редактирования параметров реестра
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"
Редактирование отдельных битов значения параметра
Это довольно интересная и, можно сказать, уникальная возможность, с помощью которой можно изменить отдельный бит параметра, не изменяя другие его биты. Для реализации этой возможности применяется ключевое слово BitReg, указывающее на блок INF-файла, содержащий сведения об изменяемых битах параметров. При этом блок INF-файла должен включать в себя строки следующего формата:
«корневой раздел», «ветвь реестра», «параметр», «флаг операции», «маска операции», «номер байта параметра»
? Корневой раздел, ветвь реестра и параметр были рассмотрены ранее.
? Флаг операции — может принимать следующие значения:
• 0x00000000 — сбросить указанный бит;
• 0x00000001 — установить указанный бит;
• 0x00040000 — выполнить эти операции в 32-разрядном реестре.
? Маска операции — определяет биты в значении параметра, которые должны быть модифицированы. Другими словами, маска должна состоять из восьми нулей или единиц (определяют 8 бит одного байта значения параметра). Все биты, на месте которых в маске указана единица, будут модифицироваться в зависимости от флага операции. Маска указывается в виде битовой маски.
? Номер байта значения параметр — указывает на байт значения параметра, к которому будет применяться маска и биты которого будут модифицироваться. При этом номер байта зависит от типа параметра. Для параметров DWORD-типа самый старший байт имеет номер 0, а для параметров REG_BINARY-типа номер 0 имеет самый младший байт.
Для примера попробуем изменить отдельные биты параметра Attributes контекстного меню Корзины. После данной модификации в контекстном меню Корзины будут команды Переименовать, Свойства и Удалить. Такие команды, как Копировать, Вырезать, Вставить, будут удалены из контекстного меню Корзины (если они там присутствуют). В результате применения приведенного INF-файла значение DWORD-параметра Attributes станет равным 0x????0070.
Заметьте, что сначала желательно сбрасывать биты отдельного байта, а потом уже устанавливать другие биты этого байта.
Если в ветви реестра HKEY_CLASSES_ROOT\CLSID\645FF040-5081-101B-9F08-00AA002F954E}\ShellFolder присутствует параметр, имеющий DWORD-тип, CallForAttributes, то ему будет присвоено значение 0 (если в ветви данного параметра не существует, то он и не будет создан).
Листинг 15.4. Пример модификации отдельных битов параметра
Работа с диалогом Установка и удаление программ
Одной из интересных возможностей INF-файлов является возможность их использования как для добавления команды в диалог Установка и удаление программ, так и для выполнения процесса деинсталляции при помощи диалога Установка и удаление программ. Рассмотрим простой пример использования INF-файлов для создания так называемого зацикленного элемента диалога Установка и удаление программ, который применяется для включения и отключения возможности автоматического запуска дисков. Принцип работы приведенного ниже сценария прост. При первом своем вызове он копирует себя в папку %systemroot%\INF, отключает автоматический запуск дисков, а также добавляет возможность включения автоматического запуска дисков в диалог Установка и удаление программ. После удаления данного INF-файла с помощью диалога Установка и удаление программ происходит включение автоматического запуска дисков, а также создание в диалоге Установка и удаление программ новой строки, с помощью которой можно опять отключить автоматический запуск диска. Другими словами, создается постоянный цикл. Конечно, пример с изменением значения одного параметра довольно спорен, ведь намного проще было бы добавить свой флажок в один из стандартных диалогов Windows, поддерживающих добавление в свои списки новых элементов. Но если необходимо при установке параметра также выполнять какие-либо команды или модифицировать сразу несколько параметров (например, создать несколько разновидностей настройки оболочки Windows, а потом переходить между ними), то данный способ использования INF-файлов может быть незаменим (рис. 15.1).
Рис. 15.1. Создание команды в диалоге Установка и удаление программ
Листинг 15.12. Создание цикла в диалоге Установка и удаление программ
Signature = $CHICAGO$
AddReg = AutoRunOff, InstallInf
CopyFiles = INFcopy
;Ниже мы используем переменную %PATH% для указания изменяемой ветви реестра.
;Переменная – это специальная последовательность символов, которая при
;установке INF-файла будет преобразовываться в строку, определенную для нее
;INF-файла). Использование переменных позволяет улучшить читабельность
;INF-файлов большого размера, а также предоставляет разработчику возможность
;цетрализованного хранения всех информационных и других строчек программы.
;Иными словами, вместо того чтобы искать необходимую для изменения строку
HKLM, %PATH%, AutoRun, 0x00010001, 0
;Добавляем строку в диалог Установка\удаление программ. В первой главе
;мы кратко рассматривали формат этого диалога.
HKLM, %DISPLAY% autorunOnOff,,,
HKLM, %DISPLAY% autorunOnOff, DisplayName,,%NAME_ON%
HKLM, %DISPLAY% autorunOnOff, UninstallString,,\"rundll32 setupapi, InstallHINFSection DefaultUninstall 132 %17%\primer.INF"
AddReg = AutoRunOn
HKLM, %PATH%, AutoRun, 0x00010001, 1
HKLM, %DISPLAY% autorunOnOff, DisplayName,,%NAME_OFF%
HKLM, %DISPLAY% autorunOnOff, UninstallString,,\"rundll32 setupapi, InstallHINFSection DefaultInstall 132 %17%\primer.INF"
INFcopy = 17
primer.INF = 55
55 = %DISKNAME%, , 1
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-624X "
HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "TORiSAN CD-ROM CDR_C36"
NAME_ON = “Восстановить автоматический запуск дисков” «корневой раздел», «ветвь реестра», «параметр», «флаг операции», «маска операции», «номер байта параметра»
NAME_OFF=”Отключить автоматический запуск дисков”
DISKNAME = “parad0x-des1Gn”
Вывод сообщения перед установкой
Перед установкой INF-файла или после нее можно вывести окно сообщения с произвольным текстом. Диалог сообщения, выводимый перед установкой, позволяет эту установку отменить. Он содержит две кнопки — OK и Отмена. Если нажать кнопку Отмена, то установка INF-файла будет отменена. Диалог сообщения, выводимый после установки, является информационным и имеет только одну кнопку — OK.
Чтобы вывести диалоговое окно перед установкой, необходимо воспользоваться ключевым словом BeginPrompt (окно сообщения будет выведено до вызова программ, описанных ключевым словом RunPreSetupCommands), а чтобы вывести окно сообщения после установки, нужно воспользоваться ключевым словом EndPrompt. В листинге 15.11 приведен простой пример использования как окна сообщения, выводимого перед установкой, так и окна сообщения, выводимого после установки. HKLM,"System\CurrentControlSet\Services\cdrom","AutoRunAlwaysDisable", 0x00010008, "PIONEER CD-ROM DRM-6324X"
Листинг 15.11. Вывод окна с произвольным текстом
Signature = $CHICAGO$
AdvancedINF=2.5,"Эта строка будет выводиться, если на компьютере не найдено библиотеки advpack.dll"
RunPreSetupCommands = RunPre
Prompt="Это пример текста, который выведется перед установкой"
Title="Это заголовок для сообщения, которое выведется перед установкой"
Prompt="Это пример текста, который выведется после установки"
Блок для описания сообщения, выводимого перед установкой INF-файла (в данном случае BeginText) содержит следующие ключевые слова.
? Prompt — определяет саму строку выводимого сообщения.
? Title — указывает заголовок окна сообщения. Следует учитывать, что данный заголовок будет использоваться не только для окна сообщения, отображаемого перед установкой, но и для окна сообщения, отображаемого после установки.




