Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Dos7book

.pdf
Скачиваний:
76
Добавлен:
09.02.2015
Размер:
5.1 Mб
Скачать

Глава 9: Примеры композиции исполняемых файлов

Autoexec.bat

то есть команду исполнить новый файл AUTOEXEC.BAT начиная с его первой строки. Поскольку имени вызываемого на исполнение файла не предшествует команда CALL, постольку возврат к прежде исполнявшемуся и уже не существующему файлу не предусмотрен. Заметьте, что такую подмену исполняемого файла одноименным другим файлом нельзя осуществить, если не задавать все связанные с подменой операции в одной строке.

Новый файл AUTOEXEC.BAT начнется с тех самых показанных выше трех строк файла $.BAT. При их исполнении буква текущего диска станет значением переменной окружения %DSK%, а затем произойдет безусловный переход на метку L7. Тем самым группа операций само-модификации в строках 3 – 6 исходного текста файла AUTOEXEC.BAT будет навсегда обойдена. Начиная с метки L7 продолжится исполнение тривиальных операций файла AUTOEXEC.BAT, в ходе

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

9.02Командные файлы для отладчика DEBUG.EXE

9.02-01 Сохранение и восстановление boot-сектора

Boot-сектор это первый сектор на каждом логическом диске. Он содержит BPB – блок параметров (A.03-4) диска, а также фрагмент исполняемого машинного кода и спецификации файлов, которым должно быть передано управление при загрузке компьютера. Запись boot-сектора стандартного формата выполняется при каждом форматировании диска программой FORMAT.COM (6.15), а также когда диск делается загрузочным с помощью программы SYS.COM (6.24). Но существуют программы, записывающие и использующие нестандартные boot-секторы, которые нельзя воссоздать обычными средствами MS-DOS7.

Сохранение в файле копии boot-сектора может потребоваться для обеспечения возможности его восстановления после вирусного заражения, повреждения сигналограммы или после перезаписи boot-сектора при организации альтернативной загрузки нескольких операционных систем (пример в разделе 9.11-02). Командный интерпретатор COMMAND.COM прямого доступа к boot-сектору не обеспечивает, но для отладчика DEBUG.EXE (6.05) это простая задача, решаемая исключительно с помощью его встроенных команд. Ниже приведен пример командного файла, который предназначен для исполнения отладчиком DEBUG.EXE с тем, чтобы скопировать содержимое boot-сектора с логического диска C:.

– 479 –

Глава 9: Примеры композиции исполняемых файлов

L CS:100 2 0 1 r BX

0000 r CX 200

n Bootsect.dat w CS:100

q

Первая строка содержит команду считывания (6.05-10) boot-сектора логического диска C: и записи его в память начиная с адреса CS:100. Строки 2 – 5 вводят в регистры BX:CX длину (00000200h = 512 байт) получившегося в памяти блока данных, который надлежит записать в файл. Строка 6 задает имя для будущего файла. Строка 7 содержит команду записи (6.05-19) блока данных из памяти в файл. Последняя строка это команда ("Q") выхода из сеанса работы с отладчиком DEBUG.EXE.

Представленный текст надо набрать с помощью программы текстового редактора (NOTEPAD или EDIT.COM) и сохранить результат в файле с подходящим именем (пусть он называется SAVEBOOT.SCR), созданном в текущем каталоге. Потом этот файл должен быть послан на исполнение отладчику DEBUG.EXE, но нужно иметь ввиду, что исполнение должно происходить в среде MS-DOS, а не в "окне DOS" операционной системы WINDOWS, потому что там прямой доступ к диску перекрыт. Послать командный файл на исполнение можно, например, так:

DEBUG.EXE < SAVEBOOT.SCR

После исполнения в текущем каталоге появится новый файл BOOTSECT.DAT длиной 512 байт, который содержит точную копию boot-сектора с логического диска C:. Аналогично можно скопировать в файл boot-сектор с любого другого существующего логического диска (6.05-10). В частности, для копирования boot- сектора с диска A:, первая строка в файле SAVEBOOT.SCR должна выглядеть так:

L CS:100 0 0 1

Конечно, перед обращением к сменному диску нужно убедиться в том, что этот сменный диск физически имеется в дисководе.

Обратная операция записи данных boot-сектора из файла на диск выполняется с помощью еще более простого командного файла:

n Bootsect.dat L CS:100

w CS:100 2 0 1 q

– 480 –

Глава 9: Примеры композиции исполняемых файлов

Здесь первая строка объявляет имя файла, содержащего блок данных boot-сектора. Этот файл должен находиться в текущем каталоге. Вторая строка считывает данные из файла в память, а третья строка записывает данные из памяти в сектор диска, в данном случае в boot-сектор диска C:.

Представленный текст должен быть набран с помощью текстового редактора и сохранен под подходящим именем, например, RESTBOOT.SCR. Поскольку его исполнение предполагает прямой доступ к диску, постольку следует работать в среде MS-DOS (а не в "окне DOS" операционной системы Windows). Для исполнения командный файл RESTBOOT.SCR нужно послать отладчику DEBUG.EXE через перенаправление ввода, например, так:

DEBUG.EXE < RESTBOOT.SCR

С помощью описанных здесь командных файлов восстановление boot-сектора становится простым делом. Тем не менее следует предостеречь от попыток трансплантации boot-сектора на другой диск. Даже при трансплантации между

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

9.02-02 Сохранение главной загрузочной записи (MBR) в файле

Каждый раз при обычном включении Ваш компьютер загружает установленную операционную систему с жесткого магнитного диска. Эта привычная процедура включает несколько этапов, и одним из важнейших этапов является обращение к главной загрузочной записи (MBR), которая указывает на расположение загрузочного раздела диска и направляет процесс загрузки дальше. Как любая другая запись на диске, главная загрузочная запись подвержена естественной деградации, а также может быть случайно повреждена или намеренно испорчена компьютерными вирусами. В таких случаях приходится загружать компьютер со сменного диска и восстанавливать главную загрузочную запись.

Для восстановления главной загрузочной записи операционные системы Windows-95/98/ME предоставляют программу FDISK.EXE (6.13), но эта программа не восстанавливает таблицу разделов диска, которая находится вместе с главной загрузочной записью в том же физическом секторе диска (A.13-5). Особые виды главной загрузочной записи, которые используются другими операционными системами, программой DDO (Dynamic Drive Overlay) и boot-менеджерами, также не могут быть восстановлены программой FDISK.EXE.

Между тем существует простое и универсальное решение: сохранить файл с копией главной загрузочной записи на сменном носителе дискете, флэш-карте

– 481 –

Глава 9: Примеры композиции исполняемых файлов

или оптическом диске. Тогда Вы всегда сможете восстановить главную загрузочную запись вместе с таблицей разделов по данным из сохраненного файла.

MS-DOS7 не предоставляет специальных средств копирования главной загрузочной записи, но зато предоставляет отладчик DEBUG.EXE (6.05), с

помощью которого можно написать и тут же исполнить последовательность операций, в том числе и такую, которая копирует главную загрузочную запись в файл. Простой вариант текста командного файла с такой последовательностью операций выглядит так:

a 100

 

 

 

mov

DX,0080

;запрос головки 00h

дисковода 80h

mov

CX,0001

;запрос сектора 01h

на цилиндре 00h

mov

BX,0200

;загружать начиная со смещения 0200h

mov

AX,0201

;запрос 1 сектора и

функции AH=02h

int

13

;считывание MBR в память (8.01-46)

mov

[01F6],AH

;код завершения - в

ячейку памяти

ret

 

;кончить исполнение

команды "g =100"

org

130

;начать набор заново с ячейки 130

mov

AL,[01F6]

;код завершения - в

регистр AL

mov

AH,4C

;4C - операция завершения программы

int

21

;исполнение операции DOS (8.02-55)

g =100

 

 

 

n Mbr.dat

 

 

 

r CX

 

 

 

0200

 

 

 

r BX

 

 

 

0000

w CS:0200

d

01F6,L1

g

=130

Представленный здесь текст надо набрать с помощью программы редактирования, как рекомендовано во вводной статье к главе 9. Комментарии справа от знака точки с запятой не исполняются отладчиком DEBUG.EXE, и их можно не набирать. Обратите внимание на наличие пустой строки между командами "INT 21" и "G =100": она играет важную роль (7.01-04) и должна там быть. Закончив набор, сохраните текст в файле, например, под именем

READ_MBR.SCR.

Если Ваш компьютер загружается не с логического диска C:, а с диска D:, E: или другого логического диска, то нужно проверить, на каком физическом

– 482 –

Глава 9: Примеры композиции исполняемых файлов

дисководе находится загрузочный логический диск, например, посредством

команды

FDISK.EXE /status

Из выведенной на экран таблицы Вы определите номер загрузочного физического дисковода, и если это будет не дисковод номер 1, то запрос во второй строке файла READ_MBR.SCR нужно будет исправить: для случая загрузки с дисковода номер 2 надо будет указать код дисковода 81h, для случая загрузки с дисковода номер 3 – код 82h, и так далее.

Теперь уместно пояснить, как действует файл READ_MBR.SCR. Его первая строка "A 100" переключает отладчик DEBUG.EXE в режим ассемблирования с размещением кодов начиная с адреса CS:0100h. Пока сохраняется режим ассемблирования, отладчик позволяет вводить комментарии после знака точки с запятой, и роль команд в строках 2 – 12 ясна из этих комментариев. Более детальные сведения по каждой ассемблерной команде приведены в главе 7. Отладчик DEBUG.EXE переводит команды в две последовательности машинных кодов: одна записывается в память начиная с ячейки 100h, а вторая, объявленная командой ORG в строке 9, записывается начиная с ячейки 130h. Запись кодов в память продолжается до тех пор, пока отладчик не встретит пустую строку 13. Она воспринимается как приказ выйти из режима ассемблирования. Команды в последующих строках не дополняют последовательность машинных кодов, а исполняются сразу.

Команда "G =100" (6.05-07) в 14-й строке запускает на исполнение первую последовательность машинных кодов с адреса CS:0100h. В ходе исполнения

главная загрузочная запись копируется с диска в память и размещается там начиная с ячейки 0200h. Код завершения этой операции временно сохраняется в произвольно выбранной свободной ячейке 01F6h. Исполнение первой последовательности машинных кодов прекращает команда RET (7.03-73) из 8-й строки, которая возвратит управление обратно отладчику DEBUG.EXE.

Отладчик продолжит исполнение с 15-й строки, с команды "N" (6.05-12). Она подготавливает имя для файла, который должен быть создан. Вы можете изменить это имя или указать перед ним путь, если нужно создать файл не в текущем каталоге. В строках 16 – 19 длина создаваемого файла (00000200h) вводится в

регистры BX и CX. Команда "W" (6.05-19) в 20-й строке считывает данные из памяти, начиная с адреса CS:0200h, и записывает их файл, имя и длина которого заданы заранее. Предпоследняя команда "D 01F6,L1" (6.05-04) из 21-й строки покажет на экране код завершения операции считывания с диска, сохраненный в ячейке 01F6h.

Последняя команда "G =130" в 22-й строке запустит на исполнение вторую подготовленную последовательность машинных кодов. В ходе ее исполнения код завершения, сохраненный в ячейке 01F6h, считывается в регистр AL, а потом

– 483 –

Глава 9: Примеры композиции исполняемых файлов

происходит вызов обработчика прерывания INT 21\AH=4Ch (8.02-55), прекращающего сеанс работы с отладчиком DEBUG.EXE. При этом код из регистра AL становится возвращаемым кодом уровня ошибки, который потом можно проверить по условию "if errorlevel" (3.15-03).

Перед исполнением командного файла READ_MBR.SCR нужно убедиться в том, что он находится в текущем каталоге на доступном для записи диске. Если главная загрузочная запись будет сохранена в файле MBR.DAT, то файла с таким именем в каталоге назначения не должно быть, иначе он будет перезаписан без предупреждения. На этом приготовления заканчиваются, и Вы можете послать командный файл на исполнение, например, так:

DEBUG.EXE < READ_MBR.SCR

При исполнении выводится сообщение "Program terminated normally" (= программа завершилась успешно), но оно означает только то, что отладчик снова

взял управление на себя после исполнения первой последовательности подготовленных машинных кодов. Исход попытки считывания с диска выражается кодом завершения двузначным шестнадцатеричным числом в предпоследней выведенной на экран строке. Ненулевое значение кода означает неудачу попытки доступа к диску. При таком исходе файл MBR.DAT будет создан, но он будет содержать только "мусор". По условию "If errorlevel 1" (3.15-03) его следует автоматически удалить. Расшифровка ненулевых значений кода завершения по таблице A.06-1 поможет выяснить причину неудачи.

Значение 00h кода завершения служит свидетельством того, что считывание главной загрузочной записи с диска произведено успешно. В таком случае новый файл с предлагаемым именем MBR.DAT будет содержать копию главной загрузочной записи и таблицы разделов диска. Образец дампа файла MBR.DAT приведен на рис. 12 (в разделе A.13-5).

9.02-03 Восстановление главной загрузочной записи (MBR)

Возникновение сбоев в главной загрузочной записи событие относительно редкое, но от него не застрахован никто. Однажды такое может случиться и с Вами. Тогда надо проверить и исключить несколько других гипотез: неверные установки параметров BIOS, потерю данных в CMOS-памяти, повреждение boot-сектора и т.д. Самый убедительный эксперимент повторное считывание главной загрузочной записи в файл, как было показано в разделе 9.02-02, и сравнение полученной копии с той, которую Вы сделали заблаговременно и сохранили в другом файле. Сравнение можно выполнить с помощью программы FC.EXE (6.12). Если будет выявлено различие, то главную загрузочную запись надо будет перезаписать или восстановить.

– 484 –

Глава 9: Примеры композиции исполняемых файлов

MS-DOS не предоставляет специальных средств восстановления главной загрузочной записи по сохраненной в файле копии, но предоставляет возможность написать командный файл, который заставит отладчика DEBUG.EXE выполнить требуемую работу. Допустим, что этот файл называется WriteMBR.SCR, что файл с копией первоначальной главной загрузочной записи называется MBR.DAT, и что оба этих файла находятся в текущем каталоге. Тогда текст командного файла WriteMBR.SCR может выглядеть, например, так:

a 100

 

 

 

 

mov

 

DX,0080

;запрос головки 00h

дисковода 80h

mov

 

CX,0001

;запрос сектора 01h

на цилиндре 00h

mov

 

BX,0200

;брать данные от смещения 0200h

mov

 

AX,0301

;запрос 1 сектора и

функции AH=03h

int

 

13

;запись MBR на диск

(8.01-47)

mov

 

[01F6],AH

;код завершения - в

ячейку памяти

ret

 

 

;кончить исполнение

команды "g"

n MBR.DAT

 

 

 

 

L CS:0200

 

 

 

 

g =0100

 

 

 

 

d 01F6,L1

 

 

 

 

q

 

 

 

 

Команда

"A

100" в

первой строке представленного командного файла

переводит отладчик DEBUG.EXE в режим ассемблирования, так что команды из строк 2 – 8 не исполняются сразу, а переводятся в машинные коды и записываются в память, начиная с адреса CS:0100. Пока отладчик DEBUG.EXE работает в режиме ассемблирования, он позволяет снабжать каждую строку комментариями, так что миссия команд в строках 2 – 8 вполне ясна из этих комментариев. Встретив пустую строку 9, отладчик DEBUG.EXE выходит из режима ассемблирования, принимает командой "N" (6.05-12) в 10-й строке имя того файла, который надо загрузить, и командой "L" (6.05-10) в 11-й строке загружает этот файл в память начиная с адреса CS:0200.

Команда "G" (6.05-07) в 12-й строке запускает на исполнение подготовленную последовательность машинных кодов, начиная с адреса CS:0100h. Исполнение будет продолжаться до встречи с командой RET (7.03-73) в 8-й строке, которая вернет управление отладчику DEBUG.EXE. Тогда исполнение файла WriteMBR.SCR продолжится со строки, следующей за командой "G", то есть с команды "D 01F6,L1" в 13-й строке; она выведет на экран код завершения, оставленный системой BIOS после вызова прерывания INT13. Последняя 14-я строка с командой "Q" закроет сеанс работы отладчика DEBUG.EXE.

– 485 –

Глава 9: Примеры композиции исполняемых файлов

Конечно, если Ваш компьютер загружается с физического дисковода, которому присвоен не первый номер, то код дисковода "80h" во второй строке должен быть изменен точно так же, как описано в разделе 9.02-02. Когда Вы уверены, что код дисковода указан правильно, что главную загрузочную запись действительно необходимо восстановить, и что все необходимые файлы должным образом подготовлены в текущем каталоге, тогда командный файл WriteMBR.SCR можно послать на исполнение, например, так:

DEBUG.EXE < WriteMBR.SCR

После исполнения на экране отдельной строкой будет показан двухзначный шестнадцатеричный код завершения. Значения кода завершения несложно расшифровать по таблице A.06-1. Значение "00h" будет свидетельствовать о том, что восстановление главной загрузочной записи выполнено успешно.

Примечание 1: проводить эксперименты с файлом WriteMBR.SCR над используемыми дисководами нельзя, потому что из-за случайной ошибки можно потерять доступ к имеющимся логическим дискам.

Экспериментировать можно только если в дисководе заведомо не записано ничего такого, что стоило бы сохранять.

Примечание 2: при исполнении файла WriteMBR.SCR необходим прямой доступ к диску. Поэтому главную загрузочную запись нельзя восстанавливать из "окна DOS" операционной системы WINDOWS, это надо делать в среде MS-DOS7.

9.03Примеры batch-файлов

Интерпретатор COMMAND.COM принимает обычные командные файлы через перенаправление ввода так же, как это делает отладчик DEBUG.EXE (9.02). Однако batch-файлы представляют особый класс командных файлов, которые интерпретатор COMMAND.COM распознает и принимает к исполнению прямо из командной строки, без перенаправления. Более того, в batch-файлах интерпретатор

COMMAND.COM исполняет несколько важных команд (3.02, 3.14, 3.21, 3.27), не

принимаемых к исполнению из обычных командных файлов и из командной строки. Из-за этих причин для исполнения интерпретатором COMMAND.COM сейчас предназначают только такие командные файлы, которые относятся к классу batch-файлов.

Наиболее простым batch-файлом в этой книжке является файл AUTOEXEC.BAT, описанный в разделе 9.01-02. Поэтому здесь далее приведены чуть менее простые примеры batch-файлов. Они показывают приемы batch-программирования, которые могут оказаться полезными для решения многих других задач помимо тех, которые представлены здесь.

– 486 –

Глава 9: Примеры композиции исполняемых файлов

9.03-01 Batch-файл Arc.bat для архивирования.

В компьютерном жаргоне под архивированием понимают сжатие группы файлов в объединенный файл-архив. Такой смысл "прилип" к этому слову давно, когда компьютеры были очень ненадежны, и файлы приходилось часто сохранять (точнее, save = спасать!) в виде объединенного потока на магнитной ленте. С того времени многое изменилось, но интерес к программам архивирования не иссяк. Сжатие объема файлов сейчас актуально из-за ограниченной скорости передачи данных по сетям. Помимо того, представление нескольких файлов одним архивом ускоряет их копирование и дефрагментацию дисков, уменьшает потери дискового пространства в кластерах, а также оказывается очень удобным при поставке больших программных комплектов.

Из множества известных алгоритмов архивирования только два – ZIP и RAR – заслужили широкое признание рядовых пользователей. Алгоритм ZIP разработан Филиппом Кацем в начале 1990-х годов и с тех пор воспроизведен в программах многих других авторов. Рекордной степени сжатия он не обеспечивает, но имеет два других достоинства - скорость и совместимость. Возможность распаковки ZIP-архивов не определяется версией той программы, которая их сформировала. Программы формирования и распаковки ZIP-архивов можно свободно скачать из сети Интернет, например, с сайта http://comp.site3k.net/comp/pkzip.html .

Алгоритм RAR, разработанный Евгением Рошалем в середине 1990-х годов,

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

может подвести Вас в ответственный момент или поставить в неудобное положение перед Вашими адресатами. Чтобы избежать таких неожиданностей, RAR-архивы лучше формировать с помощью не новой, но достаточно хорошей программы RAR.EXE версии 2.50 (1999-го года), которую можно свободно скачать, например,

с сайта http://dosprogram.narod.ru/arc/index.html .

Для удобства пользования архивами файл-менеджер Volcov Commander раскрывает их по нажатию кнопки "мыши" и позволяет обращаться с их содержимым как с файлами в обычных каталогах (подробнее в разделе 6.25-03). Создавать архивы через меню файл-менеджера также намного удобнее, чем из командной строки. Тем не менее посредничество файл-менеджера от ошибок не избавляет, а разбираться с их причинами иногда даже становится труднее. В связи с этим возникла идея написать простой командный файл для проверки параметров, которые файл-менеджер передает вызываемой программе архивирования. Идея была воплощена в виде batch-файла, то есть такого текстового файла, каждая

строка которого является командной строкой для интерпретатора

– 487 –

Глава 9: Примеры композиции исполняемых файлов

COMMAND.COM. Проверочный batch-файл ARC.BAT предотвращал ошибочные вызовы, а выводимые им сообщения помогали быстро исправить ситуацию.

С годами файл ARC.BAT рос и обзаводился новыми проверками, так что теперь их число достигло семи. Когда встал вопрос о том, какой файл предложить в качестве несложного и вместе с тем полезного примера batch-файла, то самым подходящим оказался именно ARC.BAT.

Принцип действия файла ARC.BAT исходит из предположения, что в активной панели файл-менеджера Volcov Commander пользователь набирает правой кнопкой "мыши" группу файлов и каталогов, которые надо поместить в новый архив, а левой кнопкой "мыши" в той же панели выделяет один файл или каталог, имя которого будет присвоено создаваемому файлу архива. Пример такого выделения группы файлов показан на рис. 5 (в разделе 6.25-01). После этого достаточно щелкнуть мышкой по пункту меню, вызывающему файл ARC.BAT – и архив готов. Если в этот момент открыта только одна панель файл-менеджера, то архив будет помещен в тот же каталог. Если открыты обе панели, то каталог назначения укажет противоположная (неактивная) панель.

В ходе изложенной процедуры все состояния панелей и имена выделенных файлов передаются посредством макрокоманд файл-менеджера Volcov Commander, знаки вызова которых объяснены в разделе 6.25-02. Эти знаки указывают в строке вызова batch-файла ARC.BAT в определенном порядке, чтобы каждый

возвращаемый элемент данных был отражен отдельным формальным параметром batch-файла. В частности, для создания архивов типа RAR строка вызова batch-файла ARC.BAT в файле меню VC.MNU должна иметь следующий вид:

@Arc.bat RAR !: !~\ !~ !~@ %: %~\

При исполнении этой строки файл-менеджером Volcov Commander каждый знак вызова макрокоманды будет заменен тем элементом данных, который эта макрокоманда возвратит. Потом строка со всеми выполненными заменами будет передана для исполнения командному интерпретатору COMMAND.COM, который установит должное соответствие между формальными параметрами batch-файла и имеющимися в командной строке элементами данных. В тексте batch-файла места подстановки значений формальных параметров обозначаются цифрами от 0 до 9 с предшествующим знаком процента (2.03-03), причем цифра это порядковый номер элемента данных в командной строке. При показанном порядке элементов данных формальные параметры получат вот какие назначения:

%0 – имя исполняемого файла (ARC.BAT) %1 – RAR (или ZIP): тип создаваемого архива %2 – буква диска из активной панели

%3 – путь к каталогу, открытому в активной панели %4 – имя файла, выделенного левой кнопкой "мыши"

– 488 –

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]