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

Dos7book

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

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

device=\DOS\DRV\Tdsk.exe 0 install=\Command.com nul /low /f /c vol Q:

installhigh=\DOS\DRV\Shsucdx.com /D:?CD001 /L:N /~+ /R /Q installhigh=\DOS\DRV\Ctmouse.exe installhigh=\DOS\DRV\Keyrus.exe

[L048] device=\DOS\DRV\Himem.sys /v

device=\DOS\DRV\Jemm386.exe X=TEST noems verbose include=L104 country=007,866,\DOS\DRV\Country.sys devicehigh=\DOS\DRV\Dblbuff.sys devicehigh=\DOS\DRV\Ifshlp.sys devicehigh=\DOS\DRV\Setver.exe devicehigh=\DOS\DRV\Dvs.sys /D:CD001 devicehigh=\DOS\DRV\Skipdsk.sys Q: device=\DOS\DRV\Tdsk.exe 0

install=\Command.com nul /low /f /c vol Q: installhigh=\DOS\DRV\Shsucdx.com /D:?CD001 /L:N /~+ /R /Q installhigh=\DOS\DRV\Ctmouse.exe installhigh=\DOS\DRV\Keyrus.exe

[L029]

include=L047

[L031]

include=L048

[L104]

accdate C- D- E- F- dos=high,umb,noauto buffershigh=30,0 fileshigh=30 lastdrivehigh=Z fcbshigh=1,0 stackshigh=9,256

[common]

shell=\Command.com \ /E:2016 /L:511 /U:255 /p

Текст файла CONFIG.SYS начинается с секции [menu], содержащей 5 пунктов, каждый со своим заголовком и именем от L029 до L104. Эти имена совпадают с названиями секций файла CONFIG.SYS, которые должны быть интерпретированы

– 539 –

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

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

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

AUTOEXEC.BAT (9.09-02).

При выборе пунктов меню L029, L031, L047 и L048 загружаются почти одинаковые комплекты драйверов, различающиеся только строкой 2 в секциях

[L047] и [L048]. Драйвер UMBPCI.SYS (5.04-04) в секции [L047] обеспечивает доступ за пределы обыкновенной памяти, сохраняя работу центрального процессора в реальном режиме, тогда как в секции [L048] драйвер JEMM386.SYS (примечание 4 к 5.04-02) для обеспечения такого же доступа переключает процессор в режим V86. Обе упомянутые секции включают загрузку драйвера XMS-памяти, драйвера для доступа к дисководам CD/DVD-ROM, драйвера "мыши" и ряда других драйверов. Следует отметить, что драйвер RAM-диска TDSK.EXE, в отличие от большинства других драйверов, загружается в обыкновенную память, и что размер RAM-диска здесь не задан. Если образование RAM-диска будет сочтено целесообразным, то его размер будет задан позже, в ходе интерпретации строк файла AUTOEXEC.BAT (9.09-02).

Существенные различия между конфигурациями, определяемыми пунктами меню L029 – L048, также проявят себя позже, в ходе интерпретации строк файла AUTOEXEC.BAT. Исключением является только конфигурация, задаваемая пунктом меню L104. Соответствующая этому пункту секция [L104] файла CONFIG.SYS не содержит ничего, кроме установок параметров DOS. Файл CONFIG.SYS кончается секцией [common], которая исполняется при любом варианте загрузки. В ней имеется лишь одна командная строка, загружающая командный интерпретатор COMMAND.COM.

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

фактическое размещение используемых драйверов и программ по каталогам загрузочного диска должно соответствовать указанным путям. Изменения структуры каталогов в принципе допустимы, но они затрагивают также условия исполнения файла AUTOEXEC.BAT (9.09-02). Потому такие решения не следует принимать несогласованно.

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

– 540 –

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

9.09-02 Файл AUTOEXEC.BAT с операциями адаптации.

Все специфичные операции исследования дисков и памяти компьютера выполняются в ходе интерпретации строк файла AUTOEXEC.BAT. При исполнении этих операций используется программа REASSIGN.COM (9.06), которую Вы можете сотворить самостоятельно. Полноценной замены для нее, к сожалению, нет.

Для упрощения ориентации в предлагаемом файле AUTOEXEC.BAT используемые в нем метки включают номера строк: например, метка L029 означает 29-ю строку, считая от начала файла. Кроме того, строки, номера которых кратны 10, отмечены соответствующими комментариями.

Локальные переменные файла AUTOEXEC.BAT названы V0 – V8. Одна из них

– V8 – постоянной миссии не имеет. Назначение остальных переменных следующее:

V0 – список дисков, подлежащих тестированию,

V1 – размер наибольшего свободного блока XMS-памяти, V2 – рекомендуемый размер RAM-диска,

V3 – диск, на который предстоит перебазировать DOS, V4 – диск, с которого производится загрузка компьютера, V5 – статус доступности загрузочного диска для записи, V6 – список недоступных или незаписываемых дисков, V7 – список дисков, доступных для записи.

Ниже приведен текст предлагаемой версии файла AUTOEXEC.BAT.

@echo off

if %1"==J" if not %2"==" goto L%2 prompt $p$g

path ; path=\DOS\MS7;\DOS\OTH set V0=C D E F

set V4=33 Reassign.com V4

if errorlevel 2 set V0=%V0% B

rem ================== Line 10 ==================

if errorlevel 1 set V0=%V0% A set comspec=%V4%\Command.com set V1=11111111

set V2=300 Reassign.com V1

if errorlevel 1 if not errorlevel 2 set V2=5600 if errorlevel 2 if not errorlevel 3 set V2=16000

if errorlevel 3 if not errorlevel 100 set V2=32000

– 541 –

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

if errorlevel 100 for %%Z in (1 2) do set V%%Z=

rem ================== Line 20 ==================

if errorlevel

100

if not %config%"==L104"

set config=L047

if

not %config%"==L104"

goto %config%

 

 

for %%Z

in

(3

5 6

7)

do

set V%%Z=

 

 

for %%Z

in

(%V0%)

do

call \Autoexec.bat

J

117 %%Z: Q

if

%V5%"==F" echo

Warning: current disk

%V4% is not writable!

if not %V7%"==" echo Writable disk(s): %V7%

if %V7%"==" echo Warning: no writable disks have been found! goto L104

:L029

rem ================== Line 30 ==================

:L031 set V3=

set ramdrive=?:

%V4%\DOS\DRV\Tdsk.exe %V2% /E /M /F:2

if not %ramdrive%"==?:" if not %ramdrive%"==::" set V3=%ramdrive% if not %V3%"==" if not %V2%==300 goto L086

if not %V3%"==" if %V2%"==300" goto L104 set V1=

echo RAM-disk arranging procedure has failed!

rem ================== Line 40 ==================

goto L047 :L042

for %%Z in (1 1 1 1 1 1 1) do echo= ctty nul

call %V4%\Autoexec.bat J 117 %V3% S ctty con

:L047

:L048

for %%Z in (1 1 1 1 1 1 1) do echo=

rem

==================

Line 50 ==================

for %%Z in (5 6 7) do set V%%Z=

 

ctty nul

 

 

 

for %%Z in (%V0%) do call %V4%\Autoexec.bat J 117 %%Z: V

ctty con

 

 

 

if %ramdrive%"==" set ramdrive=R:

if not %V7%"==" echo Writable disk(s): %V7%

if %V7%"==" echo Writable disks have not been found!

if not %V1%"==" echo Available

XMS-memory is %V1% kb

if %V1%"=="

echo XMS-memory is

unavailable

rem

==================

Line 60 ==================

echo Select one of the shown keys and then press ENTER:

if not %V7%"==" echo

%V7%

- set DOS onto the chosen disk

 

 

 

– 542 –

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

if not %V6%"==" echo

%V6% - retry inaccessible disk(s)

if not %V1%"==" echo

%ramdrive% - set a RAM-disk for DOS

echo

ESC - leave DOS on %V4%, no relocation

echo=

 

 

:L067

 

 

set V3=2

 

 

Reassign.com V3

 

rem

================== Line 70 ==================

if not errorlevel 128 if %V3%"==" goto L067

if errorlevel 128 set V3=

 

if errorlevel 128 goto L104

set V8=%path%

 

path %V3%

 

 

set V3=%path%:

 

path=%V8%

 

 

if %V3%"==%ramdrive%" if not %V1%"==" goto L031

set V8=N

 

 

rem

================== Line 80 ==================

for %%Z

in

(%V6%)

do if %V3%==%%Z set V8=F

if

%V8%==F

goto L042

for %%Z

in

(%V7%)

do if %V3%==%%Z set V8=T

if

%V8%==T

if %V3%"==%V4%" goto L104

if not %V8%==T goto L067 :L086

ctty nul

for %%Z in (. OTH MS7 VC4) do Attrib -h -r -s %V3%\DOS\%%Z\*.* for %%Z in (. ..\TEMP OTH MS7 VC4) do md %V3%\DOS\%%Z

rem ================== Line 90 ==================

for %%Z in (Autoexec.bat Command.com) do copy /B \%%Z %V3%\DOS /Y ctty con

if not exist %V3%\DOS\Command.com set V3=

if %V3%"==" echo Relocation attempt has failed! if %V3%"==" goto L104

echo Copying the following files to disk %V3%

for %%Z in (OTH MS7 VC4) do copy /B \DOS\%%Z\*.* %V3%\DOS\%%Z /Y set comspec=%V3%\DOS\Command.com

%V3%

rem ================= Line 100 ==================

for %%Z in (OTH MS7 VC4) do \DOS\MS7\Attrib +r \DOS\%%Z\*.ini > nul set V4=%V3%

%V3%\DOS\Autoexec.bat J 104 :L104

if %V3%"==" for %%Z in (%V7%) do set V3=%%Z

if not %V3%"==" if not exist %V3%\Temp\nul md %V3%\Temp

– 543 –

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

if not %V3%"==" if exist %V3%\Temp\nul set Temp=%V3%\TEMP

if %Temp%"==" echo Warning: the TEMP variable is not defined! set dircmd= /A /O:GNE /P

rem ================= Line 110 ==================

path=%V4%\DOS\OTH;%V4%\DOS\MS7;%V4%\DOS\VC4;%V4%\;%V4%\DOS

%V4%\DOS\OTH\Blue.com

if not %config%==L104 set VC=%V4%\DOS\VC4 for %%Z in (0 1 2 3 4 5 6 7 8) do set V%%Z=

if not %config%==L104 %VC%\Vc.com /TSR /no2E /noswap goto END

:L117

%comspec% nul /f /c if exist %3\nul cd \DOS if not exist ..\NUL if %4"==Q" goto END

rem ================= Line 120 ==================

if not exist ..\NUL goto L152

%comspec% nul /f /c call %0 J 141 %3 %4 %V4%

if not exist ..\NUL if %3"==%V4%" set V5= if not exist ..\NUL if %4"==S" goto END

if not exist ..\NUL if not %V7%"==" set V7=%3 %V7% if not exist ..\NUL if %V7%"==" set V7=%3

if not exist ..\NUL goto END cd \

rem ================= Line 130 ==================

if not %4"==Q" echo Disk %3 is not writable! > con if %3"==%V4%" set V5=F

if not %4"==S" if not %V6%"==" set V6=%V6% %3 if not %4"==S" if %V6%"==" set V6=%3

if not %4"==S" goto END

echo If disk %3 is write-protected, close protection > con echo hole in its cartridge. Press any key to continue > con pause < con > nul

goto END

rem ================= Line 140 ==================

:L141

set TEMP= %3

ver | shift

if not %4"==" goto END cd %V4%\

if not %3"==V" goto END

echo Disk %2 is writable: > con

dir /a:ARD /-p /v %2\ | %V4%\DOS\MS7\Find.exe "otal d" > con rem ================= Line 150 ==================

– 544 –

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

goto END :L152

cd \DOS

set V8=if errorlevel 15 if not errorlevel 16 cd \ if %4"==S" set V8=if errorlevel 20 cd \

%comspec% /f /c for %%Z in ("Label.exe %3trial" "%V8%") do %%Z if not exist ..\nul if not %4"==S" goto END

if not %4"==S" if not %V6%"==" set V6=%V6% %3 if not %4"==S" if %V6%"==" set V6=%3

rem ================= Line 160 ==================

set V8=Disk %3 either is unformatted or has an improper format if exist ..\nul set V8=Drive %3 probably has no media inside

if %4"==V" set V8=Disk %3 is either unformatted or not inserted echo %V8% > con

cd \

if not %4"==S" goto END

echo Insert proper media and press any key to continue > con pause < con > nul

:END

Особенности данного файла AUTOEXEC.BAT начинаются с условного перехода во 2-й строке, который позволяет рекурсивно вызывать встроенные подпрограммы. Однако условия перехода заданы так, что при первой интерпретации файла AUTOEXEC.BAT этот переход заведомо не исполняется.

Далее производится присвоение значений нескольким переменным окружения. Значение переменной PATH, присваиваемое в 5-й строке, не окончательное: оно будет действовать только до перебазирования DOS, а потом будет заменено на значение, включающее окончательные спецификации диска.

Программа REASSIGN.COM вызывается в первый раз в 8-й строке для того, чтобы определить текущий диск. Оставляемый программой код уровня ошибки (errorlevel) помогает скомпоновать список дисков, подлежащих тестированию. Второй раз программу REASSIGN.COM вызывают в 15-й строке, чтобы выяснить доступность XMS-памяти и определить размер наибольшего свободного XMS-блока. На сей раз оставляемый код уровня ошибки подсказывает рекомендуемый размер RAM-диска, который позднее может быть создан. Если же обнаружится, что XMS-память вообще недоступна, то переменной CONFIG в 21-й строке будет дано новое значение, которое предотвратит попытки создания RAM-диска, заведомо обреченные на неудачу.

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

– 545 –

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

конфигурационном меню, поскольку этот выбор отображен значением переменной CONFIG. Если избран вариант быстрой загрузки, то переход выводит на метки L029 или L031. Там в 34-й строке драйвер TDSK.EXE создает RAM-диск предписанного объема и делает букву RAM-диска значением переменной RAMDRIVE. Уместно напомнить: букву RAM-диска в значение переменной записывает только драйвер TDSK.EXE версии 2.42. В случае применения более ранней версии или других подобных драйверов (BITDISK.EXE, SRDISK.EXE, XMSDSK.EXE) надо просто присвоить значение R: переменной RAMDRIVE посредством команды SET (3.26). При этом, понятно, способность адаптации к непредвиденному назначению RAM-диску другой буквы будет утрачена.

Когда предписанный объем RAM-диска мал, тогда в 37-й строке выполняется переход к завершающей части файла AUTOEXEC.BAT, так что RAM-диск будет использован только для записи временных файлов. Но обычно объем RAM-диска вполне достаточен для размещения DOS, и тогда в 36-й строке происходит переход на метку L086, где осуществляется перебазирование DOS на RAM-диск.

Процедура перебазирования DOS построена так, чтобы ее можно было бы применить не только к RAM-диску, но и к любому непустому физическому диску. Для того она начинается со снятия файловых атрибутов в каталогах назначения, потому что иначе обычные средства DOS не смогут перезаписать одноименные файлы в каталогах назначения и даже не смогут обнаружить их наличие. Операция в строке 89 создает типичную структуру каталогов назначения, если изначально она не существовала. Затем в каталог %V3%\DOS копируются файлы AUTOEXEC.BAT и COMMAND.COM. Если они скопированы успешно, то в строке 97 остальные файлы DOS копируются в соответствующие каталоги. Переменным COMSPEC и V4 присваиваются новые, скорректированные значения. Команда в строке 103 передает управление не файлу AUTOEXEC.BAT, а его копии, находящейся в каталоге назначения %V3%\DOS, причем так, что возврат к исполнению первоначального файла никогда уже не произойдет. Исполнение копии файла AUTOEXEC.BAT начнется со строки 105.

Если пользователь с самого начала изберет конфигурируемый вариант загрузки, то переход из 22-й строки приведет к метке L047 или L048, где начинается процедура исследования имеющихся дисков. Исследование выполняет подпрограмма L117, являющаяся частью того же файла AUTOEXEC.BAT. Ее рекурсивно вызывает цикл FOR из строки 53, отдельно для каждого тестируемого диска. Подпрограмма L117 предпринимает первую попытку доступа к исследуемому диску в строке 118 чтобы выяснить, доступен ли он для чтения. Если диск не читается, то следует переход на метку L152, где следующая проверка в строке 156 должна отличить несуществующие накопители от тех, в которых носитель записи не форматирован или просто не вставлен. Несуществующие накопители игнорируются, а все остальные причисляются к списку недоступных

– 546 –

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

дисков, представляемому значением переменной V6. Поскольку статус таких дисков может измениться, их проверку потом можно будет повторить.

Доступные для чтения диски затем проверяются на доступность для записи подпрограммой L141, которую вызывает из строки 122 специально загружаемый модуль командного интерпретатора COMMAND.COM. Решающее испытание происходит в строке 144, где промежуточное перенаправление предполагает создание временного файла на испытуемом диске. Если временный файл не удастся создать, то не будет исполнена команда SHIFT в той же строке, нумерация формальных параметров не изменится, подпрограмма L141 завершится в строке 145, и команды в строках 133 – 134 занесут букву испытанного диска в список недоступных дисков. Если же временный файл удастся создать, то он сразу же будет автоматически удален, но команда SHIFT будет исполнена, команда ECHO в строке 148 выведет на экран подтверждающее сообщение, и команда DIR в 149-й строке покажет использование дискового пространства. В строке 151 исполнение подпрограммы L141 закончится, и буква испытанного записываемого диска в строках 126 – 127 будет добавлена к списку доступных дисков, представляемому значением переменной V7.

Исследование диска подпрограммой L117 заканчивается либо в строке 128 либо в строке 135 – это зависит от результата тестирования. В обоих случаях управление возвращается к циклу FOR в строке 53. Он продолжит вызывать подпрограмму L117 до тех пор, пока не подойдет к концу список подлежащих исследованию дисков, представляемый значением переменной V0. Когда все диски проверены,

результаты исследования вместе с перечнем предлагаемых альтернатив будут выведены на экран дисплея командами в строках 56 – 65. Пользователю предлагается выбрать наиболее удачный вариант загрузки. Ответ пользователя воспримет программа Reassign.com (9.06) в строке 69. Поскольку ответ может быть выражен как заглавной, так и строчной буквой, команды в строках 74 – 77 преобразуют любую принятую букву в заглавную, а потом условные команды в строках 78 – 85 выполнят волю пользователя.

Проверка в строке 78 выясняет, не выбрал ли пользователь вариант перебазирования DOS на RAM-диск. Если да, то следует переход на метку L031, и

все дальнейшие события повторят сценарий быстрого перебазирования на RAM-диск точно так, как он был описан выше. Если пользователь принял иное решение, то цикл FOR в строке 81 выяснит, не выражает ли оно желание повторно тестировать один из недоступных дисков. В таком случае последует переход на метку L042, а там команда в строке 45 снова вызовет подпрограмму L117 для повторной проверки избранного диска. Четвертый формальный параметр "S" подпрограммы L117 задает режим более тщательной проверки, отличающийся критериями тестов и выдачей детальных советов по обеспечению доступа к диску. Подпрограмма L117 сделает паузу, чтобы можно было сменить диск или закрыть отверстие защиты от записи в его картридже. Затем в строке 53 последует обычный

– 547 –

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

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

Выбор записываемого диска для перебазирования DOS регистрируется циклом FOR в 83-й строке. В таком случае исполнение проследует через метку L086 в ту часть файла AUTOEXEC.BAT, где выполняется перебазирование, причем оно будет выполнено точно так же, как описанное выше перебазирование на RAM-диск. Важно отметить, что перебазирование DOS не делает избранный диск загрузочным, а просто позволяет продолжить сеанс работы в DOS после изъятия загрузочного носителя записи из того устройства, которое было использовано для загрузки компьютера. Если избранный диск уже был загрузочным, то это свойство не будет утрачено, потому что перебазирование DOS не вносит изменений ни в boot-сектор, ни в комплект файлов корневого каталога.

Диск, с которого компьютер был загружен, вполне может быть доступен для записи, и тогда соответствующая ему буква будет включена в список, представленный значением переменной V7. Однако перебазирование DOS на этот диск не имеет смысла, и его надо предотвратить. Для этого служит проверка в строке 84, которая направляет дальнейшее исполнение на метку L104. Тем самым процедура перебазирования DOS будет обойдена. Так как загрузочный диск был признан доступным для записи, он же будет использован как место для записи временных файлов. К сожалению, на обычных дискетах емкостью 1.44 Мб места для временных файлов всегда недостаточно. Поэтому пользователю предоставлена еще одна возможность обойти процедуру перебазирования DOS: нажатие клавиши ESC вызывает переход от строки 73 на ту же метку L104, но в таком случае будет предпринята попытка перенаправить запись временных файлов на какой-нибудь другой пригодный для записи диск.

Последний пункт в загрузочном меню (9.09-01) - это загрузка без драйверов и без резидентных программ. Такой вариант тоже приводит к той же самой метке L104 через переход со строки 28. Но перед этим в 24-й строке будет вызвана подпрограмма L117, причем ее 4-й параметр Q задаст режим быстрого исполнения.

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

Все варианты загрузки сходятся в конечной части файла AUTOEXEC.BAT на метке L104. Цикл FOR в строке 105 назначает записываемый диск для временных файлов, если такое назначение не состоялось раньше. Операции в строках 106 – 114 присваивают окончательные значения переменным TEMP, DIRCMD и PATH, а также удаляют локальные переменные V0 – V8. Если не избран специальный вариант загрузки L104, то на исполнение будет вызван файл-менеджер Volcov

– 548 –

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