|
||||
|
Часть 4Другие возможности Windows XP Глава 12Версии Windows Вот вы и прочитали значительную часть книги. Надеюсь, она вам понравилась и действительно оказалась полезной. Но перед тем, как ответить, поговорим еще о нескольких вопросах, которые не соответствуют общей теме книги, но все-таки могут быть вам интересны.
Для начала поговорим о разнообразии версий Windows XP. Действительно, ведь существует не только две версии Windows — Professional и Home Edition. Есть также версия TabletPC для ноутбуков, 64-битная версия Windows, Windows .NET Server, Windows .NET Advanced Server, Windows .NET Datacenter Server. Существует также MediaCenterPC. Согласитесь, если бы Microsoft делала все эти версии отдельно, то Билл Гейтс давно бы обанкротился. Видимо, так же думали и программисты Microsoft, ведь информация о том, к какой версии Windows принадлежит ваша операционная система, заложена в самой операционной системе. И это нельзя однозначно назвать словом «плохо» или «хорошо» — такова жизнь, ведь это способ выживания большой корпорации. По этой причине не будем упоминать автора операционной системы Windows (ведь, несмотря на то, что Windows постоянно ругают, это действительно качественная и отличная операционная система), а лучше поговорим о том, где эта информация находится.
Статические параметрыИнформация о текущей версии Windows находится в двух статических параметрах реестра и одном динамическом. Для начала поговорим о статических параметрах — они находятся в ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ProductOptions. Это параметры ProductType и ProductSuite. ■ ProductType — параметр REG_SZ-типа. Определяет само направление данной версии Windows: то ли она предназначена для рабочих компьютеров, то ли для серверов, то ли для контроллеров домена. В зависимости от назначения Windows параметр может принимать следующие значения: • WinNT — данная версия системы Windows является рабочей станцией (Windows XP Professional, Windows XP Home Edition); • LanmanNT — версия Windows является контроллером домена; • ServerNT — данная версия Windows является сервером.
■ ProductSuite — параметр REG_MULTI_SZ-типа. Определяет дополнительную градацию Windows и может принимать следующие значения: • Blade — определяет версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • Personal — данная версия Windows принадлежит к линейке Home Editions; • DataCenter — определяет версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • EmbeddedNT — указывает разновидность Windows Embedded; • Terminal Server — определяет версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • Small Business (Restricted) — указывает версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • BackOffice — определяет версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • CommunicationServer — указывает версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • Enterprise — определяет версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • Small Business — указывает версию Windows для Windows 2003 Server, поэтому в книге не рассматривается; • ConcurrentLimit — определяет версию Windows для Windows 2003 Server, поэтому в книге не рассматривается.
Как видите, мир Windows разнообразен, а теперь подумаем, что можно сделать с приведенной здесь информацией. А сделать можно лишь одно — преобразовать одну версию Windows в другую, что в некоторых кругах еще называется форсажем. К сожалению, значение параметра ProductType Windows изменить не разрешит — это грубое нарушение лицензионных прав на вашу версию операционной системы (именно такое сообщение выводит система на «синем экране смерти» после изменения значения параметра ProductType). Но с некоторыми поправками можно изменить значение параметра ProductSuite.
Для примера преобразуем Windows XP Home Editions в Windows XP Professional. После этого вы получите такие новые функции, как возможность управления операционной системой с помощью mstsc (удаленное управление Рабочим столом), а также возможность установки операционной системы в качестве контроллера домена. Итак, если посмотреть на описанные выше значения для параметра ProductSuite, то можно заметить, что для Windows XP Home Editions это значение должно быть равно Personal. Это действительно так, но какое значение параметра должно быть для Windows XP Professional, ведь в приведенном описании этого значения нет? Все дело в том, что для Windows XP Professional значение параметра ProductSuite должно отсутствовать. Если вы уже попробовали изменить значение параметра ProductSuite, то, без сомнения, знаете, что операционная система не даст это сделать. Будет выведено сообщение о нарушении прав лицензионного продукта, после чего предыдущее значение вернется на свое место (оно вернется даже тогда, когда это значение явно не соответствует ни одному из приведенных выше значений). Поэтому простым способом редактирования параметра вы ничего не добьетесь. Вспомним о ветви реестра HKEY_LOCAL_MACHINE\SYSTEM все, что было написано в предыдущих частях книги. Итак, ветвь HKEY_LOCAL_MACHINE\SYSTEM хранит все сведения о драйверах и службах, зарегистрированных в системе. Она также хранит наиболее важную информацию о конфигурации операционной системы — если содержимое ветви HKEY_LOCAL_MACHINE\SYSTEM будет повреждено, то с большой долей вероятности вы не сможете загрузить операционную систему. Но ведь ошибки могут происходить не только по вине пользователя, но и по вине сторонних программ или самой операционной системы — это уже очень большая группа риска, а по теории вероятности, чем больше факторов риска, тем больше вероятность, что непредвиденное событие все-таки произойдет. Именно поэтому программистами Microsoft для страховки было решено продублировать всю критически важную информацию в нескольких ветвях реестра — так появились ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001, HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002 и т.д. Каждая из этих ветвей хранит конфигурацию системы в разные моменты времени, а ветвь реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet является лишь ссылкой на один из приведенных разделов реестра Windows. Теперь можно поставить еще один вопрос — если запрещено изменять параметр в ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet, то будет ли также запрещено изменять значение того же параметра в ветвях реестра HKEY_LOCAL_MACHINE\SYSTEM\ControlSetNNN? Оказывается, что значения параметров данных ветвей совершенно не защищены от изменений и Windows позволяет редактировать любые параметры, даже те, которые запрещено редактировать в разделе CurrentControlSet. Осталось вспомнить еще одно — как же Windows выбирает, какой из разделов ControlSetNNN нужно использовать при следующей загрузке компьютера. Для этого применяются значения параметров DWORD-типа из ветви системного реестра HKEY_LOCAL_MACHINE\SYSTEM\Select. Эта ветвь может содержать следующие параметры. ■ Default — именно этот параметр определяет, какая копия раздела ControlSet будет загружена при нормальной загрузке системы. Например, если его значение равно 2, то при обычной загрузке системы раздел CurrentControlSet будет ссылкой на содержимое раздела ControlSet002. ■ Current — определяет номер текущей копии раздела ControlSet, на которую ссылается раздел CurrentControlSet. ■ LastKnownGood — указывает номер копии раздела ControlSet, которая будет использоваться для построения содержимого раздела CurrentControlSet при использовании команды меню альтернативной загрузки Загрузка последней удачной конфигурации. ■ Failed — определяет раздел ControlSet, при предыдущей загрузке которого произошел какой-то сбой и загрузка была прервана. Когда известно, какой из разделов ControlSet для какой загрузки предназначен, возникает еще один вопрос — а значения какого из них правильнее и лучше всего редактировать? Здесь автор может посоветовать лишь исходя из своего опыта — лучше всего редактировать значения параметров из раздела, ссылка на который указана в значении параметра LastKnownGood, а потом пробовать запустить систему с помощью команды альтернативного окна загрузки Загрузка последней удачной конфигурации. Есть большая доля вероятности, что после редактирования параметров ваша операционная система не загрузится, и тогда вы просто сможете загрузить ее в обычном режиме. Причем все дело в том, что в большинстве случаев операционная система не загружается уже после регистрации в ней пользователя — требует ввода нового активационного ключа. Из предыдущих глав книги вы знаете, что, как только в системе регистрируется пользователь, ветвь реестра ControlSet, с помощью которой была выполнена загрузка, считается корректной и ссылка на нее указывается в качестве значения параметра LastKnownGood. Другими словами, если вы использовали ветвь ControlSet, описываемую в параметре Default, то при таком стечении обстоятельств окажется поврежденной как текущая конфигурация ControlSet, так и конфигурация, на которую будет ссылаться значение параметра LastKnownGood. Вот и все. Теперь вы можете попытаться изменить версию своей операционной системы, но хотелось бы еще раз напомнить, что это является незаконным предприятием и рассказ о нем приведен лишь в ознакомительных целях. Динамические параметрыТеперь поговорим еще о нескольких параметрах, которые влияют на версию системы Windows. Автор назвал их динамическими, потому что в отличие от параметра ProductSuite, который был рассмотрен выше, эти параметры очень часто проверяются системой — особенно их любят проверять пакеты MSI. К тому же, предположительно, эти параметры работают только в Windows XP Professional — в других операционных системах применяются другие параметры. Все приведенные ниже параметры находятся в ветви реестра HKEY_LOCAL_MACHINE\ SYSTEM\WPA, хранящей все ключи активации, доступные на компьютере. Но, кроме данных ключей, эта ветвь системного реестра может включать в себя два раздела — TabletPC и MediaCenter. В каждом из них может присутствовать DWORD-параметр Installed, значение которого определяет, является ли текущая операционная система данной разновидностью Windows. Например, если значение этого параметра ветви реестра TabletPC будет равно 1, то после перезагрузки вы сможете увидеть картину, подобную приведенной на рис. 12.1. Рис. 12.1. Изменение версии Windows
Если вам понравился предыдущий рисунок и вы уже попытались изменить соответствующий вашим желаниям параметр, то возможны два варианта. Первый состоит в том, что в вашей системе не существует разделов TabletPC и MediaCenter. В этом случае вы безболезненно сможете изменить понравившийся вам параметр, создав его. Это был простой вариант. В сложном варианте в вашей системе уже существует раздел, в котором вы хотите создать или изменить значение параметра Installed. В этом случае система не разрешит вам этого сделать и единственный выход из такого положения — это воспользоваться второй операционной системой либо комплектом, подобным загрузочному диску ERD Commander, версия редактора которого способна изменять значения любых параметров. Если у вас установлена вторая операционная система Windows, поддерживающая разделы NTFS, то можно загрузиться из нее, а потом в редакторе реестра просто загрузить куст SYSTEM первой операционной системы, параметр которой вы хотите изменить. Куст SYSTEM находится в ветви реестра %systemroot%\system32\config вашей первой операционной системы, и, чтобы его загрузить, необходимо выделить в редакторе реестра корневой раздел HKEY_LOCAL_MACHINE, а потом в меню Файл выбрать команду Загрузить куст. После этого перед вами появится диалог, в котором нужно выбрать куст SYSTEM, а в следующем диалоге присвоить ему произвольное имя — именно под таким именем вы сможете его увидеть как одну из ветвей корневого раздела HKEY_LOCAL_MACHINE.
Если при преобразовании Windows XP Home Edition в Windows XP Professional ваша операционная система получит дополнительные возможности (подключение с помощью удаленного Рабочего стола и т.д.), то при преобразовании Windows XP в Windows XP TabletPC изменится только логотип Windows. Хотя если вы захотите, то можете установить дополнительные программы, предназначенные для TabletPC. Все они находятся в папке «путь к дистрибутиву операционной системы»\CMPNENTS\TABLETPC\I386 вашего установочного диска (конечно, вместо TabletPC ваш установочный диск может поддерживать только Windows XP MediaCenter, файлы которого находятся в каталоге «путь к дистрибутиву операционной системы»\cmpnents\mediactr\i386). Все они находятся в упакованном виде, поэтому для их извлечения понадобится выполнить команду expand «путь к дистрибутиву операционной системы»\CMPNENTS\TABLETPC\I386\*.* «путь к папке, в которую нужно распаковать файлы (папка обязательно должна существовать)». После этого необходимо переименовать все расширения в соответствии с реальными расширениями, например, файл с расширением EX_ нужно переименовать в файл с расширением EXE.
Напоследок хотелось бы напомнить, что изменение версии Windows — это незаконная процедура, которая может лишить вас лицензионных прав на вашу операционную систему и перевести ее в разряд пиратских. К тому же есть большая вероятность невозможности последующей загрузки. В частности, после изменения версии Windows XP на Windows XP MediaCenter с большой долей вероятности система попросит у вас новый активационный ключ или переустановку системы. А при изменении версии Windows XP на Windows Embedded существует большая вероятность того, что система вообще не загрузится, не выводя больше никаких сообщений. Кстати, еще хотелось бы несколько слов сказать об установочном диске Windows XP. Вообще, установочные диски от Microsoft — это такая интересная вещь, в которой никогда точно не знаешь, что найдешь. Например, на установочном диске Windows XP Professional можно найти пакет установщика Windows для инсталляции программы MSN Messenger 6.1. Если вы часто пользуетесь программой Messenger (по умолчанию устанавливается Messenger версии 4.7), то можете попробовать воспользоваться MSN Messenger 6.1, вдруг понравится. Как и большинство файлов на установочном диске, пакет установки MSN Messenger 6.1 хранится в каталоге i386 в сжатом виде. Пакет установки MSN Messenger 6.1 имеет название MSNMSGS.MS_. Чтобы его распаковать перед установкой, нужно воспользоваться командой в следующем формате: expand "d:\MSNMSGS.MS_" "d:\1" Здесь d:\ определяет путь к каталогу, в котором расположен пакет установки MSN Messenger 6.1 (не забудьте перед распаковкой переместить пакет MSNMSGS.MS_ в другой каталог, так как, скорее всего, непосредственно с установочного диска вам будет запрещено распаковывать файлы), а d:\1 определяет каталог, в который будет распаковываться пакет установки. После распаковки пакета замените его расширение MS_ на MSI, а потом установите данный пакет установщика Windows. В результате у вас появится вот такая красивая программа (рис. 12.2). Рис. 12.2. Окно программы MSN Messenger 6.1 Эту программу можно открыть с помощью файла msnmsgr.exe, расположенного в каталоге %ProgramFiles%\MSN Messenger. Глава 13Программа Debug Следующей возможностью, которую хотелось бы описать, является способ создания программ Win32 с помощью стандартного отладчика командной строки debug.exe. Но сначала хотелось бы пояснить, зачем вообще упоминается этот отладчик. Согласитесь, существуют компьютеры общего пользования, на которые пользователь не имеет права ничего устанавливать. На них нет привода компакт-дисков, дисковода, Интернета или нельзя скачивать из Интернета файлы. В общем, администраторы сделали так, чтобы нельзя было устанавливать свои файлы, в том числе вирусы, перехватчики клавиатуры, троянские кони. Но уже стало стандартом, что программа debug.exe входит в поставку Windows и о ней теперь знает все меньше и меньше администраторов… Это был тонкий намек администраторам подобных общественных компьютеров.
Итак, запустим командную строку и введем название команды — debug.exe. После этого мы попадем в среду программы, о чем можно узнать из появившегося приветствия в виде горизонтального курсора. Теперь посмотрим на сам код простенькой программы Win32, вызывающей стандартное окно приветствия. Листинг 13.1. Программа Win32 типа Hello, World! f 0 400 0 f1000 1200 0 a0 db4d,5a а 3с db40 а 40 db 50,45,0,0 dw 14c,1 а 54 dw e0,10f,10b а 68 dw 10d0 a 74 dw 0,40,1000,0,200,0 dw 4,0,0,0,4 a 90 dw 2000,0,200,0,0,0,2 a b4 dw 10 a c0 dw 1090,0,3c a 140 dw 1000,0,1000,0,200,0,200,0 a 15c dw 20,e000 a 1010 db 54,68,69,73,20,54,69,74,6c,65,3f a 1020 db 54,68,69,73,20,4d,65,73,73,61,67,65,3f a 1040 db 55,53,45,52,33,32,2e,64,6c,6c a 1050 db 4b,45,52,4e,45,4c,33,32,2e,64,6c,6c a 1060 db 0,0,4d,65,73,73,61,67,65,42,6f,78,41 а 1070 db 0,0,45,78,69,74,50,72,6f,63,65,73,73 а 1080 dw 1060,0,0,0,1070,0,0,0 а 1000 dw 1060,0,0,0,1070,0,0,0 а 1090 dw 1080,0,0,0,0,0,1040,0,1000,0 dw 1088,0,0,0,0,0,1050,0,1008,0 a 10d0 db 6a,24 db 68,10,10,40,0 db 68,20,10,40,0 db 6a,0 db ff,15,0,10,40,0 db 6a,0 db ff,15,8,10,40,0 m 1000 1200 200 m 0 400 100 n «путь и имя создаваемого файла.bin» r cx 400 w q Вот и весь код программы, написанной на машинном языке и вызывающей окно, отображенное на рис. 13.1. Рис. 13.1 Результат выполнения программы Команды программыТеперь попробуем разобраться в этом коде. Для начала опишем команды отладчика, применяемые в нем. F «начальный адрес» «конечный адрес» «заполнитель» Данная команда заполняет «заполнителем» диапазон памяти, начиная с «начального адреса» и заканчивая «конечным адресом». A «адрес» Команда говорит отладчику о том, что вы хотите изменить содержимое, записанное в памяти, начиная с указанного «адреса». После ее ввода перед вами появится приглашение, указывающее, какой участок памяти в данный момент редактируется. Чтобы сказать отладчику, что вы уже отредактировали необходимый вам участок памяти, нужно в пустой строке нажать клавишу Enter. Можно также ввести данную команду без значения адреса — в этом случае вы будете редактировать значение адреса памяти, применяемого при последней операции останова. m «начальный адрес» «конечный адрес» «адрес назначения» Эта команда копирует содержимое диапазона памяти, начиная с «начального адреса» и заканчивая «конечным адресом», в область памяти, начинающуюся с адреса назначения. N «путь и имя файла» Данная команда указывает, как будет называться создаваемый отладчиком файл (и в каком каталоге он будет находиться). Следует учитывать, что отладчик создавался для приложений MS-DOS, поэтому он не может создавать ЕХЕ-файлы — именно поэтому в коде и создается BIN-файл (после его создания нужно будет переименовать расширение BIN в расширение EXE). Команда применяется также для загрузки файла и указания параметров запуска файла (в этом случае после команды n должны идти аргументы программы). R «регистр» Эта команда говорит отладчику о том, что вы хотите изменить содержимое конкретного регистра процессора. В контексте приведенного кода изменяется содержимое регистра СХ. После ввода команды появится приглашение (в виде двоеточия) для ввода нового содержимого регистра. Если ввести команду без указания конкретного регистра, то перед вами отобразится содержимое всех регистров процессора, всех флагов (определяют, было ли зарегистрировано переполнение при выполнении операции с числами, является ли число четным и т.д.) и содержимое данной области памяти. Можно также отредактировать установки флагов. Для этого нужно ввести такую разновидность команды: r f, после чего перед вами отобразится установка флагов в текущий момент и приглашение для редактирования флагов. Чтобы отредактировать один из флагов, нужно ввести в приглашении противоположный ему флаг. Например, для флага cy (перенос) нужно указать флаг nc (нет переноса). W «адрес» И наконец, с помощью этой команды записывается содержимое памяти на диск в виде программы Win32. Без аргумента данная команда начинает запись файла из адреса памяти CS:100, но можно самому указать адрес памяти, из которого будет начинаться запись. Q Эта команда закрывает окно отладчика. Описание кодаТеперь, когда вы знаете описание необходимых команд, можно заняться описанием самого кода программы. И описывать его будем так: сначала указывается адрес памяти (или команда), а потом кратко говорится о том, для чего мы записываем по этому адресу памяти данные.
Сначала нужно заполнить нулями (то есть очистить) диапазоны памяти от 0 до 400 и от 1000 до 1200. В первом диапазоне будет содержаться сама программа, а второй диапазон будет рабочим — именно в нем для удобства и будет вначале собрана программа. Начиная с адреса 0 и заканчивая адресом 15c, формируется заголовок РЕ-файла: вначале пишется заголовок DOS-файла (адрес 0, записывается MZ), потом указывается, с какого адреса будет начинаться заголовок РЕ-файла (содержимое адреса 3c), и в этом адресе пишется сам заголовок РЕ-файла (адрес 40, записывается «Р», «Е», 0,0). По этому же адресу записывается идентификатор процессора, для которого предназначена программа (для i386 вводится 14c), и количество секций, из которых она будет состоять. Дальше, по адресу 54, указывается размер NT-заголовка, флаги программы и «магическое значение». Если значения предыдущих адресов были статичны, то содержимое адреса 68 зависит от самой программы — оно указывает на адрес точки входа в программу. Начиная с этого адреса, будет вводиться сам код программы. По адресу 74 вводится базовый адрес загрузки (0,40), выравнивание в памяти и в файле (1000,0,200,0), а также версия операционной системы и версия подсистемы (4,0,0,0,4). По адресу 90 указывается размер образа с заголовками в памяти (2000), размер заголовка в файле (200) и подсистема (2). По адресу b4 указывается количество входов в каталоге смещений (10), а по адресу c0 описываются сами входы в каталог (мы используем только один): адрес таблицы импорта (1090) и ее размер (3c). По адресу 140 начинается таблица объектов (опять имеет один вход): занимаемый объем памяти (1000), с какого адреса начинается (1000), сколько места занимает в файле (200) и по какому смещению в нем находится (200). И последний адрес заголовка — 15c. В нем хранятся флаги (секция кодовая, имеет разрешения на чтение, запись и исполнение). После формирования заголовка формируются данные программы — в диапазоне адресов от 1010 до 1070. Сначала записывается заголовок сообщения и его текст (адреса 1010 и 1020), потом названия библиотек, из которых будут взяты функции MessageBox (выводит наше окно) и ExitProcess (завершает программу) (адрес 1040 — USER32.DLL, а адрес 1050 — KERNEL32.DLL). И наконец, сами названия функций (адрес 1060 — MessageBoxA и адрес 1070 — ExitProcess), которые пишутся с учетом регистра. Теперь нужно сформировать таблицу поиска, импортируемых адресов и таблицу импорта. Таблица поиска содержит адреса функций и способ их поиска в библиотеках (по порядковым номерам или именам). В нашем случае будем вести поиск по именам, поэтому таблица поиска, расположенная по адресу 1080, принимает такой вид: 1060,0,0,0,1070,0,0,0. Здесь 1060,0 указывает на функцию MessageBoxA (0 отделяет названия функций между собой), потом идет 0,0 — разграничитель между функциями различных библиотек, а 1070,0 — адрес функции ExitProcess из другой библиотеки. Следует также учитывать, что первые два байта перед названиями функций должны быть равны 0 — они являются индексом, по которому в библиотеке должны находиться функции, но поскольку индекс неизвестен, нужно оставить эти поля пустыми, чтобы загрузчик сам нашел в библиотеках данные функции. Таблица импортируемых адресов располагается в самом начале секции (в нашем случае по адресу 1000) и содержит адреса импортируемых функций — аналог таблицы поиска. Таблица импорта связывает библиотеки с таблицами поиска и импортируемых адресов (в коде начинается по адресу 1090). Каждая строка таблицы описывает одну библиотеку (сначала содержится адрес начала описания функций из библиотеки в таблице поиска (1080,0), потом два пустых поля (0,0,0,0), потом адрес, хранящий название библиотеки (1040,0), и адрес начала описания функций данной библиотеки в таблице импортируемых адресов (1000,0)). Аналогично описывается библиотека KERNEL32.DLL. После описания всех библиотек нужно оставить еще одну пустую строку таблицы импорта, то есть следующие 20 байт. Итого размер таблицы импорта равен 3Ч5Ч4 = 60, а в шестнадцатиричном виде — 3c, что мы и вводили в заголовке PE по адресу c0. И наконец, последняя часть кода — сам код. Он начинается с адреса 10d0, который и является точкой входа в программу — ее мы и указывали в заголовке PE файла по адресу 68. Код довольно прост, но написан на машинном языке: db 6a,24 db 68,10,10,40,0 db 68,20,10,40,0 db 6a,0 db ff,15,0,10,40,0 db 6a,0 db ff,5,8,10,40,0 Так вызывается функция MessageBoxA и ей передаются необходимые параметры: сначала помещается значение 24 (указывает, что вызываемое окно имеет две кнопки и значок вопроса), потом адрес заголовка, адрес сообщения и 0 (дескриптор родительского объекта, которого у нас нет). Если описать приведенный код более просто, то получится: ■ Push 24 — поместить в стек значение 24; ■ Push offset «переменная с заголовком окна» — поместить в стек адрес памяти, содержащий заголовок окна; ■ Push offset «переменная с сообщением окна» — поместить в стек адрес памяти, хранящий сообщение окна; ■ Push 0 — поместить в стек 0; ■ Call «адрес памяти, содержащий название функции». Аналогично вызывается функция ExitProcess. Вот и все. Теперь только осталось скопировать диапазон адресов от 1000 до 1200, хранящий нашу программу, в память, начиная с адреса 200, а потом сместить всю программу на 100, так как при сохранении файла отладчик обрезает первые 100h байт памяти. Простой примерКонечно, приведенный выше пример довольно сложен — ведь он написан на машинном языке и в шестнадцатиричном виде. Но его можно упростить, ведь отладчик в Windows XP поддерживает как ASCII-символы, так и язык «Ассемблера». Вот упрощением мы сейчас и займемся. Например, напишем программу, которая будет открывать созданный нами ранее файл (если он будет называться hello.exe и находиться на диске D:). Листинг 13.2. Создание простого файла, открывающего другой файлОчистка памяти и описание заголовка файла аналогично приведенному выше примеру, поэтому эту часть кода мы пропустим. а 1010 db "D:\HELLO.EXE" а 1040 db "SHELL32.DLL" а 1050 db "KERNEL32.DLL" а 1060 db 0,0,"ShellExecuteA" а 1070 db 0,0,"ExitProcess" а 1080 dw 1060,0,0,0,1070,0,0,0 а 1000 dw 1060,0,0,0,1070,0,0,0 а 1090 dw 1080,0,0,0,0,0,1040,0,1000,0 dw 1088,0,0,0,0,0,1050,0,1008,0 a 10d0 xor bx,bx push bx push bx push bx db 68,10,10,40,0 push bx push bx db ff,15,0,10,40,0 push bx db ff,15,8,10,40,0 m 1000 1200 200 m 0 400 100 n d:\rr.bin r cx 400 w Согласитесь, уже проще — ведь теперь не нужно вводить текстовую информацию в шестнадцатиричном виде. А если учесть еще одну возможность командной строки, то станет совершенно просто. Все дело в том, что совсем не обязательно вводить данный текст в отладчике, ведь можно воспользоваться Блокнотом, а потом просто скопировать введенный текст в буфер обмена, запустить debug.exe и нажать правую кнопку мыши в области его окна, чтобы отладчик начал обработку команд из буфера обмена. При этом только следует убедиться, что режим быстрой вставки в командной строке включен (DWORD-параметр Quick Edit, расположенный в ветви реестра HKEY_CURRENT_USER\Console, должен быть равен 1). Другие команды программыПрограмма debug.exe содержит и другие команды, но в контексте данной книги они описаны не будут. Если вас заинтересовала приведенная информация, то для начала предлагаю посмотреть описание команд программы debug.exe в Центре справки и поддержки операционной системы Windows XP. Глава 14Безопасность В данной главе рассмотрим некоторые вопросы безопасности функционирования системы. В частности, опишем недокументированную угрозу получения учетной записи администратора с помощью учетной записи опытного пользователя и рассмотрим вопросы использования системной учетной записи. Угроза получения учетной записи администратора с помощью учетной записи опытного пользователяКак говорилось раньше, использование группы Опытные пользователи не приветствуется Microsoft, так как данная группа имеет очень многие права в системе. В этой главе хотелось бы рассказать еще об одной причине, по которой лучше не использовать группу Опытные пользователи. А именно, о способе получения прав администратора или отдельной его учетной записи в том случае, если на взламываемой машине у вас есть учетная запись опытного пользователя либо любая другая учетная запись, имеющая права на запуск служб. Например, этим способом может воспользоваться администратор, которому вы запретили создавать других администраторов, чтобы обойти ваше ограничение. Для работы данного метода на взламываемой системе также должны быть установлены дополнительные сервисы. Для реализации данного метода взлома необходима сторонняя служба, файл которой в Windows не защищается WFP, а также к которой вы имеете доступ. Еще одним требованием к службе является обязательное разрешение взаимодействия с Рабочим столом, а значит, служба должна запускаться от имени системы. Как правило, такие службы появляются при установке антивирусов (например, «Антивируса Касперского»), различных пакетов для программирования (например, Microsoft Visual C++ или Microsoft Visual Studio .NET), программ получения сведений о системе (например, SySoftware Sandra), программ эмуляторов операционной системы (например, VMware) и других программ, которые требуют для своих нужд права администратора (рис. 14.1). Если все условия выполняются, а, как правило, они выполняются уже потому, что сейчас офис или отдельный компьютер невозможен без установки антивируса, не говоря уже о других программах, то можно начать попытку взлома. Для этого нужно скопировать файл explorer.exe, расположенный в каталоге %systemroot%, в каталог, который используется для хранения файла службы, например, как показано на рис. 14.1, в каталог %programfiles%\common files\microsoft shared\VS7Debug. После этого необходимо переместить куда-нибудь файл службы (на рис. 14.1 это файл mdm.exe), а файлу explorer.exe присвоить имя перенесенного нами файла службы (в нашем случае mdm.exe). Рис. 14.1. Вот пример службы, файл которой не защищен WFP, так как он не находится в каталоге %systemroot%\system32 Вот и все приготовления, которые могут занять у вас несколько минут. Дальше есть две линии сюжета: если служба на данный момент не запущена, то просто запустите ее и переходите к следующему абзацу книги. Если же служба в данный момент работает, то нужно перезагрузить компьютер (обязательно перезагрузить, если вы просто смените сеанс, то ничего не произойдет — служба не будет перезапущена). После перезагрузки компьютера, еще до загрузки оболочки, но уже после ввода регистрационных данных пользователя, перед вами отобразится окно Проводника. Это говорит о том, что запустилась измененная служба (конечно, это произойдет только в том случае, если параметр Type для службы равен 110, а параметр Start равен 2, это означает, что служба является приложением и запускается при входе пользователя в систему сервисом smss.exe). На данный момент окно Проводника вам не нужно, поэтому просто закройте его. Теперь в Диспетчере задач (нажмите комбинацию клавиш Ctrl+Alt+Delete для его вывода) нужно самому запустить оболочку explorer.exe, так как ваша оболочка теперь самостоятельно не загрузится. Для этого в меню Файл выберите пункт Новая задача (Выполнить) и в появившемся диалоговом окне введите команду explorer.exe. Все, теперь вы полностью вошли в систему и при этом измененная вами сторонняя служба не запущена (все приведенные действия нужны потому, что опытные пользователи могут запускать службы, но не останавливать их). Осталось только одно — запустить оснастку services.msc и самостоятельно запустить измененную службу. После запуска службы перед вами появится окно Проводника, в адресной строке которого нужно быстро ввести команду %systemroot%\system32\lusrmgr.msc (лучше просто поместить команду в буфер обмена перед выполнением данного шага взлома).
Вы спросите, почему нужно вводить быстро? Все дело в том, что файл Проводника, которым вы заменили файл службы, не предназначен для запуска в качестве службы. Это значит, что он не ответит на запросы оснастки services.msc (хотя, как видите, это не мешает системе запустить файл оболочки). А если служба не отвечает на запросы, то через некоторое время система автоматически завершит такую службу. Вот и все, теперь перед вами должна отобразиться соответствующая оснастка, которая будет запущена от имени системы (или учетной записи, от которой запускалась изменяемая вами служба). После отображения данной оснастки закройте окно Проводника. Конечно, система может и сама его закрыть по истечении времени ожидания ответа от службы, но лучше все-таки этого не ждать. Как видите (рис. 14.2), система завершает не отвечающую службу, но не завершает другие процессы, порожденные завершенной службой, поэтому теперь вы можете спокойно редактировать группу, к которой принадлежит ваша учетная запись, либо создавать новую учетную запись администратора. Рис. 14.2. Система завершила не отвечающую службу, но не завершила другие процессы, порожденные ею, поэтому у вас теперь есть оснастка с правами системы Системная учетная записьКак можно заметить из приведенного выше способа взлома, стандартной системной учетной записью можно воспользоваться для получения прав администратора. Это происходит потому, что такая запись имеет в чем-то даже больше прав, чем учетная запись администратора, и, как правило, администраторы компьютера не ограничивают учетную запись системы (а в основном просто не замечают угрозы этой записи). При рассмотрении групповых политик вы узнали, что настройки интерфейса Internet Explorer также записываются в ветвь реестра от имени учетной записи системы (от имени процесса WINLOGON.EXE). Это тоже довольно сложно понять. Если групповые политики может редактировать только администратор, то почему необходимо использовать процесс WINLOGON.EXE? Здесь также, кстати, скрывается возможность взлома — получение прав администратора или изменение любых элементов реестра и файловой системы компьютера с помощью процесса WINLOGON.EXE, запущенного от имени системы. Все дело в возможности импортирования настроек конфигурации браузера, программ на вкладке Программы или настроек ограничений в INF-файлах каталога %systemroot%\system32\GroupPolicy\User\Microsoft\IEAK\BRANDING с помощью элемента групповой политики Настройка Internet Explorer. Ведь если добавить в данные INF-файлы свои действия, например редактирование ветвей реестра или добавление/удаление объектов файловой системы, то при следующем доступе к политике Настройка Internet Explorer все добавленные вами строки будут выполнены от имени системы. Единственным, что по умолчанию делает невозможным выполнение данного метода взлома, является запрет на работу с консолью Групповая политика, а также редактирование импортируемых INF-файлов для пользователей с учетными записями, отличными от группы Администраторы. Именно поэтому категорически запрещено изменять настройки доступа к каталогу %systemroot%\system32\GroupPolicy\User и его содержимому. Хотя и это только вершина айсберга, ведь неизвестно, как процесс WINLOGON.EXE создает INF-файлы. Может быть, можно подобрать такое значение параметра реестра (который он записывает в INF-файл), которое будет вызывать неправильную запись в INF-файл значения параметра реестра? Например, чтобы на основе значения параметра реестра в INF-файле создавалось не только значение этого параметра, но и новая строка, выполняющая произвольный код? Например, после некоторых экспериментов получилось создать в INF-файле «мусор», то есть произвольный текст после значения параметра, который не обрабатывается. А можно ли как-нибудь записать в одну строчку INF-файла две команды? Или указать в значении параметра реестра какой-либо специальный символ (ведь реестр поддерживает Unicode), который при обработке процессом WINLOGON.EXE или INF-файлом будет интерпретироваться как переход на другую строку? Надеюсь, программисты Microsoft могут с уверенностью ответить отрицательно на все эти вопросы, иначе перед нами очередной потенциальный способ выполнения любых операций с реестром и файловой системой Windows XP от имени системы. Причем этим способом смогут воспользоваться представители не только группы Опытные пользователи, но и группы Пользователи. Другим интересным вопросом является озвучивание системных событий. Как оказывается, озвучивание события также выполняется процессом WINLOGON.EXE. При этом путь к музыкальному файлу для озвучивания события хранится в ветви реестра, доступной для редактирования любым пользователям. Здесь также возникают вопросы. А нельзя ли вместо озвучивания музыкального файла выполнить какой-нибудь произвольный код? Или вместе с музыкальным файлом? Или, например, указать путь к ярлыку музыкального файла, а этот ярлык, в свою очередь, будет ссылаться на музыкальный файл, доступ к которому вам как пользователю был запрещен. Да здесь, собственно, и ярлык не нужен, как оказывается, так можно прослушать даже тот файл, доступ к которому вам был полностью запрещен, но вы точно знаете, где этот файл находится. Как это сделать? Все музыкальные файлы для озвучивания событий описаны в ветви реестра HKEY_CURRENT_USER\AppEvents\Schemes\Apps. Например, параметр (По умолчанию) ветви реестра HKEY_CURRENT_USER\AppEvents\Schemes\Apps\.Default\SystemHand\. Current определяет путь к файлу, который будет проигрываться процессом WINLOGON.EXE при возникновении критической ошибки. Другими словами, вы можете указать здесь путь к любому музыкальному файлу, а потом, например, просто ввести в диалоге Запуск программы любую строку, не ассоциированную с программой, например символ b. Скорее всего, система не найдет программы с названием b. exe, а значит, произойдет событие критической ошибки и будет воспроизведен необходимый вам файл. Конечно, прослушивать запрещенные файлы смешно (если только на них не записана конфиденциальная информация), но что, если поискать системную службу, которая откроет для вас любой файл? Или, например, запишет свои данные в файл, путь к которому вы укажете? Например, в файл, доступ к которому вам запрещен, но который вы хотите повредить. Именно по приведенным выше причинам я и опасаюсь программ и служб, запущенных от имени системы. Ведь даже сама Microsoft говорит о том, что нужно использовать как можно меньше учетных записей с административными правами, но почему-то забывает о системной учетной записи, которая также имеет административные права. А ведь сейчас каждая мало-мальски нужная служба, установленная на компьютере, хочет работать с правами системы, даже если эти права ей совершенно не нужны. При этом неизвестно, насколько эта служба устойчива к взлому. А по теории вероятности, чем больше в системе таких служб, тем больше шансов на взлом такой системы. Интересна также сама необходимость учетной записи системы с полными правами. Например, зачем службам такие возможности, как изменение ACL объектов или создание учетных записей администраторов? Зачем тому же WINLOGON.EXE такие возможности? Намного безопасней будет создать несколько ограниченных учетных записей системы, выполняющих только определенные задачи, которые могут понадобиться той или иной службе. Глава 15INF-файлы Хотелось бы в этой главе описать некоторые возможности INF-файлов. Здесь не будет полностью рассмотрен язык INF-файлов и способы написания на нем сценариев, но тем не менее попробуем понять, как с помощью INF-файлов можно выполнять копирование и удаление файлов, создание и удаление параметров реестра, а также рассмотрим некоторые интересные возможности INF-файлов. Основные сведенияINF-файлы предназначены для описания начального процесса установки новой программы или оборудования. Каждый INF-файл должен начинаться с заголовка. Этот заголовок определяет версию INF-файла, а также версию операционной системы, для которой этот INF-файл написан. От версии информационного файла (INF-файла) зависят те возможности, которые он поддерживает. Существует две версии INF-файлов — обычные и расширенные. В главе 1 уже рассматривались способы вызова обычных и расширенных INF-файлов. При этом расширенные INF-файлы поддерживают следующие новые возможности (это не все возможности, только основные): выполнение различных программ до или после выполнения INF-файла, архивирование изменяемых значений параметров реестра, а также вывод сообщений перед выполнением 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_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom. В примере этому параметру присваивается значение 0, то есть отключается возможность автоматического запуска дисков. Листинг 15.1. Редактирование параметров реестра[version] Signature="$CHICAGO$" [DefaultInstall] AddReg=AR_off [AR_off] HKLM, "SYSTEM\CurrentControlSet\Services\Cdrom","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,"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. Листинг 15.3. Удаление сведений об общедоступных папках [version] Signature="$CHICAGO$" [DefaultInstall] DelReg=shared_del [shared_del] HKLM,"SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES\Security" HKLM,"SYSTEM\CURRENTCONTROLSET\SERVICES\LANMANSERVER\SHARES" Как можно заметить, содержимое блока для удаления ветвей и параметров реестра похоже на содержимое блока редактирования ветвей и параметров реестра. Строка для удаления ветви или параметра имеет следующий формат: «корневой раздел», «ветвь реестра», «параметр», «флаг операции удаления», «пример для удаления» ■ Корневой раздел — указывает на корневой раздел, в котором расположен удаляемый параметр или ветвь реестра. ■ Ветвь реестра — определяет удаляемую ветвь реестра или ветвь, в которой хранится удаляемый параметр. ■ Параметр — определяет название удаляемого параметра. Если параметр отсутствует, то предполагается, что удаляться будет конечный раздел указанной ветви реестра. ■ Флаг операции удаления — может принимать следующие значения: • 0x00002000 — удалить весь конечный раздел указанной ветви; • 0x00004000 — произвести указанные изменения в 32-разрядном реестре; • 0x00018002 — удаляет из параметра все строки, соответствующие примеру для удаления. ■ Пример для удаления — определяет строку значения параметра, имеющего REG_MULTI_SZ-тип, все соответствия которой должны быть удалены из параметра. Редактирование отдельных битов значения параметраЭто довольно интересная и, можно сказать, уникальная возможность, с помощью которой можно изменить отдельный бит параметра, не изменяя другие его биты. Для реализации этой возможности применяется ключевое слово 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. Пример модификации отдельных битов параметра[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]. Так как вам уже известно, как хранятся сведения о службе в реестре, то будет не сложно понять пример создания службы. По этой причине сначала посмотрим на листинг 15.5, который содержит часть INF-файла, регистрирующего в системе службу Восстановление системы. Листинг 15.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файла (в этом случае они пишутся через запятую), в которых определены сведения о службе. В листинге 15.5 первый блок содержит информацию о службе, а второй блок регистрирует возможность записи в системные журналы Windows (оснастка Просмотр событий). Теперь рассмотрим блок INFфайла для регистрации службы. Он может включать в себя следующие ключевые слова. ■ DisplayName — имя службы, отображаемое в оснастке services.msc. ■ Description — описание службы, отображаемое в оснастке services.msc. ■ ServiceType — тип службы. Значение этого параметра соответствует уже рассмотренному значению параметра реестра Type (см. часть 2). ■ StartType — режим запуска службы. Значение этого параметра соответствует уже рассмотренному значению параметра реестра Start. ■ ErrorControl — действие при возникновении ошибки при запуске службы. Значение этого параметра соответствует уже рассмотренному значению параметра реестра ErrorControl. ■ ServiceBinary — путь и имя файла службы. Значение данного ключевого слова заносится в уже рассмотренный параметр ImagePath реестра. ■ Dependencies — определяет службы, необходимые для работы данной службы. Эти значения заносятся в параметр реестра DependOnService. ■ LoadOrderGroup — определяет группу, к которой принадлежит данная служба. Эти значения заносятся в параметр реестра Group. Удаление службыДля удаления службы предназначено ключевое слово DelService, которое также указывается в блоке, названном в формате [«блок удаления».Services]. Удаление службы выполняется намного проще — просто указывается имя службы, которую нужно удалить (название раздела реестра, в котором служба описана). Листинг 15.6. Пример удаления службы[version] Signature="$CHICAGO$" [Uninstall.Services] DelService=sr В листинге 15.6 ключевое слово DelService указано в блоке [Uninstall.Services], так как именно блок [Uninstall] используется в примере при вызове INF-файла для удаления службы с помощью команды rundll32.exe. Копирование файловКопирование в INF-файлах реализовано наиболее сложно. Для его выполнения необходимо не только использовать ключевое слово CopyFiles, но и, кроме того, создать три отдельных блока INF-файла: DestinationDirs, SourceDisksFiles и SourceDisksNames. Рассмотрим простой пример. Листинг 15.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]. Удаление файловУдаление файлов напоминает их копирование, поэтому рассмотрим этот процесс лишь поверхностно — в подсказках к листингу 15.8. Для определения блоков, содержащих описания удаляемых файлов, используется ключевое слово DelFiles. Листинг 15.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 файла, в котором описывается создаваемый в меню Пуск ярлык. Рассмотрим пример, с помощью которого создается ярлык программы Восстановление системы в меню Пуск (Стандартные►Служебные). Листинг 15.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. Посмотрим на пример использования этих ключевых слов. Листинг 15.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" Приведенный в листинге 15.10 INF-файл перед своей установкой вызывает Калькулятор, а потом — стандартный командный интерпретатор Windows. После своей установки он вызовет диалоговое окно с вопросом о перезагрузке компьютера. Конечно, это окно принадлежит Internet Explorer, но зато оно работает.
Не забывайте также, что данный INF-файл не выполнится после выбора команды Установить контекстного меню INF-файла. Для его установки придется воспользоваться командой RunDll32 advpack.dll, LaunchINFSection d:\1.INF, DefaultInstall. Здесь d:\1.INF соответствует пути к INF-файлу и его названию. Вывод сообщения перед установкойПеред установкой INF-файла или после нее можно вывести окно сообщения с произвольным текстом. Диалог сообщения, выводимый перед установкой, позволяет эту установку отменить. Он содержит две кнопки — OK и Отмена. Если нажать кнопку Отмена, то установка INF-файла будет отменена. Диалог сообщения, выводимый после установки, является информационным и имеет только одну кнопку — OK. Чтобы вывести диалоговое окно перед установкой, необходимо воспользоваться ключевым словом BeginPrompt (окно сообщения будет выведено до вызова программ, описанных ключевым словом RunPreSetupCommands), а чтобы вывести окно сообщения после установки, нужно воспользоваться ключевым словом EndPrompt. В листинге 15.11 приведен простой пример использования как окна сообщения, выводимого перед установкой, так и окна сообщения, выводимого после установки. Листинг 15.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 — указывает заголовок окна сообщения. Следует учитывать, что данный заголовок будет использоваться не только для окна сообщения, отображаемого перед установкой, но и для окна сообщения, отображаемого после установки. Дополнительные возможностиВыше были рассмотрены лишь основы работы с INF-файлами. Кроме приведенных ключевых слов, INF-файлы поддерживают многие другие, но если начать их описывать, то понадобится отдельная книга. Закончим на этом рассказ о ключевых словах INF-файлов. Теперь рассмотрим несколько примеров не совсем стандартного использования INF-файлов. Без описания этих примеров рассказ о возможностях INF-файлов был бы не полон. Работа с диалогом Установка и удаление программОдной из интересных возможностей INF-файлов является возможность их использования как для добавления команды в диалог Установка и удаление программ, так и для выполнения процесса деинсталляции при помощи диалога Установка и удаление программ. Рассмотрим простой пример использования INF-файлов для создания так называемого зацикленного элемента диалога Установка и удаление программ, который применяется для включения и отключения возможности автоматического запуска дисков. Принцип работы приведенного ниже сценария прост. При первом своем вызове он копирует себя в папку %systemroot%\INF, отключает автоматический запуск дисков, а также добавляет возможность включения автоматического запуска дисков в диалог Установка и удаление программ. После удаления данного INF-файла с помощью диалога Установка и удаление программ происходит включение автоматического запуска дисков, а также создание в диалоге Установка и удаление программ новой строки, с помощью которой можно опять отключить автоматический запуск диска. Другими словами, создается постоянный цикл. Конечно, пример с изменением значения одного параметра довольно спорен, ведь намного проще было бы добавить свой флажок в один из стандартных диалогов Windows, поддерживающих добавление в свои списки новых элементов. Но если необходимо при установке параметра также выполнять какие-либо команды или модифицировать сразу несколько параметров (например, создать несколько разновидностей настройки оболочки Windows, а потом переходить между ними), то данный способ использования INF-файлов может быть незаменим (рис. 15.1). Рис. 15.1. Создание команды в диалоге Установка и удаление программ Листинг 15.12. Создание цикла в диалоге Установка и удаление программ [version] Signature = $CHICAGO$ [DefaultInstall] AddReg = AutoRunOff, InstallInf CopyFiles = INFcopy ;Ниже мы используем переменную %PATH% для указания изменяемой ветви реестра. ;Переменная – это специальная последовательность символов, которая при ;установке INF-файла будет преобразовываться в строку, определенную для нее ;в стандартном блоке [Strings] (обычно этот блок располагается в самом низу ;INF-файла). Использование переменных позволяет улучшить читабельность ;INF-файлов большого размера, а также предоставляет разработчику возможность ;цетрализованного хранения всех информационных и других строчек программы. ;Иными словами, вместо того чтобы искать необходимую для изменения строку ;по всему содержимому INF-файла, он может описать ее в блоке [Strings] [AutoRunOff] HKLM, %PATH%, AutoRun, 0x00010001, 0 ;Добавляем строку в диалог Установка\удаление программ. В первой главе ;мы кратко рассматривали формат этого диалога. [InstallInf] HKLM, %DISPLAY% autorunOnOff,,, HKLM, %DISPLAY% autorunOnOff, DisplayName,,%NAME_ON% HKLM, %DISPLAY% autorunOnOff, UninstallString,,\"rundll32 setupapi, InstallHINFSection DefaultUninstall 132 %17%\primer.INF" [DefaultUninstall] AddReg = AutoRunOn [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] primer.INF [DestinationDirs] INFcopy = 17 [SourceDisksFiles] primer.INF = 55 [SourceDisksNames] 55 = %DISKNAME%, , 1 ;Описывает переменные, используемые в INF-файле [Strings] PATH = "SYSTEM\CurrentControlSet\Services\Cdrom" DISPLAY = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" NAME_ON = "Восстановить автоматический запуск дисков" NAME_OFF="Отключить автоматический запуск дисков" DISKNAME = "parad0x-des1Gn" Диалог установки компонентов WindowsОтдельной частью окна Установка и удаление программ является диалог Установка компонентов Windows, который вызывается нажатием соответствующей кнопки. Как правило, данный диалог включает в себя сведения не обо всех компонентах Windows, доступных на компьютере. Например, с его помощью нельзя удалить с компьютера стандартные игры, такие как Сапер или Паук. Это происходит потому, что по умолчанию возможность удаления или установки игр скрыта из диалога установки компонентов Windows. Список содержимого диалога Установка компонентов Windows описывается в файле sysoc.INF, расположенном в каталоге %systemroot%\INF. Данный файл включает в себя блок INF-файла [Components]. Блок содержит наборы строк, определяющих, будет ли отображаться в диалоге отдельный компонент операционной системы Windows XP. Строки имеют следующий формат: идентификатор»=«библиотека для работы компонентов», «функция библиотеки», «INF-файл, описывающий компоненты»,«отображение компонентов»,«номер» Следующие элементы являются наиболее важными. ■ INF-файл, описывающий компоненты — описывает разделы, отображаемые в диалоге Установка и удаление программ. Именно такой INF-файл сейчас и будет создан. ■ Отображение компонентов — если в данном поле будет стоять слово HIDE, то данный компонент не будет отображаться в диалоге дополнительных компонентов Windows. Чтобы компонент отображался в диалоге, необходимо чтобы это поле было пустым. ■ Например, чтобы добавить в диалог компонентов возможность удаления игр, необходимо в строке, начинающейся с идентификатора games, удалить строку HIDE. На рис. 15.2 показан пример содержимого этого файла. Рис. 15.2 .Содержимое файла sysoc.INF Другой возможностью является добавление в данный диалог своих компонентов. Для этого необходимо сначала создать INF-файл, описывающий новые компоненты, а потом создать в файле sysoc.inf ссылку на созданный INF-файл. Сначала посмотрим на простой пример INF-файла. В этом примере сразу создается корневой раздел, отображаемый непосредственно в диалоге установки компонентов Windows, два вложенных в этот раздел подраздела, а также еще два раздела, которые и будут устанавливать или удалять компоненты. В нашем случае эти разделы будут просто скрывать (или отображать, в зависимости от состояния флажка) версию Windows на Рабочем столе, а также скрывать (или отображать) название значка Мой компьютер. Листинг 15.13. Создание разделов в диалоге компонентов[version] signature="$Chicago$" [Optional Components] TopMain Interface Settings HTMcomputer Versus [TopMain] OptionDesc = Мои настройки Tip = Варианты настройки интерфейса и конфигурации IconIndex = 0 [Interface] OptionDesc = Интерфейс Windows Tip = Варианты настройки интерфейса IconIndex = 4 Parent = TopMain [Settings] OptionDesc = Конфигурация Windows Tip = Варианты настройки конфигурации компьютера IconIndex = 16 Parent = TopMain [HTMcomputer] OptionDesc = Скрыть название моего компьютера Tip = Скрывает название значка Мой компьютер IconIndex = 0 Parent = Interface AddReg = AddHTM Uninstall = HTMUn Modes = 0,1,2,3 [Versus] OptionDesc = Отобразить версию на Рабочем столе Tip = отображает версию операционной системы на Рабочем столе пользователя IconIndex =4 Parent = Interface AddReg =AddVersion Uninstall =VersUn Modes = 0,1,2,3 [AddHTM] HKCR, "CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\ShellFolder", WantsFORDISPLAY, 0x00010001, 1 [AddVersion] HKCU, "Control Panel\Desktop", PaintDesktopVersion, 0x00010001, 1 [HTMUn] DelReg = HTMDel [VersUn] AddReg = VersDel [HTMDel] HKCR, "CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\ShellFolder", WantsFORDISPLAY [VersDel] HKCU, "Control Panel\Desktop", PaintDesktopVersion, 0x00010001, 0 Формат INF-файла для создания компонентов в диалоге установки Windows немного отличается от обычного формата INF-файлов. Во-первых, основной блок INF-файла обязательно должен называться [Optional Components], иначе INF-файл работать не будет. Блок включает в себя список других блоков данного INF-файла. Каждый из описанных в [Optional Components] блоков определяет один раздел в диалоге установки компонентов Windows. Блок описания раздела установки компонента содержит следующие ключевые слова. ■ OptionDesc — определяет название раздела, отображаемого в диалоге Установка компонентов Windows. ■ Tip — указывает подсказку для раздела, отображаемого в нижней части диалога Установка компонентов Windows. ■ Icon Index — определяет индекс значка, отображаемого напротив данного раздела в диалоге Установка компонентов Windows. Например, идентификатор 0 определяет значок компьютера, идентификатор 2 — монитора, 14 — принтера. ■ Parent — указывает название блока INF-файла, описывающего раздел, который будет родителем для нашего раздела в диалоге установки компонентов Windows. Если данное ключевое слово отсутствует, то наш раздел будет отображаться непосредственно в диалоге установки конфигурации Windows. ■ Uninstall — определяет блок INF-файла, вызываемый для данного компонента при установке созданного раздела (устанавливать можно только разделы, входящие непосредственно в список диалога установки компонентов (корневые), а не отдельно разделы, вложенные в корневой), если флажок напротив данного компонента будет снят. В блоке установки компонента можно также пользоваться такими стандартными ключевыми словами, как AddReg, BitReg, DelReg, CopyFiles и т.д. Все блоки, описанные в этих ключевых словах, будут выполняться при установке флажка напротив соответствующего компонента. Теперь добавим ссылку на наш компонент в файл sysoc.inf. Для того чтобы так сделать, необходимо в блок [Components] добавить строку следующего вида: hello=ocgen.dll, OcEntry, prim2.inf, , 7. Здесь test2 определяет идентификатор присоединяемого INF-файла, a prim.inf является названием самого присоединяемого файла. Стоит еще сказать, что созданный INF-файл должен находиться в каталоге %systemroot%\inf.
На рис. 15.3 показан результат добавления компонентов. Рис. 15.3. Создание разделов диалога INF-файл для логического дискаЕще одной возможностью, которую предоставляют INF-файлы, является добавление в контекстное меню логических дисков своих команд, а также изменение значка логического диска. Для этого необходимо создать специальный файл, который должен называться autorun.inf. Созданный INF-файл необходимо поместить в корень логического диска. Рассмотрим пример создания файла autorun.inf. Листинг 15.14. Пример создания файла autorun.inf[autorun] icon = E:\images\fotoo\Art_galery\p.BMP shell = open shell\RunPh\command = photoshop.exe shell\RunPh = Запустить photoshop Файл autorun.inf не имеет блока версии INF-файла, но должен иметь блок [autorun]. Содержимое этого блока довольно просто в понимании, если вы прочитали главу 8 о корневом разделе HKEY_CLASSES_ROOT. Как можно заметить, ключевые слова, начинающиеся со слова shell, являются просто разделами реестра, которые должны быть добавлены к ветви HKEY_CLASSES_ROOT\Drive при отображении контекстного меню данного логического диска, а ключевое слово icon определяет значок диска. Тем не менее вспомним содержимое корневого раздела HKEY_CLASSES_ROOT\Drive\shell и опишем, что же конкретно делают ключевые слова данного файла. ■ shell = open — добавляет в параметр (По ум олчанию) раздела shell строку open. Эта строка говорит о том, что по умолчанию при двойном щелчке на диске он должен открываться. ■ Shell\RunPh = Запустить photoshop — добавляет в параметр (По умолчанию) раздела RunPh строку Запустить photoshop. Эта строка определяет название команды в контекстном меню нашего диска. ■ Shell\RunPh\command = photoshop.exe — добавляет в параметр (По умолчанию) раздела command строку photoshop.exe. Эта строка определяет команду, которая будет выполняться при выборе из контекстного меню нашего диска соответствующей команды.
Как можно заметить, с помощью INF-файлов можно выполнить довольно много интересного. При этом рассмотренные возможности являются только каплей в море. Например, с помощью INF-файлов можно выполнить такие действия, как запуск или остановка служб, назначение прав на доступ к файлам, архивирование реестра и многое другое. Кроме того, INF-файлы постоянно усовершенствуются и еще неизвестно, что с их помощью можно будет выполнить завтра. Глава 16Сервер сценариев Windows При рассказе об инструментарии управления WMI уже рассматривались примеры создания сценариев сервера сценариев Windows с использованием WMI, сейчас же рассмотрим некоторые объекты, доступ к которым можно получить в Windows XP, а также методы для работы с ними. Глава будет оформлена как справочник, так как работа с объектами легче, чем работа с инструментарием WMI, тем более что в Интернете можно найти очень много примеров работы с объектами. РеестрДля доступа к реестру необходимо подключить объект WshShell. Для этого нужно воспользоваться следующим объявлением: Set имя_нового_объекта = WScript.CreateObject("WScript. Shell"). Объект поддерживает следующие методы. ■ RegRead(путь к ветви реестра и имя параметра) — считывает из реестра значение параметра, указанного в качестве входного значения. При этом если входное значение будет завершаться косой чертой (\), то будет считываться значение по умолчанию данной ветви реестра. Следует также напомнить, что путь к ветви реестра должен начинаться не с полного названия корневого раздела, а с его аббревиатуры. Например, возможны следующие аббревиатуры: • HKCU — соответствует корневому разделу HKEY_CURRENT_USER; • HKLM — HKEY_LOCAL_MACHINE; • HKCR — HKEY_CLASSES_ROOT. ■ RegWrite путь к ветви реестра и имя параметра, значение параметра, тип параметра — редактирует значение существующего параметра реестра или создает новый параметр. При этом для его работы необходимо три входных значения, последнее из которых является аббревиатурой типа создаваемого параметра. Возможны следующие аббревиатуры: • REG_SZ — строковый параметр; • REG_DWORD — параметр REG_DWORD-типа; • REG_BINARY — параметр REG_BINARY-типа. Как и в методе RegRead, если путь к создаваемому параметру будет заканчиваться косой чертой, то будет изменяться значение параметра (По умолчанию). ■ RegDelete путь к ветви реестра и имя параметра, который мы удаляем — удаляет из реестра указанный во входящем значении параметр. При этом если входящее значение оканчивается косой чертой, то будет удалена вся ветвь. Рассмотрим простой пример работы с данными методами. В нем будет создан параметр, а также отредактирован параметр (По умолчанию). Затем произойдет попытка считать созданные параметры, а после этого удаление сначала отдельного параметра, а потом всей ветви реестра, которая была создана ранее. Листинг 16.1. Работа с методами для доступа к рееструset wshshell = WScript.CreateObject("WScript.Shell") wshshell.RegWrite "HKCU\Primer_sozdania_vetvi\hello_world", "BIG_WORLD", "REG_SZ" wshshell.RegWrite "HKCU\Primer_sozdania_vetvi\", "Изменяем значение параметра По умолчанию", "REG_SZ" MsgBox wshshell. RegRead("HKCU\Primer_sozdania_vetvi\hello_world") MsgBox wshshell.RegRead("HKCU\Primer_sozdania_vetvi\") wshshell.RegDelete "HKCU\Primer_sozdania_vetvi\hello_world" wshshell.RegDelete "HKCU\Primer_sozdania_vetvi\" Файловая системаДля доступа к файловой системе используется следующий вызов: Set имя_объекта = CreateObject("Scripting.FileSystemObject"). Объект поддерживает следующие методы. ■ BuildPath("путь к каталогу", "название файла") — создает путь на основе указанного пути к каталогу и имени файла. Иными словами, он просто возвращает строку формата «путь к каталогу» & "\" & «имя файла». ■ CopyFile «путь и имя копируемого файла», «путь и имя нового файла», «флаг перезаписи» — копирует файл, указанный в первом входном параметре, туда, куда указывает второй входной параметр (и, если необходимо, меняет имя файла). При этом третий входной параметр определяет, будет ли перезаписываться файл, если он уже существует. Если значение третьего входного параметра равно false, то в случае существования файла в каталоге назначения будет происходить ошибка и файл копироваться не будет. Если же значение третьего входного параметра равно true, то файл, если он существу ет в каталоге назначения, будет перезаписан. ■ CopyFolder «путь и имя копируемой папки», «путь и имя новой папки», «флаг перезаписи» — работа данного метода аналогична работе предыдущего метода, но вместо файла он копирует папку. ■ CreateFolder(«путь к новой папке и ее название») — создает указанную во входном значении папку. При этом после своей работы метод возвращает ссылку на объект, указывающий на созданную папку. Данный объект, ссылка на который возвращается, поддерживает несколько методов. Метод возвращает: • Path — путь к созданной папке, если же путь не определен, то папка создана не была; • Size — размер созданной папки и ее содержимого; • Attributes — битовую маску, указывающую, какие атрибуты определены для данной папки; • DateCreated — дату создания папки (как время, так и день, месяц и год создания); • DateLastAccessed — дату последнего доступа к папке (как время, так и день, месяц и год создания); • DateLastModified — дату последнего изменения содержимого папки (как время, так и день, месяц и год создания); • Drive — букву логического диска, на котором расположена папка; • IsRootFolder — значение false, если папка не является корневой; • Name — название папки. Его же можно получить использованием метода ShortName; • ParentFolder — каталог, в котором расположена папка; • Type — тип папки, например, может возвратить значение Папка с файлами; • ShortPath — путь к папке, включая ее имя. ■ CreateTextFile(«путь к текстовому файлу и его название», «флаг перезаписи», «флаг Unicode») — создает указанный текстовый файл и возвращает объект, ссылающийся на созданный текстовый файл. Данный метод требует следующих входных значений: • Путь к текстовому файлу и его название — именно указанный в данном входном значении текстовый файл и будет создан; • Флаг перезаписи — если значение данного флага равно true, то в случае существования указанного в первом входном значении файла он будет перезаписан; • Флаг Unicode — если значение флага равно true, то текстовый файл будет создан с поддержкой Unicode. Созданный после работы данного метода объект также может использовать некоторые методы, предназначенные для работы с созданным файлом. Рассмотрим некоторые из них: • Close — завершить работу с данным файлом; • Column — возвращает количество столбцов, содержащихся в последней строке данного текстового файла; • Line — возвращает количество строк, содержащихся в данном текстовом файле; • Write «текст» — записывает в данный файл указанную строку, но не переходит на следующую строку при окончании записи; • WriteLine «текст» — записывает в данный файл указанную строку и переходит на следующую строку при окончании записи; • WriteBlankLines(количество строк) — записать в файле столько пустых строк, сколько указано во входном значении метода. ■ DeleteFile «путь к файлу» — удаляет указанный во входном значении файл. ■ DeleteFolder «путь к файлу» — удаляет указанную во входном значении папку. ■ DriveExists(«буква диска:») — возвращает значение true, если указанный во входном параметре логический диск существует. Иначе возвращает значение false. ■ Drives(«буква диска:») — возвращает ссылку на объект, с помощью которого можно просмотреть параметры указанного во входном значении диска. Объект, ссылка на который возвращается, поддерживает следующие методы. • AvailableSpace — количество свободного места на логическом диске в мегабайтах. Можно также воспользоваться методом FreeSpace. • DriveLetter — возвращает букву диска (без символа «:»). • DriveType — идентификатор типа диска. Возможны следующие идентификаторы: 0 — неизвестный тип диска; 1 — съемный; 2 — фиксированный; 3 — удаленный; 4 — компакт-диск; 5 — ОЗУ. • FileSystem — название файловой системы, установленной на диске. • Path — путь к диску. • IsReady — определяет, готов ли диск к работе. Например, если данный метод возвращает значение false при работе с оптическим диском, значит, в данном оптическом приводе отсутствует компакт-диск. • SerialNumber — серийный номер диска. • TotalSize — общий размер данного логического диска в мегабайтах. • VolumeName — название метки диска. ■ FileExists «путь к файлу» — возвращает значение true, если указанный во входном значении файл существует. ■ FolderExists «путь к папке» — возвращает значение true, если указанная во входном значении папка существует. ■ GetBaseName «путь к каталогу» — возвращает название конечного каталога в пути, указанном во входном значении. ■ GetDrive «буква диска» — возвращает объект, являющийся ссылкой на указанный логический диск. После получения объекта к нему можно применить те же методы, что и к объекту, получаемому с помощью метода Drives. Например, можно воспользоваться методом TotalSpace, чтобы узнать общий размер диска. ■ GetFile «путь к файлу» — возвращает объект, являющийся ссылкой на указанный файл. После получения объекта к нему можно применить те же методы, что и к объекту, получаемому с помощью метода CreateFolder. Например, можно воспользоваться методом DateCreated, чтобы узнать дату создания файла. ■ GetFolder «путь к папке» — возвращает объект, являющийся ссылкой на указанную папку. После получения объекта к нему можно применить те же методы, что и к объекту, получаемому с помощью метода CreateFolder. На пример, можно воспользоваться методом DateCreated, чтобы узнать дату создания папки. ■ GetFileVersion «путь к файлу» — возвращает версию файла, приведенного во входном значении метода. ■ GetTempName — возвращает имя последнего файла ТМР, создаваемого на данном компьютере. ■ MoveFile «путь и имя файла», «путь, куда файл будет перемещен, а также его новое имя» — перемещает файл, указанный в первом входном параметре, туда, куда указывает второй входной параметр (и, если необходимо, меняет имя файла). ■ MoveFolder «путь и имя каталога», «путь, куда каталог будет перемещен, а также его новое имя» — перемещает каталог, указанный в первом входном параметре, туда, куда указывает второй входной параметр (и, если необходимо, меняет имя каталога). ■ OpenTextFile «путь и имя файла», «флаг открытия файла» — открывает файл, указанный в первом входном параметре, с доступом, указанным во втором входном параметре. Второй входной параметр может содержать следующие значения: • 1 — открыть файл для чтения; • 2 — открыть файл для перезаписи; • 8 — открыть файл для дозаписи (записи в конец файла, то есть, не переписывая его содержимое). При любом способе доступа к файлу метод возвращает указатель на объект, указывающий на открытый файл. Объект, указатель на который был возвращен, поддерживает те же методы, что и объект, получаемый при вызове метода CreateTextFile. Кроме того, если файл открывается с доступом на чтение, то доступны еще и следующие методы: ■ ReadLine — считать значение строки и перейти на следующую строку данного файла; ■ Read(количество символов) — считать первые n символов из строки данного файла; ■ ReadAll — считать все содержимое данного файла; ■ Skip — пропустить данное количество символов; ■ SkipLine — пропустить следующую строку символов; ■ AtEndOfLine — возвращает значение true, если достигнут конец строки; ■ AtEndOfStream — возвращает значение true, если достигнут конец файла. Другие возможностиРассмотрим другие возможности, которые предоставляют объекты сервера сценариев Windows. При этом будут рассмотрены как новые объекты, так и уже описанные ранее, ведь при их описании мы не всегда знакомились со всеми доступными в них методами. Объект WshShellPopup («текст сообщения», «количество секунд», «текст заголовка», «тип окна»)Метод отображает текстовое сообщение, указанное в первом входном параметре. При этом, кроме текста сообщения нужно указать следующие входные параметры. ■ Количество секунд — определяет количество секунд, которое вызванный диалог будет отображаться. По истечении этого времени текстовое сообщение само исчезнет. ■ Текст заголовка — указывает текст заголовка диалога текстового сообщения. ■ Тип окна — константное выражение, определяющее количество кнопок текстового окна, а также тип выводимого окна. Возможны следующие константы (в скобках указаны числовые выражения, которым соответствуют эти константы). Константы количества кнопок. ■ vbOkOnly — отображать только кнопку OK (0). ■ vbOkCancel — отображает кнопки OK и Отмена (1). ■ vbAbortRetryIgnore — кнопки Прервать, Повтор и Пропустить (2). ■ vbYesNoCancel — кнопки Да, Нет и Отмена (3). ■ vbYesNo — кнопки Да и Нет (4). ■ vbRetryCancel — кнопки Повтор и Отмена (5). Константы типа окна. Они могут добавляться к одной из предыдущих констант (например, vbOkOnly + vbCritical). ■ vbCritical — выводит знак ошибки (16). ■ vbQuestion — знак вопроса (32). ■ vbExclamation — знак восклицания (48). ■ vbInformation — знак информации (64). Константы кнопки по умолчанию. Они могут добавляться к одной из предыдущих констант (например, vbYesNoCancel + vbQuestion + vbDefaultButton3). ■ vbDefaultButton1 — первая кнопка имеет фокус (0). ■ vbDefaultButton2 — вторая кнопка имеет фокус (256). ■ vbDefaultButton3 — третья кнопка имеет фокус (512). ■ vbDefaultButton4 — четвертая кнопка имеет фокус (768). Константы модальности. Они могут добавляться к одной из предыдущих констант (например, vbYesNoCancel + vbQuestion + vbDefaultButton3 + vbApplicationModal). ■ vbApplicationModal — окно является модальным для текущего приложения (0). ■ vbSystemModal — для всех приложений системы (4096)
Метод может возвращать константу той кнопки, которую выбрал пользователь. Возможны следующие константы: ■ vbOk — пользователь выбрал кнопку OK (1); ■ vbCancel — кнопку Отмена (2); ■ vbAbort — кнопку Прервать (3); ■ vbRetry — кнопку Повтор (4); ■ vbIgnore — кнопку Пропустить (5); ■ vbYes — кнопку Да (6); ■ vbNo — кнопку Нет (7). CreateShortcut("путь к ярлыку и его имя")Метод создает ярлык, названный в честь входного параметра. При этом следует учитывать, что указанный во входном параметре файл должен завершаться расширением LNK или URL. Вызова данного метода еще не достаточно для создания ярлыка. Метод возвращает объект, после принятия которого именно с этим объектом и ведется дальнейшая работа. Данный объект поддерживает два свойства: ■ TargetPath — определяет путь к файлу, на который будет создаваться ярлык; ■ Save — после вызова этого метода ярлык будет создан. CurrentDirectoryСвойство возвращает текущую директорию, в которой находится сценарий или которая используется в данный момент командной строкой, если сценарий вызывается из командной строки. Рассмотрим пример работы с этим и двумя предыдущими методами. В этом примере будет создан ярлык файла, путь к которому задаст пользователь. При этом ярлык будет располагаться либо в текущем каталоге (если пользователь нажмет кнопку Да), либо в каталоге, который пользователь сам укажет. Листинг 16.2. Работа с ярлыком и текстовым диалогомset wshshell = WScript.CreateObject("WScript.Shell") vibor = wshshell.Popup("Создать ярлык в каталоге " & wshshell.CurrentDirectory & "?", "100", "Создание ярлыка", vbYesNoCancel) select case vibor case vbYes set yarlik = wshshell.CreateShortcut(wshshell.CurrentDirectory & "\eto_yarlik.lnk") yarlik.TargetPath = "d:\aa.bmp" yarlik.Save case vbNo path = InputBox("Введите путь и имя ярлыка","Создание ярлыка", wshshell.CurrentDirectory & "\eto_yarlik.lnk") If path <> "" Then set yarlik = wshshell.CreateShortcut(path) yarlik.TargetPath = "d:\aa.bmp" yarlik.Save Else MsgBox "Ну как хотите…" End if case vbCancel MsgBox "Ну как хотите…" end select EnvironmentМетод предназначен для работы с системными переменными. Системные переменные можно посмотреть в одноименном списке диалога Переменные среды, который отобразится после нажатия кнопки Переменные среды, расположенной на вкладке Дополнительно диалога Свойства системы. Метод также поддерживает некоторые методы, которые будут рассмотрены. ■ Count — возвращает общее количество системных переменных, созданных на данный момент. ■ Length — аналогичен предыдущему методу. ■ Remove(имя переменной) — удаляет указанную системную переменную. ■ Item(имя переменной) — возвращает значение данной системной переменной. Рассмотрим пример работы с системными переменными. Сначала пример узнает общее количество таких переменных, потом пытается считать значение переменной winbootdir (как правило, такая системная переменная всегда присутствует на компьютере), а потом удаляет эту переменную и снова считывает общее количество системных переменных. Листинг 16.3. Работа с системными переменными set wshshell = WScript.CreateObject("WScript.Shell") MsgBox wshshell.Environment.Count MsgBox wshshell.Environment.item("winbootdir") wshshell.Environment.Remove("winbootdir") MsgBox wshshell.Environment.Count Exec (путь и название исполняемого файла)Метод предназначен для выполнения команд и при своем вызове возвращает объект, с помощью которого можно управлять вызванной программой. Данный объект поддерживает следующие методы.
■ Terminate — завершить вызванную программу. ■ ExitCode — код, возвращаемый при открытии программы. Если значение этого кода равно 0, то программа была вызвана успешно. Для этих целей можно также воспользоваться методом Status. ■ ProcessID — возвращает идентификатор, присвоенный нашей вызванной программе. Рассмотрим простой пример работы с данным методом. В этом примере вызывается Проводник, после чего отображается PID созданного нами процесса, а затем процесс завершится. Листинг 16.4. Вызов процессаset wshshell = WScript.CreateObject("WScript.Shell") set prog = wshshell.Exec("explorer.exe") if prog.Status = 0 then MsgBox prog.ProcessID prog.Terminate End if SendKeysРабота этого метода довольно интересна. Он возвращает произвольное значение после завершения работы сценария. Например, если запустить в командном процессоре (cmd.exe) сценарий, содержащий строку wshshell.SendKeys "This message return over by script", то после завершения работы сценария в командном процессоре (то есть в строке для ввода команд командного процессора) появится указанное сообщение. SpecialFoldersМетод предназначен для работы с пользовательскими папками. Он также поддерживает следующие методы. ■ Count — возвращает общее количество пользовательских папок. ■ Length — аналогичен предыдущему методу. ■ Item (индекс) — возвращает путь к папке, определенной данным индексом. Индекс может принимать значения от 0 до общего числа папок (возвращаемое методом Count значение). Рассмотрим пример, отображающий пути ко всем возможным пользовательским папкам. Листинг 16.5. Перечисление пользовательских папокset wshshell = WScript.CreateObject("WScript.Shell") For i = 0 to wshshell.SpecialFolders.Count – 1 MsgBox wshshell.SpecialFolders.Item(i) Next Как обычно, были рассмотрены далеко не все объекты и методы, которые доступны в Windows XP. Например, был пропущен такой интересный и знаменитый объект (знаменитый потому, что в свое время именно он использовался в почтовом черве ILOVEYOU), как объект для доступа к почтовым функциям программы Outlook Express. Объект поддерживает очень много методов, не говоря уже о других объектах Windows XP, поэтому их описание могло вылиться в отдельную книгу. В любом случае, автор рассчитывал создать лишь введение в возможности сервера сценариев Windows. Если эта тема вам интересна, рекомендуется купить отдельную книгу, посвященную только ей. Глава 17Другие возможности Теперь кратко рассмотрим несколько возможностей настройки интерфейса оболочки Windows XP или ее конфигурации без использования реестра, команд rundll32 и всего того, что мы с вами уже рассмотрели. Вкладка Общие диалога Свойства системыСуществует возможность редактирования содержимого вкладки Общие диалога Свойства системы даже без доступа к реестру Windows XP. Плюсом этого метода является больше возможностей, которые с его помощью можно выполнить. Итак, для редактирования содержимого вкладки Общие необходимо создать в каталоге %systemroot%\system32 два файла — oemINFo.ini и Oemlogo.bmp. Второй файл просто является картинкой, которая будет добавлена на вкладку Общие, а пример содержимого файла oemINFo.ini рассмотрим в листинге 17.1. Листинг 17.1. Пример файла oemINFo.ini[Support Information] Line1 = "На правах рекламы:" Line2="Здесь могла бы быть ваша реклама…" Line3 = "…а здесь ваша :-)" [General] Manufacturer = "Parad0x-DeS1gn" Model = "смесь Pentium и Celeron" Назначение ключевых слов данного INI-файла легко понять на примере того, что он делает. Посмотрим на рис. 17.1. Рис. 17.1. Результат применения файлов oemINFo.ini и Oemlogo.bmp Рисунок, отображаемый слева внизу, является файлом oemlogo.bmp, тогда как кнопка Сведения о поддержке создается при помощи блока [Support Information] файла oemINFo.ini, а текст перед названием процессора — при помощи блока [General] файла oemINFo.ini. Файл desktop.iniЕще один интересный специальный файл, с помощью которого можно выполнить настройку оболочки Windows XP. Например, с его помощью можно изменить значок для папки, в которой он будет находиться, создать для нее описание и сделать многое другое. Для примера попробуем изменить изображение для отдельной папки и создать для нее описание. Для этого необходимо сделать следующее. 1. Создать в папке файл с названием desktop.ini (желательно также скрыть его). 2. Присвоить папке атрибут системной. Это выполняется с помощью команды attrib +S «путь к папке». Если вы уже сделали папку системной, а также создали в ней файл desktop с расширением ini, то приведем в листинге 17.2 небольшой пример содержимого файла desktop.ini. Листинг 17.2. Пример содержимого файла desktop.ini[.ShellClassInfo] IconFile = c:\windows\system32\shell32.dll IconIndex = 34 InfoTip = "Здесь находится много файлов, дорогих моему сердцу, поэтому просьба папку не открывать." Назначение ключевых слов данного файла можно понять при взгляде на рис. 17.2. Ключевое слово IconFile указывает путь к библиотеке, содержащей необходимый вам рисунок папки, а ключевое слово IconIndex определяет индекс необхо-димого вам изображения в данной библиотеке. Ключевое слово InfoTip определяет подсказку, отображаемую для данного файла. Рис. 17.2. Использование файла desktop.ini для изменения изображения папки С помощью файла desktop.ini можно также запретить создание в папке других папок и файлов (при этом есть возможность во вложенных папках создать папки и файлы). Для этого необходимо в блоке [.ShellClassInfo] создать следующие строки: UICLSID={7BD29E00-76C1-11CF-9DD0-00A0C9034933} CLSID={FF393560-C2A7-11CF-BFF4-444553540000} После этого рисунок папки изменится, а при попытке записи в папку будет выдаваться сообщение (рис. 17.3). Если же необходимо, чтобы рисунок папки не менялся, то строку CLSID={FF393560-C2A7-11CF-BFF4-444553540000} нужно удалить. Рис. 17.3. Ошибка при создании папки или файла Блок [.ShellClassInfo] может иметь ключевое слово LocalizedResourceName, которое переопределяет название папки. Например, если в файле desktop.ini для нашей папки создать строку LocalizedResourceName=@shell32.dll,-21765, то название папки Doc_Natali изменится на название Application Data. При этом, к сожалению, ключевое слово LocalizedResourceName не поддерживает прямой текст. Другими словами, нужно обязательно указывать текст, хранящийся в какой-либо библиотеке. Но, кроме названия самой папки, с помощью файла desktop.ini можно изменить названия файлов, содержащихся в этой папке. Для этого служит блок INI-файла [LocalizedFileNames]. Он может включать в себя строки формата «истинное название файла»=«библиотека, и индекс нового названия в ней». К сожалению, новые названия прямым текстом указывать нельзя. Например, если в папке содержится файл PICT0412.JPG, то для изменения названия этого файла на Рабочий стол (создать ярлык), нужно воспользоваться строкой PICT0412.JPG=@sendmail.dll, –21. SCF-файлыФайлы с таким расширением являются командными файлами оболочки Windows и используются для различных целей. Например, можно создать файл, который будет сворачивать все окна. Его содержимое приведено в листинге 17.3. Если ввести подобный текст в текстовый файл, а потом присвоить ему расширение SCF, то будет создан соответствующий файл (расширение файла будет скрыто), выполнение которого свернет все окна. Листинг 17.3. Файл для сворачивания всех окон [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop Можно также создать файл для просмотра каналов Интернета. Для этого используется представленный в листинге 17.4 текст. Листинг 17.4. Файл для смены каналов[Shell] Command=3 IconFile=shdocvw.dll,-118 [IE] Command=Channels Можно создать файл для открытия Проводника Windows XP, как показано в листинге 17.5. Листинг 17.5. Открытие Проводника[Shell] Command=2 IconFile=explorer.exe,1 [Taskbar] Command=Explorer Вообще, это довольно интересные файлы, так как они могут хранить любой другой посторонний текст, который не будет влиять на функциональность данных файлов. При этом никому и в голову не придет посмотреть содержимое этих файлов на предмет посторонних записей, поэтому в них можно запросто хранить конфиденциальную информацию. Файл BOOT.INIДанный файл используется при установке нескольких операционных систем семейства Windows на одном компьютере для реализации возможности выбора между ними при загрузке системы. Рассмотрим содержимое этого файла. Файл расположен в каталоге %systemdrive%, хотя наиболее удобным способом его редактирования является стандартная программа msconfig. Она имеет вкладку BOOT.INI, с помощью которой довольно легко работать с этим файлом, если знать его синтаксис. По этой причине сначала рассмотрим синтаксис данного файла. Файл BOOT.INI состоит из двух блоков. Первый из них называется [boot loader] и содержит информацию о времени ожидания выбора пользователем операционной системы, а также об операционной системе, загрузка которой будет выполнена в случае, если пользователь так и не выбрал за предоставленное время конкретную операционную систему. Второй блок называется [operating systems]. В нем находится информация обо всех операционных системах, которые можно будет выбрать для загрузки с помощью списка операционных систем. Посмотрим на листинг 17.6, в котором представлен пример файла BOOT.INI. Листинг 17.6. Пример файла BOOT.INI[boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Windows XP Professional Test" /noexecute=optin /fastdetect multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows XP Tablet PC Edition" /noexecute=optin /fastdetect multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows XP Professional Recent" /fastdetect /NoExecute=OptIn C:\CMDCONS\BOOTSECT.DAT="Windows XP Recovery Console" /cmdcons Boot loaderБлок [boot loader] содержит всего два ключевых слова. ■ Timeout — определяет количество секунд, которые система будет ожидать выбора пользователем загружаемой операционной системы перед тем, как загрузить операционную систему, указанную в ключевом слове default. ■ Default — указывает путь к загружаемой по умолчанию операционной системе (к системному каталогу данной операционной системы). Иными словами, данный путь должен соответствовать одному из путей, указанному в блоке [operating systems] перед символом =. Operating systemsБлок [operating systems] содержит столько строк, сколько операционных систем установлено на компьютере. При этом каждая строка имеет такой формат: «путь к системному каталогу загружаемой операционной системы»=«строка, идентифицирующая данную операционную систему в загрузочном меню» «ключи запуска операционной системы» Как можно заметить из листинга, путь к операционной системе строится весьма необычным образом — не с помощью буквы логического диска, на котором установлена операционная система, а с помощью номера партиции, в которой установлена операционная система, а также номера диска. Если вы не понимаете ничего в таком способе построения пути, то просто можете посмотреть, с помощью какого пути загружалась данная операционная система. Для этого предназначен параметр строкового типа SystemBootDevice, расположенный в ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control. ARC-имена состоят из четырех частей, совместно описывающих букву диска, на котором нужно искать операционную систему. Вкратце рассмотрим эти части. ■ Первая определяет контроллер для данного жесткого диска и может быть равна либо multi (««номер контроллера диска»), либо scsi («номер scsi адаптера в системе»). При этом следует учитывать, что нумерация контроллеров диска начинается с нуля, то есть для первого контроллера диска данная часть будет равно multi (0). ■ Вторая определяет номер диска, подключенного к указанному в первой части контроллеру. Для SCSI-дисков вторая часть равна disk(«номер диска, начиная с нуля»). Если же первая часть равна multi («номер контроллера диска»), то вторая часть всегда должна быть равна disk(0) — она не используется и будет игнорироваться. ■ Третья определяет номер диска, подключенного к указанному в первой части контроллеру. Для SCSI-дисков третья часть всегда равна rdisk(0), так как она не используется, ведь номер диска был задан ранее. Если же первая часть равна multi («номер контроллера диска»), то третья часть должна быть равна disk («номер диска, начиная с нуля»). ■ Четвертая указывает конкретный раздел на жестком диске, в котором содержатся файлы операционной системы, и равна partition («номер раздела, начиная с единицы»). Можно также посмотреть ключи, которые использовались при запуске операционной системы. Для этого предназначен параметр строкового типа SystemStartOptions, расположенный в ветви системного реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control. Теперь поговорим о ключах. Что же они делают? ■ /BASEVIDEO — говорит системе, что данная операционная система должна быть загружена с использованием стандартного графического драйвера vga.sys. Это может понадобиться в случае, когда недавно установленный в операционной системе графический драйвер ведет себя некорректно. ■ /BAUDRATE — определяет скорость передачи в бодах, которая будет использоваться при отладке запуска операционной системы по определенному СОМ-порту. Данный ключ должен использоваться только вместе с ключом /DEBUG. По умолчанию используется скорость 9600 бод для модемного соединения и 19200 бод для нуль-модемного кабеля. ■ /BOOTLOG — установка данного ключа приводит к созданию файла журнала (файл NTBTLOG.ТХТ, расположенный в каталоге %systemroot%) при каждой загрузке операционной системы. В данный файл журнала будет помещаться информация обо всех загруженных при запуске Windows XP драйверах, а также о тех драйверах, загрузить которые не удалось. ■ /CRASHDEBUG — говорит системе, что при запуске данной операционной системы необходимо также запускать отладчик ядра в состоянии ожидания. Это может понадобиться при возникновении аварийной остановки при загрузке операционной системы (чтобы понять причину возникновения экрана BSOD). ■ /DEBUG — при запуске операционной системы также должен быть запущен отладчик, доступ к которому можно получить по СОМ-порту удаленного компьютера. Данный режим может быть полезен при возникновении аварийной остановки при запуске операционной системы. ■ /DEBUGPORT=«COM-порт» — определить СОМ-порт, по которому будет вестись работа с отладчиком при возникновении аварийной остановки. По умолчанию используется порт COM1. ■ /FASTDETECT — говорит о том, что программа ntdetect.com не должна определять установленные на компьютере устройства. Вместо нее это будет делать система Plug and Play. ■ /MAXMEM=«количество мегабайт оперативной памяти» — определяет количество оперативной памяти, которое будет использовать данная операционная система во время своей работы. ■ /NODEBUG — не выводить отладочную информацию на экран компьютера. ■ /NOGUIBOOT — не отображать графическую заставку Windows. ■ /NOSERIALMICE=«COM-порт» — запретить определение мыши на указанных СОМ-портах (СОМ-порты можно писать через запятую), если она там подключена. ■ /SAFEBOOT:«режим» — говорит системе, что данная операционная система должна загружаться в одном из безопасных режимов. При этом доступны следующие режимы: • MINIMAL — обычный безопасный режим; • MINIMAL(ALTERNATESHELL) — безопасный режим с поддержкой командной строки; • NETWORK — безопасный режим с загрузкой сетевых драйверов; • DSREPAIR — безопасный режим для восстановления каталога Active Directory. ■ /SOS — отображать при загрузке операционной системы имена всех запускаемых драйверов. MSconfig.exeС помощью вкладки BOOT.INI все приведенные ключи загрузки можно автоматически добавить к выделенной в данный момент строке операционной системы, не беспокоясь об их корректности. Для этого необходимо сначала выделить строку запуска операционной системы, а потом установить необходимые флажки напротив часто используемых ключей, отображенных на вкладке BOOT.INI программы msconfig. Если какого-то необходимого ключа в данном списке вы не найдете, то можно нажать кнопку Дополнительно, после чего перед вами отобразится список дополнительных ключей. И наконец, можно нажать кнопку Проверить все пути загрузки, чтобы определить, соответствуют ли новые пути загрузки операционных систем (если вы их изменяли) реальному их расположению на жестком диске компьютера. Bootcfg.exeЭто еще одна программа (программа командной строки) для работы с файлом BOOT.INI. Причем данная программа имеет один большой плюс — с ее помощью можно редактировать файл BOOT.INI удаленной операционной системы. Мы не будем вдаваться в подробности работы этой программы, так как работа с ней описана в Центре справки и поддержки. Глава 18Стандартные каталоги Windows и их содержимое Еще одной темой, которая может вас заинтересовать, является содержимое каталогов Windows. Согласитесь, ведь каждый иногда задавал себе такие вопросы: «А зачем нужен этот каталог?» «А зачем нужно столько много каталогов?» «А зачем нужны эти файлы?» Наконец, попробуем разобрать назначение если не всех стандартных каталогов Windows и файлов в них, то многих из них. ■ %systemroot%\$название обновления$ — папки создаются устанавливаемыми на компьютер пакетами обновлений Windows XP и предназначены для возможности удаления установленного обновления (откат к предыдущему состоянию). Как правило, внутри таких папок есть программа, удаляющая обновления, но можно воспользоваться и диалогом Установка и удаление программ. ■ %systemroot%\CURSORS — хранит доступные на компьютере файлы указателей. Чтобы можно было установить свой указатель, нужно созданный файл указателя поместить в эту папку. ■ %systemroot%\FONTS — содержит все установленные на компьютере шрифты. Чтобы установить шрифт, нужно в меню Файл данной папки выбрать команду Установить шрифт. ■ %systemroot%\Inf — включает в себя все установленные на компьютере INF-файлы. Данная папка скрыта. ■ %systemroot%\Installer — хранит большинство из пакетов установщиков Windows, которые вы когда-либо инсталлировали на компьютер. Если вам необходимо установить или переустановить какую-нибудь программу, инсталлируемую при помощи MSI-пакетов, и при этом вы не имеете ее установочного диска, но раньше уже устанавливали эту программу, то можно попытаться найти соответствующий установочный файл в данной папке. По умолчанию эта папка скрыта, а пакеты, которые в ней содержатся, имеют числовые номера (а не реальные номера, которые им были даны), поэтому самым простым способом определить принадлежность пакета является вкладка Сводка диалога Свойства пакета. ■ %systemroot%\LastGood — если в системе присутствует эта папка, то она может хранить копии различных файлов. Сейчас администраторы многих компаний удаляют стандартные игры с пользовательских компьютеров. Но даже после их удаления копии могут находиться в нескольких различных местах файловой системы Windows XP. Например, в этой папке или в папке, используемой для хранения точек восстановления программой Восстановление системы, и папке, используемой службой индексации. ■ %systemroot%\ntds — содержит файлы базы данных и журналы каталога, используемые контроллером домена Active Directory. Данный каталог является критически важным для работы контроллера домена. ■ %systemroot%\sysvol — используется для тиражирования файлов между контроллерами доменов Active Directory. Он также используется службой индексирования. ■ %systemroot%\repair — хранит архивные копии файлов кустов реестра, создаваемых ASR при работе программы архивации ntbackup.exe и используемых ею при восстановлении системы. Данный каталог также хранит некоторые файлы, не относящиеся к кустам реестра. • autoexec.nt — используется по умолчанию для инициализации среды MS-DOS при восстановлении системы. • config.nt — применяется по умолчанию для инициализации среды MS-DOS при восстановлении системы. • setup.log — хранит перечень всех файлов, которые были установлены при установке операционной системы (описывается только содержимое каталога Windows и его подкаталогов). • secDC.inf — включает в себя параметры безопасности для доменных контроллеров, которые будут к ним применены после восстановления системы. • secSetup.inf — содержит параметры безопасности по умолчанию, которые будут применены после восстановления системы. • smss.ASR — является обычной программой smss.exe, расширение которой было изменено. Smss.exe — диспетчер сеансов, начинающий работу при входе пользователя в систему и управляющий запуском различных сервисов и служб. • NTDLL.ASR — является копией библиотеки ntdll.dll, расширение которой было изменено. В этом каталоге также содержатся файлы кустов DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM. Их описание будет приведено при рассказе о содержимом каталога %systemroot%\system32\config. ■ %systemroot%\system32\CatRoot — хранит все цифровые подписи драйверов и системных файлов операционной системы Windows (в виде файлов с расширением CAT). Все они хранятся в одном из вложенных разделов данного каталога, название которого создано в формате CLSID-номера ActiveX-объекта (GUID-формате). Кроме цифровых подписей для стандартных драйверов и системных файлов, в этом каталоге также могут находиться цифровые подписи для драйверов и других файлов устройств, которые были протестированы в лаборатории Microsoft и помещены в список HCL (список совместимых аппаратных средств). После успешного тестирования устройства Microsoft передает производителю этого устройства файл каталога (СAT-файл) для его продукции, который впоследствии должен поставляться вместе с каждым экземпляром данного устройства. Именно наличие этого файла каталога и проверяется при установке устройства, если в диалоге Параметры подписывания драйверов установлен переключатель Предупреждать — каждый раз предлагать выбор действия или переключатель Блокировать — запретить установку неподписанного драйвера программного обеспечения. ■ %systemroot%\system32\config — является, наверное, самым важным каталогом в Windows — именно в нем находятся главные файлы кустов реестра. Кроме них, каталог хранит и другие файлы, к реестру не имеющие никакого отношения. Вкратце рассмотрим его содержимое. • AppEvent.Evt — является журналом событий приложений. Именно с ним мы и работали при изучении оснастки eventwvr.msc (Просмотр событий (локальных)►Приложение). • DEFAULT — содержит раздел реестра HKEY_USERS\.DEFAULT.
• DnsEvent.Evt — является журналом событий сервера DNS. В этой книге не рассматривалась возможность работы с журналом сервера DNS, поскольку это не являлось главной темой книги. • FileRep.Evt — представляет собой первый журнал событий репликации. • NTDS.Evt — является журналом событий службы каталогов Windows XP. • NtFrs.Evt — представляет собой второй журнал событий репликации. • SAM — является разделом реестра HKEY_LOCAL_MACHINE\SAM. По умолчанию данный раздел не может просмотреть даже администратор, хотя это может сделать система. Да вам и самим доступно это проверить — просто приспособьте приведенный ранее метод получения прав администратора, если у вас есть права опытного пользователя, не к взлому, а к получению окна редактора реестра, открытого от имени учетной записи системы. • SecEvent.Evt — представляет собой журнал событий безопасности. Именно с ним мы и работали при изучении оснастки eventwvr.msc (Просмотр событий (локальных)►Безопасность). • SECURITY — является разделом реестра HKEY_LOCAL_MACHINE\SECURITY. По умолчанию данный раздел не может просмотреть даже администратор, хотя это может сделать система. Содержимое этой ветви вы также сможете просмотреть, модернизировав метод получения прав администратора, если у вас есть права пользователя. • SOFTWARE — содержит раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE. • SysEvent.Evt — является журналом системных событий. Именно с ним мы работали при изучении оснастки eventvwr.msc (Просмотр событий (локальных)►Система). • System — содержит раздел реестра HKEY_LOCAL_MACHINE\SYSTEM. • Userdiff — используется для обновления профилей пользователей более ранних версий операционных систем с целью их применения в Windows NT 4.0 и в более новых операционных системах Windows. ■ %systemroot%\SYSTEM32\dhcp\Backup — содержит резервную копию базы данных этого DHCP-сервера (DHCP-сервер предназначен для выдачи временных IP-адресов и автоматического конфигурирования стека TCP/IP на компьютерах сети). В резервную копию входят следующие данные: • сведения о выданных IP-адресах и времени окончания их аренды; • настройки параметров данного DHCP (параметрами корпорация Microsoft назвала дополнительные сведения о конфигурировании стека TCP/IP, которые получают компьютеры вместе с IP-адресом); • сведения об областях действия (перечень компьютеров, которые могут воспользоваться услугами данного DHCP-сервера). Интервал обновления резервной копии базы данных DHCP-сервера по умолчанию равен 60 минутам, но его можно переопределить с помощью DWORD-параметра BackupInterval (значение указывается в минутах) из ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DhcpServer\Parameters. ■ %systemroot%\system32\DllCache — содержит копии всех системных файлов Windows XP (не только библиотек, но и программ) и необходим при повреждении или несанкционированном системой изменении оригинального системного файла для его переустановки. Данный каталог сжат и скрыт. ■ %systemroot%\system32\DNS — хранит файлы настройки DNS (служба для трансляции символьных адресов компьютеров (например, www.mail.ru) в числовые IP-адреса (например, 192.100.1.34) или, если используется зона обратного разрешения, наоборот), а также сами файлы зон данного DNS. Файлы зон являются обычными текстовыми файлами с расширением DNS, которые содержат ресурсные записи (существует много типов ресурсных записей, но наиболее используемыми являются записи типа А, которые как раз и предназначеныдля трансляции символьных адресов в числовые) только о компьютерах данной зоны DNS. Следует учитывать, что способ хранения зон в виде текстовых файлов считается устаревшим. Если в сети используется Active Directory, то предпочтительнее хранить зоны в виде объектов объекта контейнерного типа dnsZone, что дает определенные преимущества. ■ %systemroot%\system32\IAS — содержит две очень интересные системные базы данных, описывающие те или иные разрешения для протоколов, сервисов, а также сведения о различных используемых в системе свойствах. ■ %systemroot%\system32\restore — хранит файлы программы Восстановление системы, а также саму эту программу (rstrui.exe). Одним из наиболее интересных файлов этого каталога является файл filelist.xml, описывающий файлы, каталоги, а также расширения файлов, которые не должны входить в точку восстановления или, наоборот, должны входить в точку восстановления. ■ %systemroot%\system32\wins — содержит базу данных сервера WINS. WINS — это сетевая служба, предназначенная для трансляции МАС-адресов компьютеров в NetBios-имена. Если для трансляции имен используется WINS-сервер, то WINS-клиент, установленный на каждом компьютере по умолчанию, при включении компьютера отправляет сообщение WINS-серверу с просьбой выделить ему NetBios-имя для возможности работы в сети. После этого WINS-сервер предлагает компьютеру доступное имя, и, если это имя подходит компьютеру, он его принимает (WINS-клиент может послать несколько сообщений на выделение имени сразу нескольким WINS-серверам, установленным в сети, в этом случае WINS-клиент будет использовать первое полученное имя, а остальные отвергнет). |
|
||
Главная | В избранное | Наш E-MAIL | Прислать материал | Нашёл ошибку | Наверх |
||||
|