Дополнительные дисковые утилиты



“ДОПОЛНИТЕЛЬНЫЕ ДИСКОВЫЕ УТИЛИТЫ”


ПОЧЕМУ И ЗАЧЕМ?

Многие могут спросить: «Зачем еще нужны какие-то там дисковые утилиты, когда на свете их существует и так уже немало, и к тому же есть весьма даже мощные?»
Да, все это так. Однако, когда решены глобальные проблемы, можно подумать и о мелких удобствах (в конце концов, вся наша жизнь состоит из них). Несмотря на то, что такие мощные программные пакеты как Norton Utilites или PC Tools содержат множество различных полезных утилит, все же бывают случаи, когда их использование для решения какой-либо проблемы бывает неудобным или непрактичным: приходится либо пройти через громадное количество меню, либо набивать длинный список ключей в командной строке, и поэтому терять кучу драгоценного времени. Времени, которое могло бы быть сохранено, если бы вы использовали другие менее общие утилиты. Не стоит забивать гвозди микроскопом, даже если этот микроскоп очень хороший!
К тому же бывают такие ситуации, которые просто не предусмотрены в этих мощных программных пакетах из-за того, что, либо при их создании авторы об этом просто не подумали, либо посчитали, что эти ситуации редко встречаются. А ведь рано или поздно, но это случается, и горе тому пользователю, который не умеет пользоваться утилитами, подобными DiskEdit'у из NU!
Ведь даже знающий человек тратит на эти ситуации просто уйму времени, не говоря уже о других людях, не столь хорошо знакомыми с компьютером. Они вынуждены с этим мириться и, в результате, многое терять...
Вот тут-то и приходят на помощь утилитки, которые на первый взгляд кажутся бесполезными и ненужными, делая за нас всю малоприятную и кропотливую работу и, что самое главное, экономя наше время, силы и нервы.


СОСТАВ “EXTRA DISK UTILITES”:

В пакет “Extra Disk Utilities” на данный момент (ноябрь 1999 года) входят следующие утилиты:
1) “Restore Boot Record” - восстанавливает поврежденную загрузочную запись (Boot Record);
2) “Transfer System Areas” - переносит системные области с одной дискеты на другую;
3) “Quick New Format” - изменяет формат дискеты без ее форматирования;
4) “Save User Boot Record” - сохраняет в файле копию загрузочной записи, чтобы ей потом можно было пользоваться во всех вышеперечисленных утилитах.

Собственно говоря, так как я работаю только с логическими повреждениями, а не с физическими, поэтому использовано только абсолютное чтение/запись секторов дискеты (прерывания 25h и 26h).
Для получения дополнительной информации (типы накопителей) под DOS используется прерывание 13h (функции 15h и 08h), а под Windows - чтение из CMOS, используя порты 70h и 71h.


ВИДЫ “EXTRA DISK UTILITES”:

Этот пакет был разработан в трех различных и независимых видах:
1) в стиле утилит MS-DOS'а, запускаемых из командной строки с параметрами;
2) под DOS в интерактивном режиме (Turbo Vision). Полностью аналогично версии под Windows;
3) и, наконец, под Windows 3.1/95/98.

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


ЧТО ИСПОЛЬЗОВАЛОСЬ ДЛЯ РАЗРАБОТКИ:

1) “Turbo Assembler”, “Turbo Linker” и “Turbo Debugger” для разработки первого вида “Extra Disk Utilities” (под DOS);
2) “Borland C++ 3.1” под DOS для разработки второго вида (под Turbo Vision);
3) “Borland C++ 3.1” под Windows для разработки третьего вида (под Object Windows Library 1.0);
4) “WorkShop” для разработки диалоговых окон для Windows.


УТИЛИТЫ:

Restore Boot Record



Восстанавливает логически поврежденную загрузочную запись (Boot Record) на дискете, без повреждения логической структуры дискеты и имеющейся на ней информации.
Требуется задать имя диска (A: или B:), тип формата (180 Kb, 360 Kb, 720 Kb, 800 Kb, 1.2 Mb, 1.44 Mb, 1.6 Mb). Также формат можно задать как “auto detect” (автоматическое определение типа формата) или “user format”. При “user format” надо задать имя файла, содержащего загрузочную запись (512 байт). Поэтому нет ограничения на количество форматов, и стандартно поддерживаются только семь - самых основных. Пользователь может сам создать загрузочную запись, содержащую требующийся ему формат, с помощью утилиты “Save User Boot Record”, описание которой вы найдете чуть дальше.
Технология: с помощью абсолютной записи на диск (прерывание 26h) записывается 512 байт на нулевой сектор дискеты. Если запись пройдет успешно, то вернется сообщение “All right!”, иначе будет выдано сообщение об ошибке.


Transfer System Areas



Переносит с одной дискеты на другую логическую структуру исходной дискеты (Boot Record, FAT) и очищает корневой каталог от записей. В результате чего получается дискета идентичная исходной относительно логической структуры.
Требуется задать имя исходного диска и имя диска, на который будет производиться перенос системных областей. Также можно задать: менять или не менять дискету в дисководе, если используется одно устройство. Этим достигается то, что можно очистить дискету от записей практически мгновенно (попробуйте стереть с дискеты около 100 файлов - разница становиться заметной и без замеров по секундомеру. А если файлов больше?).
Технология: считывается с исходной дискеты загрузочная запись, она анализируется и записывается на дискету-приемник. Затем, используя полученную информацию, очищаются FAT и корневой каталог на дискете-приемнике. Если все пройдет успешно, то вернется сообщение “All rigth!”, иначе будет выдано сообщение об ошибке.

Quick New Format



“Быстрый формат”. На самом деле даже слишком быстрый - за 1 секунду можно изменить формат дискеты, например, вместо 1.2 Mb можно мгновенно получить 800 Kb. Форматирование происходит настолько быстро потому, что его не происходит - физическая структура остается неизменной, меняется лишь логическая структура (Boot Record, FAT). Использован принцип предыдущей утилиты, только загрузочная запись не считывается с дискеты, а задается заранее, как в “Restore Boot Record”.
Требуется задать имя диска и тип формата. Все аналогично утилите “Restore Boot Record” (см. выше).
Технология: задается загрузочная запись, она анализируется и записывается на дискету. Затем, используя полученную информацию, очищаются FAT и корневой каталог. Если все пройдет успешно, то вернется сообщение “All right!”, иначе будет выдано сообщение об ошибке.


Save User Boot Record



Сохраняет в файл загрузочную запись с дискеты, для использования предыдущими утилитами.
Требуется задать имя диска и имя файла.
Технология: с помощью абсолютного чтения с диска (прерывание 25h) считывается нулевой сектор дискеты, и эти 512 байт записываются в заданный файл. Если все пройдет успешно, то вернется сообщение “All right!”, иначе будет выдано сообщение об ошибке.


ОПЦИИ:

Directories



Можно задать каталог по умолчанию для файлов форматов, сохраняемых утилитой “Restore Boot Record”. Этот каталог будет присутствовать в строке для ввода имени файла пользовательского формата.
Опции можно сохранять для дальнейшего использования.


ПРОБЛЕМЫ: РЕШЕННЫЕ И НЕРЕШЕННЫЕ.

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

И вот я хочу поделиться своими проблемами и способами их решения:
? Оказывается, что под Windows прерывание 13h делает не то же, что под DOS (я так и не выяснил, что именно), поэтому долгое время не работало определение типов дисководов. Обошел я это дело путем считывания данных дисководов прямо из CMOS, используя порты 70h и 71h.

? Форматов дискет существует просто громадное множество (я могу перечислить около двадцати - это более-менее нужные), поэтому встал вопрос - как их всех поддерживать? Пришлось оставить на долю пользователя копировать нужные форматы в файл с помощью прилагаемой утилиты “Save User Boot Record”. Да и тех, что поддерживаются, слишком много, чтобы всех их держать в полном виде в памяти (7*512 байт = 3584 байта), поэтому пришлось их проанализировать и оставить только различающиеся байты (15 байт).
Экономия: 3584-(512+7*15) = 2967 байт.

Ну, на этом, пожалуй, и хватит, так как самое основное я уже упомянул, а остальные проблемы не стоит и упоминать (слишком мелкие и давно уже решенные).

Автор выражает благодарность за помощь по подготовке данной статьи своему научному руководителю Вадиму Сергеевичу Рублёву.
1


1