Дисковые утилиты

Многие
могут спросить: "Зачем еще нужны какие-то там дисковые утилиты, когда на свете
их существует и так уже немало, и к тому же есть весьма даже мощные?" Да, все
это так. Однако, когда решены глобальные проблемы, можно подумать и о мелких
удобствах (в конце концов, вся наша жизнь состоит из них). Несмотря на то, что
такие мощные программные пакеты как Norton Utilites или PC Tools содержат
множество различных полезных утилит, все же бывают случаи, когда их
использование для решения какой-либо проблемы бывает неудобным или непрактичным:
приходится либо пройти через громадное количество меню, либо набивать длинный
список ключей в командной строке, и поэтому терять кучу драгоценного времени.
Времени, которое могло бы быть сохранено, если бы вы использовали другие менее
общие утилиты. Не стоит забивать гвозди микроскопом, даже если этот микроскоп
очень хороший! К тому же бывают такие ситуации, которые просто не
предусмотрены в этих мощных программных пакетах из-за того, что, либо при их
создании авторы об этом просто не подумали, либо посчитали, что эти ситуации
редко встречаются. А ведь рано или поздно, но это случается, и горе тому
пользователю, который не умеет пользоваться утилитами, подобными DiskEdit'у из
NU! Ведь даже знающий человек тратит на эти ситуации просто уйму времени, не
говоря уже о других людях, не столь хорошо знакомыми с компьютером. Они
вынуждены с этим мириться и, в результате, многое терять... Вот тут-то и
приходят на помощь утилитки, которые на первый взгляд кажутся бесполезными и
ненужными, делая за нас всю малоприятную и кропотливую работу и, что самое
главное, экономя наше время, силы и нервы. В пакет "Extra Disk Utilities" на данный момент (ноябрь 1999
года) входят следующие утилиты: 2) "Transfer System Areas" -
переносит системные области с одной дискеты на другую; 4) "Save User Boot Record" -
сохраняет в файле копию загрузочной записи, чтобы ей потом можно было
пользоваться во всех вышеперечисленных утилитах. Собственно говоря, так как
я работаю только с логическими повреждениями, а не с физическими, поэтому
использовано только абсолютное чтение/запись секторов дискеты (прерывания 25h и
26h). Для получения дополнительной информации (типы накопителей) под DOS
используется прерывание 13h (функции 15h и 08h), а под Windows - чтение из CMOS,
используя порты 70h и 71h. 1) в стиле утилит
MS-DOS'а, запускаемых из командной строки с параметрами; 3) и, наконец, под Windows 3.1/95/98. В результате всего этого
он стал доступен практически всем пользователям PC совместимых компьютеров, без
каких-либо ограничений. 1)
"Turbo Assembler", "Turbo Linker" и "Turbo Debugger" для разработки первого вида
"Extra Disk Utilities" (под DOS); 3) "Borland C++ 3.1" под Windows для
разработки третьего вида (под Object Windows Library 1.0); Восстанавливает логически поврежденную загрузочную
запись (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!", иначе будет выдано сообщение об ошибке. Переносит с одной дискеты на другую логическую структуру исходной
дискеты (Boot Record, FAT) и очищает корневой каталог от записей. В результате
чего получается дискета идентичная исходной относительно логической
структуры. Требуется задать имя исходного диска и имя диска, на который будет
производиться перенос системных областей. Также можно задать: менять или не
менять дискету в дисководе, если используется одно устройство. Этим достигается
то, что можно очистить дискету от записей практически мгновенно (попробуйте
стереть с дискеты около 100 файлов - разница становиться заметной и без замеров
по секундомеру. А если файлов больше?). Технология: считывается с исходной
дискеты загрузочная запись, она анализируется и записывается на дискету-
приемник. Затем, используя полученную информацию, очищаются FAT и корневой
каталог на дискете-приемнике. Если все пройдет успешно, то вернется сообщение
"All rigth!", иначе будет выдано сообщение об ошибке. "Быстрый формат". На самом деле даже слишком быстрый - за 1
секунду можно изменить форматдискеты, например, вместо 1.2 Mb можно мгновенно
получить 800 Kb. Форматирование происходит настолько быстро потому, что его не
происходит - физическая структура остается неизменной, меняется лишь логическая
структура (Boot Record, FAT). Использован принцип предыдущей утилиты, только
загрузочная запись не считывается с дискеты, а задается заранее, как в "Restore
Boot Record". Технология: задается загрузочная запись, она
анализируется и записывается на дискету. Затем, используя полученную информацию,
очищаются FAT и корневой каталог. Если все пройдет успешно, то вернется
сообщение "All right!", иначе будет выдано сообщение об ошибке. Требуется задать имя диска и имя
файла. Технология: с помощью абсолютного чтения с диска (прерывание 25h)
считывается нулевой сектор дискеты, и эти 512 байт записываются в заданный файл.
Если все пройдет успешно, то вернется сообщение "All right!", иначе будет выдано
сообщение об ошибке. Можно задать каталог по умолчанию для файлов форматов,
сохраняемых утилитой "Restore Boot Record". Этот каталог будет присутствовать в
строке для ввода имени файла пользовательского формата. Само собой, при написании любой программы возникают
проблемы большие и поменьше, кое-какие оказываются полностью разрешенными,
некоторые удается ловко обойти, ну и остается малая часть нерешенных или
оставленных до лучших времен. Оказывается, что под Windows прерывание 13h делает не то
же, что под DOS (я так и не выяснил, что именно), поэтому долгое время не
работало определение типов дисководов. Обошел я это дело путем считывания данных
дисководов прямо из CMOS, используя порты 70h и 71h. Форматов дискет
существует просто громадное множество (я могу перечислить около двадцати - это
более-менее нужные), поэтому встал вопрос - как их всех поддерживать? Пришлось
оставить на долю пользователя копировать нужные форматы в файл с помощью
прилагаемой утилиты "Save User Boot Record". Да и тех, что поддерживаются,
слишком много, чтобы всех их держать в полном виде в памяти (7*512 байт = 3584
байта), поэтому пришлось их проанализировать и оставить только различающиеся
байты (15 байт).