← Сентябрь 2001 → | ||||||
1
|
2
|
|||||
---|---|---|---|---|---|---|
3
|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
25
|
26
|
27
|
28
|
29
|
30
|
За последние 60 дней ни разу не выходила
Сайт рассылки:
http://rusfaq.ru
Открыта:
28-06-2000
Статистика
0 за неделю
Ассемблер? Это просто! Учимся программировать № 31
Дизайн
рассылки разработан для Microsoft Internet Explorer 5.0+
при разрешении экрана 800х600 точек
Сайт
подписчиков Архив выпусков |
Ассемблер?
Это просто! Учимся программировать Выходит с июня 2000 года |
Автор: Калашников Олег |
Выпуск №
31
Часть I.
Теория
23
сентября 2001 года
Сегодня в номере: |
В первой части настоящего выпуска мы рассмотрим теорию. Много теории. Можно было, конечно, и код программ привести, но это, поверьте, лишнее. Вы уже довольно-таки неплохо освоили Ассемблер и сможете написать практически любую программу. Сейчас самое главное - получить достаточно теоретических знаний. Программы же вы сможете написать без особого труда. Некоторые процедуры будут также изложены в окончательной версии оболочки, которая будет уже во второй части (подробнее читайте дальше).
Сегодня мы рассмотрим структуру файловой системы (как на диске располагаются файлы, принципы восстановления файлов), возможную защиту от вирусов, таблицу разделов жесткого диска, загрузочный сектор, FAT и пр. Конечно, вам придется воспользоваться и некоторыми программами (я рекомендую Norton Utilities), которые помогут разобраться в том, что написано в настоящем выпуске, а также дадут более полное представление о структуре файлов и каталогов.
Все, что необходимо знать о расположении файлов, я постарался собрать в этой части. Без сомнения, я скорее всего что-то упустил, забыл. Если так, то в следующей части обязательно освещу.
А теперь в путь, уважаемые читатели!
Уважаемые читатели!
Настоящий, 31-ый номер рассылки, завершает серию выпусков по программированию на Ассемблере под операционную систему MS-DOS. Предыдущие номера можно скачать на сайте http://www.Kalashnikoff.ru. К сожалению, у меня временно нет мощной линии выхода в Интернет для высылки предыдущих выпусков (общий объем запросов достигает 10-15 Мб информации), поэтому высылка предыдущих выпусков по почте (как это раньше постоянно практиковалось) временно отложена. Архив занимает приблизительно 450 Кб и включает в себя необходимую информацию для новичков, предыдущие выпуски рассылки, а также файлы-приложения к ним для теоретического изучения. Программы, дополнительная информация и пр. также выложены на сайте.
Очередной, 32-ой номер, выйдет после некоторого перерыва, в котором будет рассматриваться программирование на Ассемблере под ОС Windows. Однако, выпуски будут строится с расчетом на то, что читатель уже знаком с основами программирования на Ассемблере, которые приводятся в предыдущих выпусках. Поэтому настоятельно рекомендуется внимательно изучить все номера настоящей рассылки. Дополнительная информация находится в файле "Информация для новеньких.htm", которая входит в архив.
Увлекательного Вам изучения!
Новостей у нас как всегда много. Начну с главной.
1.
Как видите у нас очередной раз изменился
внешний внешний вид рассылки. Не знаю, на
сколько удобно это будет для чтения, но, тем
не менее, рискнул попробовать. Оценить вам.
Пишите, если вы считаете, что новый дизайн
затрудняет чтение или не совсем приятен для
глаз. Буду менять.
Настоящий выпуск разбит на две части: в
первой (теоретической) идут новости, обзор
готовой оболочки, антивирусные дополнения,
файловая система, заключительная часть к
курсу и пр., а во второй (практической) - полный
ассемблерный файл нашей оболочки.
2. В самом ближайшем будущем у меня вновь появится выход в Интернет, и я смогу отвечать на ваши письма и предложения, а также продолжу разработку новой программы для экспертных групп, обновлю дизайн сайта (наконец-то нашел время и разобрался с PhotoShop!), постараюсь делать выпуски интереснее, насыщеннее и чаще.
3.
Полностью изменена концепция и структура
готовящейся книги. Я решил, что лучше будет
сделать все-таки два тома, полностью
посвященные
реальному режиму (сегментация памяти, стек,
доступ к XMS-памяти, sVGA и пр.) и MS-DOS 7.0 (все его
новые функции и возможности). Кроме того, в
первом томе будет рассматриваться
программирование на Ассемблере "с нуля"
(по образу и подобию настоящей рассылки), а
во втором - в большей степени справочник для
программиста: прерывания и функции DOS и BIOS,
таблицы кодов символов, основные команды процессоров 8086 -
80486 (включая FPU -
сопроцессор), подробные описания к ним с
краткими примерами и многое другое, что не
затрагивалось в рассылке. Более того, в
книге исправлены все мои ошибки и упущения,
добавлено дополнительного материала, удалено
лишнее, приведены некоторые ваши письма и
мои комментарии к ним, наиболее интересные
вопросы подписчиков и ответы экспертов на
них из рассылки FAQ. Примерный объем книги - 450
страниц.
Под Windows же будет издана со временем другая
книга с соответствующим названием.
Еще добавлю, что книга в большей степени
готова, и уже достигнуто соглашение с
издательством на издание тиражом как
минимум в 5.000 экземпляров. Некоторую часть я оставлю себе
и буду высылать тем, кто не сможет ее
приобрести в своем городе и выразит желание
с ней ознакомиться.
Первая часть первого тома (измененная и
существенно дополненная) находится в
архиве на сайте. Более того, обновлены файлы-приложения
и описания в них, исправлены многие ошибки и
опечатки. Желающие могут скачать новый
архив на сайте (теперь - 450 Кб).
4. Сегодняшний выпуск рассылки последний. Мы полностью прошли курс по основам программирования на Ассемблере под MS-DOS. Тем не менее, настоящая рассылка будет продолжать свое существование и дальше. Раньше я планировал закрыть эту рассылку и открыть новую под Windows. Однако решил-таки ее оставить и продолжать изучение языка Ассемблера под Windows в этой же рассылке.
5. Честно говоря, очень тяжело все полностью делать самому: обновлять сайт, архив выпусков, печатать книгу и рассылки, писать программу для экспертных групп, менять дизайн и пр. Очень надеюсь, что мне когда-нибудь удастся найти единомышленников в этой области, которые смогут оказать посильную помощь в свободное время и внести вклад в "продвижение Ассемблера в массы". Более того, если у вас есть иные идеи как по программированию, так и по другим темам, то буду рад сотрудничеству в той или иной области. Жду ваши письма с реальными предложениями по адресу: Help@Kalashnikoff.ru. Не обещаю мгновенного ответа, т.к. пока не имею выхода в Интернет, но все ваши письма со временем обязательно прочту и отвечу. Можете также звонить по телефону (095) 492-23-53 в любое время.
6.
Еще хотелось бы обратиться к вам с такой
необычной просьбой. Возможно, у кого-то из вас
завалялся дома старенький Notebook (80486 или
Pentium-100 Mhz), на котором можно работать с MS Word 98
(моего прежнего настольного компьютера - 486 DX2-66, 8 Мб ОЗУ -
вполне хватало). Если
"чемоданчик" вам пока не нужен, то я с
огромным удовольствием купил бы его (взял
напрокат или
приобрел в подарок, если не жалко).
Спрашивал у своих знакомых и очень долго
искал
нечто подобное в объявлениях, но так и не
смог найти ничего подходящего (продают как
правило уже Pentium-200 MMX и выше, что мне пока не по
карману), да и времени нет покупать
постоянно газеты и обзванивать продавцов-перекупщиков.
Не известно, что еще "подсунут". Ноутбук очень
нужен для ведения рассылки и
редактирования материала. Как только я
обзаведусь новым, то немедленно его верну в
хорошем состоянии.
Если у вас есть что предложить, то позвоните,
пожалуйста, по телефону в Москве 492-23-53.
Отвечу я или моя жена. Можете оставить ей
сообщение, и я обязательно перезвоню.
Заранее благодарен.
Вот мы потихоньку добирались до конца курса программирования на Ассемблере под MS-DOS. Настоящий выпуск разбит на две части. Простейшие функции нашей оболочки уже написаны и многократно изучены. Осталось только процедуры копирования файлов с использованием XMS-памяти и запуска программ вставить в общую программу (т.е. в саму оболочку).
Процедуры удаления файлов, перемещения, переименования и пр. не нуждаются в подробных объяснениях. Вы уже имеете неплохой опыт программирования на Ассемблере и можете самостоятельно разобрать перечисленные выше функции. Все они работают очень просто, с использованием соответствующих функций прерывания 21h (удаление, переименование) или комбинирования (последовательного вызова) двух и более готовых подпрограмм (копирование + удаление = перемещение). Однако, все процедуры работы с файлами в нашей оболочке связаны с одной подпрограммой - поиск первого и / или последующих отмеченных пользователем файлов.
Общий принцип работы следующий:
-
Вызываем процедуру поиска первого отмеченного пользователем файла, которая возвращает его имя;
-
Если ни один файл не отмечен, то функция отмечает текущий файл, на который указывает курсор, и возвращает имя этого файла только в случае, если ее вызов происходит первый раз. В противном случае см. п. 6;
-
После того, как получено имя первого найденного файла, вызывается соответствующая процедура (копирования, удаления, переименования и т.п.), в зависимости от того, какое действие собирается провести пользователь над выбранным файлов;
-
После того, как действие завершено (файл скопирован, удален и т.п.), вызывается функция снятия отметки этого файла;
-
Дальше - см. п. 1;
-
Функция выдает сообщение о конце работы (больше нет отмеченных файлов), текущий каталог перечитывается заново и программа ждет дальнейших указаний от пользователя.
Список функции, обрабатываемых нашей файловой оболочкой:
- Копирование файла с использованием XMS-памяти;
- Перемещение файла;
- Удаление файла;
- Запуск файла с расширениями COM, EXE и BAT.
Все дополнительные операции (копирование каталогов с вложенными подкаталогами, выполнение внутренних команд MS-DOS (DIR, COPY и т.п.), загрузка файла с любым расширением с предварительным запуском соответствующей программы-обработчика этого расширения и передачей ему в командной строке имени загружаемого файла (например: prog.asm - ML.EXE prog.asm /AT ; readme.txt - NOTEPAD.EXE readme.txt и т.п.)) вы сможете без труда реализовать самостоятельно, если, конечно, внимательно ознакомились со всеми предыдущими выпусками рассылки. Моя же задача была дать вам основы программирования, научить использовать операторы Ассемблера, открыть возможности операционной системы MS-DOS, показать алгоритмы и принципы их работы. Вам достаточно будет иногда заглядывать в готовый ассемблерный файл оболочки (впрочем, как и любых других программ, рассматриваемых в настоящей рассылке), чтобы "вытащить" из него необходимые подпрограммы, прочитать описания к ним и пр. Как вы уже поняли, написание полноценной файловой оболочки для ОС MS-DOS требует дополнительных усилий. Тем более, что широко известный Norton Commander не сразу начинался с версии 5.0...
Что же касается процедуры редактирования файлов, то можно сказать следующее. Данная процедура довольно сложная и требует много времени для ее написания на чистом Ассемблере. В настоящий момент существует множество внешних мощных многофункциональных редакторов (например, тот же Hacker's View), которые вполне можно привязать к оболочке. Необходимо предоставить пользователю возможность указать полный путь (или просто имя) к текстовому редактору, который будет вызываться при нажатии на F3, с передачей в командной строке текущего файла. Один из алгоритмов редактирования файла читайте ниже.
Аналогичным образом можно поступить и с архивами. Если, например, пользователь пытается посмотреть файл с расширением ZIP, RAR и т.п., то нужно будет загрузить соответствующий архиватор и передать ему имя открываемого файла. Пользователь также должен будет указать путь и имя архиватора, которое сохранится в INI (конфигурационном) файле оболочки и при ее запуске будет автоматически считываться в память. Многие архиваторы позволяют упаковывать файлы, список которых находится в некотором файле, передаваемый им в командной строке с определенными опциями. Например, RAR. Это можно использовать и в своих целях: если пользователь хочет заархивировать отмеченные файлы, то прежде, чем вызвать архиватор, оболочка должна сохранить список отмеченных файлов в каком-нибудь своем файле и передать эти параметры архиватору в командной строке. Поддерживает ли тот или иной архиватор необходимые нам опции, можно посмотреть в его справочной информации (в HELP).
Редактирование файла можно реализовать следующим образом. Отводятся два сегмента, скажем, 64 и 128Кб (один должен быть в два раза больше второго), в меньший из которых загружается файл, а в больший заносятся ссылки (смещения) размером в слово на очередной символ. Вот таблица:
Сегмент с файлом (64 Кб) | На экране | Сегмент смещений (128 Кб) |
Текст | Текст | 0001 0002 0003 0004 0005 FFFF |
Здесь в левой колонке (Сегмент с файлом) загружен файл размером 5 байт ("Текст"), в средней (На экране) - то, как файл будет отображаться на экране, а в правой (Сегмент смещений) расположены 16-и разрядные смещения на каждый символ в сегменте с файлом. Т.е. Символ "Т" следует записывать на диск первым, "е" - вторым, "к" - третьим и т.д. Последнее число (FFFFh) сигнализирует о конце файла. Т.к. файл только что загружен и не редактировался еще, то символы располагаются в памяти последовательно, друг за другом.
Теперь, допустим, пользователь вставил между символами "к" и "с" символ "ц". Вот, как у нас должна измениться правая колонка:
Сегмент с файлом (64 Кб) | На экране | Сегмент смещений (128 Кб) |
Текстц | Текцст | 0001 0002 0003 0006 0004 0005 FFFF |
При сохранении же файла, следует производить запись побайтно, получая необходимое смещение из колонки "Сегмент смещений": первым пишем символ "Т", вторым - "е", третьим - "к", четвертым - "ц" и т.д.
Это один из самых простых и далеко не оптимальных алгоритмов. Вместо вставки смещения можно было просто вставлять сам символ. Попробуйте сами реализовать какой-нибудь алгоритм редактирования файлов. Это будет для вас очень хорошей практикой применения Ассемблера.
Для чего я привел именно этот алгоритм? Дело в том, что ниже в этом выпуске мы рассматриваем таблицу размещения файлов. Принцип хранения очередной порции (очередного сектора) полностью совпадает с данным алгоритмом.
Законченный ассемблерный вариант оболочки выйдет во второй части настоящего выпуска через пару-тройку дней (большой размер ассемблерного листинга не помещается в одной рассылке с теорией). Мне надо будет все скомпоновать, объединить, протестировать, отладить. Если я что-то упустил в этой части, то обязательно напишу в следующей вместе с программой.
1. Как защитить компьютер от заражения его резидентными вирусами.
Любой резидентный вирус должен перехватывать некоторые прерывания для своей активизации в определенный момент или время (как правило, перехватываются следующие прерывания: 21h - сервис MS-DOS, 1Ch - таймер, вызывающийся автоматически прибл. 18,2 раза в секунду, 13h - работа с дисками средствами BIOS, 25h и 26h - работа с дисками средствами MS-DOS). Если вирус не перехватит ни одно прерывание, то он так и останется в памяти, но активизироваться не будет, а, следовательно, и ничего сделать не сможет (вспомните все резидентные программы из рассылки, которые мы рассматривали. Каждый резидент перехватывал то или иное прерывание). Возникает вопрос: как нам сделать так, чтобы вирус не смог перехватить ни одно прерывание?
Самый лучший способ защиты от резидентных вирусов заключается в следующем. Пишется простой резидент, который сразу после загрузки считывает в свой буфер текущее состояние таблицы векторов прерываний при помощи команды MOVS (или подобной ей). Как известно, таблица располагается по адресу 0000:0000h и занимает 256 (кол-во векторов прерываний) * 4 (сегмент + смещение вектора) = 1024 байта. Резидент также следит за тем, вызывает ли кто-нибудь 21h-ое прерывание с числом 4Bh в регистре AH (это может делать, например, Norton Commander, который запускает программу по требованию пользователя). Если так, то после того, как запущенная программа отработает, резидент копирует сохраненную таблицу из своего буфера в таблицу векторов прерываний. Т.о., если какая-либо программа (в т.ч. и резидентный вирус) перехватила какое-либо прерывание, то наш резидент "вырубит" его вызов. Получится, что вирус и находится в памяти, но не может активизироваться.
Настоящий способ имеет два недостатка:
-
Пока работает запущенная зараженная программа, вирус находится в памяти и уже может заражать другие файлы.
-
Если запускается обычный резидент, то наша программа также "отсечет" его, в следствие чего, запущенный резидент также не сможет активизироваться.
Эти недостатки можно исключить, усовершенствовав наш резидент. Например, его можно включить в собственную оболочку, а в ней самой сделать возможность переключения опции сохранения / восстановления таблицы векторов прерываний после каждого запуска программы (ведь перед запуском программы часть любой файловой оболочки так или иначе остается в памяти). Т.о. если пользователь не уверен, что запускаемый файл "чистый", он может установить опцию сохранения и восстановления таблицы векторов прерываний, путем простого нажатия комбинации некоторых клавиш. И наоборот.
Более того. Программа-резидент может получить количество свободной памяти перед запуском программы, и, как только она отработала, проверить, изменился ли объем ОЗУ основной памяти или нет. Если уменьшился, значит в памяти осталась какая-то программа, о чем следует немедленно сообщить пользователю.
Здесь стоит заметить, что не все резидентные вирусы уменьшают объем свободной памяти. Некоторые располагаются в специальных областях либо "обманывают" ОС, не уменьшая память. Но ни один резидентный вирус не сможет запретить нашей программе-резиденту восстановить предварительно сохраненную таблицу векторов прерываний (если, конечно, вирус специально не имеет процедуры обнаружения нашего резидента в памяти. Для этого автору вируса придется сперва разобрать нашу программу, а затем написать обработчик, отключающий наш резидент).
Если вы пишите свою оболочку, то рекомендую включить в нее эту опцию, а затем попробовать ее на любой резидентной программе на компьютере своего друга. Эффект будет потрясающим!
2. Как защитить компьютер от программ-разрушителей дисковой информации.
Как правило, программы для работы с файлами используют прерывание MS-DOS 21h, которое обращается к прерыванию BIOS 13h. Прерывание 13h позволяет читать, писать и форматировать сектор жесткого или гибкого диска. В ПЗУ есть мощные и сложные процедуры для выполнения указанных выше действий. В очень редких случаях программы работают с диском напрямую (т.е. используют свои процедуры чтения / записи секторов). К таким программам можно отнести DiskEditor из утилит Нортона. Вирусы в очень редких случаях прибегают к подобным вещам, т.к. процедура чтения одного сектора довольно-таки громоздка и не всегда универсальна. Тем не менее, такие экзотические вирусы существуют. К сожалению, никакого способа от слежения за ними не существует (если только, конечно, не архивация опасных участков диска: таблица разделов жесткого диска, загрузочный сектор, таблица размещения файлов).
За программами, которые используют прерывание BIOS 13h или DOS 25h (чтение сектора) / 26h (запись сектора) для работы с дисками, легко контролировать. Достаточно перехватить 13h прерывание и следить за вызовом соответствующей функции. Если вызывается функция записи или форматирования, то просто загрузить код ошибки и моментально выйти из прерывания командной IRET. Программа, пытающаяся что-либо записать на диск или его отформатировать, получит сообщение об ошибке и посчитает, что либо диск защищен от записи, либо сектор не найден, либо что-нибудь другое (все зависит от того, какой код ошибки вернет наша процедура).
Можно поступить еще хитрее. Фактически запись / форматирование не производить, но передать программе сообщение об успешном выполнении того или иного действия, при этом зафиксировав попытку записи / форматирования в свой log-файл.
Этот способ можно также включить в свою оболочку, причем в разных вариантах. Например:
- производить запись / форматирование всегда;
- производить запись / форматирование только в оболочке;
- не производить запись / форматирование вообще.
При этом пользователь должен выбрать тот вариант, который ему больше всего подходит в определенное время. Таким образом, можно исключить на 99% вероятность заражения других файлов вирусом, который находится на незнакомой дискете и запускается пользователем.
Обращаю ваше внимание, что все функции работы с дисками и файлами MS-DOS работают с помощью прерывания 13h. Поэтому достаточно перехватить только прерывание BIOS. Подробнее о функциях работы с дисками можно найти в программе HELPASSM, расположенной на сайте Kalashnikoff.ru. В книге также будут подробно освещаться эти процедуры.
Комбинируя первый (см. выше) и второй способы в вашей оболочке или программе, можно довольно надежно защитить компьютер от заражения неизвестным вирусом из неизвестной дискеты и спокойно запускать любые новые программы.
В настоящем разделе мы рассмотрим, что располагается в отдельных участках жесткого и гибкого дисков. Для более детального и практического изучения следует воспользоваться специальными программами (я предпочитаю использовать DiskEdit из пакета известных утилит Нортона (Norton Utilities)). Любому ассемблерщику рано или поздно придется прибегать к помощи этих программ, особенно если он пишет программы для работы с дисками.
Таблица разделов жесткого диска.
После включения или перезагрузки компьютера, первое, что считывается в память, - таблица разделов жесткого диска, представляющая из себя специально написанную программу с информацией о жестком диске. Она выполняет определенные действия, а затем загружает и передает управление загрузочному сектору (см. ниже). Таблица жесткого диска считывается в память всегда (если, конечно, в компьютере присутствует винчестер, который должным образом разбит на разделы), даже если пользователь загружает операционную систему с гибкого диска. Дискеты не содержат эту таблицу, и первое, что на них находится, - это загрузочный сектор.
Таблица разделов хранит в себе информацию о разделах винчестера: название раздела, стартовый сектор, количество секторов и пр. Эту информацию изначально заносит в нулевой цилиндр, нулевую дорожку, первый сектор программа FDISK (или подобная ей) перед тем, как винчестер будет отформатирован. Пользователь может создать всего один раздел (тогда буква С будет относится к жесткому диску, Е - к CD-ROM и к пр. устройствам), а может разбить винчестер на несколько разделов (С, D, E... - жесткие диски, F - CD-ROM и т.п.).
Если вручную или программно обнулить этот сектор, то вся информация о разделах будет уничтожена, вследствие чего операционная система не сможет получит доступ к диску (она вообще не распознает, что это жесткий диск, т.к. программа, расположенная в этом секторе, не загрузится в память). Писать в эту область диска можно только с помощью прерывания 13h или прямого программирования контроллера жесткого диска.
Однако следует иметь в виду, что в случае уничтожения информации из таблицы разделов, пользователь сможет все-таки получить доступ и даже восстановить ее если:
-
он предварительно сохранил таблицу разделов на дискету (это позволяют делать многие специальные программы. Например: Norton Utilities, Nuts & Bolts и пр.);
-
жесткий диск имеет всего один раздел. В таком случае опытный пользователь может вручную записать начальный и конечный сектора напрямую в таблицу разделов (которые известны, т.к. весь диск отведен для одного раздела);
-
получить доступ к файлам с помощью специальных программ (например, DiskEdit из пакета утилит Нортона или в DOS Navigator'е. Кстати, я рекомендую вам поработать с этой программой, которая поможет лучше понять структуру диска и расположение на нем файлов).
В любом случае, на восстановление таблицы разделов жесткого диска может понадобиться много времени и нервов, поэтому эксперименты с ней требуют от программиста двойной бдительности и осторожности.
Загрузочный сектор.
После таблицы разделов следует загрузочный сектор (BOOT-сектор), к которому можно получить доступ не только с помощью прерывания 13h, но 25h (чтение сектора) / 26h (запись сектора) DOS.
Как уже упоминалось выше, и таблица разделов, и загрузочный сектор - это программы, которые загружается перед всеми остальными файлами операционной системы. Чтобы в этом убедиться, а также разобрать программы (например, для изучения их работы, если вы пишите собственную ОС), достаточно прочитать эти сектора в память, сохранить в файле и посмотреть в отладчике или в Hacker's View.
Загрузочный сектор хранит следующую информацию:
Смещение |
Описание |
00h | JMP на метку инициализации |
03h | Идентификатор - содержит сведения о программе, создавшей этот сектор |
0Bh | Количество байт на сектор - как правило 512, хотя есть и 128, 256, 1024 |
0Dh | Количество секторов на кластер |
0Eh | Количество зарезервированных секторов - после них идет таблица размещения файлов (FAT) |
10h | Количество копий таблицы размещения файлов (FAT) - как правило две |
11h | Количество файлов и подкаталогов, которые могут храниться в корневом каталоге - их количество зависит от объема диска |
13h | Всего секторов на диске |
15h | Дескриптор - для жесткого диска - 0F8h, для дискет 3,5 дюйма и CD-ROM - 0F0h |
16h | Количество секторов в FAT |
18h | Количество секторов на дорожку (необходимо для прерывания 13h) |
1Ah | Количество сторон (необходимо для прерывания 13h) |
1Сh | Количество специальных спрятанных секторов (как правило 0) |
24h | Физический номер диска (начиная от 0) |
26h | Расширенная сигнатура загрузочного диска |
27h | Серийный номер тома |
2Bh | Метка тома (может не соответствовать с реальной) |
36h | Идентификатор файловой системы (FAT, FAT32, VFAT и т.д.) |
Boot-сектор создается в процессе форматирования дискеты, причем код программы различается в зависимости от того, какой программой производится форматирование. Например, утилита MS-DOS FORMAT.COM записывает программу, которая выдает на экран сообщение "Non-system disk or disk error" (несистемный диск или диск с ошибкой), если на диске не найдены файлы операционной системы или они находятся в области плохих секторов (не смогли быть полностью прочитаны). После того, как системные файлы загрузились, программа, расположенная в Boot-секторе передает им управление и на этом ее работа заканчивается.
Загрузочный сектор легко восстанавливается программами типа ScanDisk, Norton DiskDoctor и пр.
Таблица размещения файлов (FAT).
Куда сложнее восстановить таблицу размещения файлов (FAT - File Allocation Table). Можно сказать, что 100% восстановлению она вообще не подлежит.
Таблица размещения файлов содержит ссылки на сектора, в которых последовательно находятся очередные порции файлов. Принцип идентичен тому, который описывался выше в разделе "Оболочка SuperShell", редактирование файлов.
Начальный сектор файла находится в том каталоге, в котором он расположен. По сути дела, любой подкаталог (кроме корневого) располагается на диске как обычный файл. В нем содержится следующая информация:
-
имена и расширения файлов и подкаталогов, находящихся в этом каталоге;
-
их размеры, дата и время создания, атрибуты;
-
стартовый кластер файла.
Когда необходимо загрузить некоторый файл (неважно, текстовый, программный или иной), операционная система получает в каталоге, в котором находится этот файл, его стартовый кластер и считывает в память. Если файл имеет больший размер, чем кластер, то ОС находит в таблице размещения файлов следующий кластер, затем следующий и так по цепочке до тех пор, пока не получит сигнал последнего кластера (FFF0h для 16-и битной FAT (FAT16), FFFF:FFF0h для 32-х битной (FAT32)).
Следует отметить, что операционная система для более быстрого доступа к файлам постоянно хранит в памяти заранее считанную таблицу размещения файлов. Любое изменение длины или содержимого файла заносится на диск не только в область данных, но и в FAT, и в каталог, если стартовый кластер или размер файла изменились.
В начальных секторах диска содержится как правило две копии FAT на случай, если одна повредится, то ОС будет использовать вторую копию. При проверке диска специальными программами, происходит сравнение двух копий. Если одна не соответствует другой, то проверяющая программа делает их идентичными, как и должно быть.
Как происходит удаление и восстановление файла?
Вы, вероятно, обратили внимание, что создание и запись файла на диск происходит дольше, чем его удаление. Это связано с тем, что операционная система не очищает заполненные удаляемым файлом сектора, а просто вносит изменения в каталог и FAT. При этом первый символ файла в каталоге заменяется на 0E5h (вспомните программу восстановления удаленных файлов - она запрашивает у пользователя первое имя восстанавливаемого файла), вследствие чего ОС такие файлы уже на экран не выводит, считая их удаленными.
Изменяется также и таблица размещения файлов. Те кластеры, которые отмечены за удаляемым файлом, просто обнуляются, давая возможность записывать на их место другую информацию. Обращаю ваше внимание, что сектора не обнуляются, только FAT! При этом становится возможным восстановление удаленного файла. Но не всегда! Если некоторая другая программа или ее часть уже записалась в освободившиеся сектора, то восстановить файл, естественно, не удастся. Запомните: если вы случайно удалили важный файл, то немедленно прекратите всякую запись на диск, даже загрузку ОС с этого диска, т.к. операционная система сама периодически производит запись (в частности, изменяет SWAP-файл). Лучший способ - загрузиться с другой дискеты, и запустить программу восстановления файлов.
Однако и в этом случае нет 100% гарантии его успешного восстановления. Если диск был сильно дефрагментирован, да и файл имел немаленький размер, то программа восстановления файлов вам вряд ли поможет, т.к. часть файла может находится в начале диска, часть в середине и часть в конце, т.е. разбросана по всему диску. А так как FAT обнулен, то и восстанавливать придется "вручную", используя при этом прямое редактирование диска (например, программой DiskEdit). Но это, скажу вам, дело очень кропотливое и долгое...
"Потерянные кластеры".
Довольно часто на диске возникают т.н. "потерянные кластеры". Это значит, что некоторые кластеры отмечены как используемые (принадлежат) каким-то файлом, но на самом деле никем не задействованы. В таком случае программа проверки дисков, обнаружив потерянные кластеры, преобразует их в файлы в корневом каталоге (просто присваивает им имена) или отмечает как свободные (на выбор пользователя). Потерянные цепочки кластеров возникают в том случае, если в процессе работы внезапно прекратилась подача электропитания.
Как известно, данные не сразу пишутся на диск, а попадают в специально созданную кэш-память (если загружена программа типа SmartDrv). Когда некоторая программа отправила порцию данных на диск, операционная система помещает их в кэш в оперативной памяти, при этом может изменить FAT, корневой каталог и пр., но данные не записываются сразу. Возможен также вариант, когда часть данных записалась, а часть не успела. И если в этот момент пользователь выключит компьютер или нажмет Reset, то на диске появляются эти самые потерянные кластеры.
MS Windows, если работа была завершена "некорректно" (т.е. не через специально предназначенные для выключения питания средства в кнопке "Пуск"), при последующей загрузке системы автоматически запускает ScanDisk, который проверяет целостность файловой системы.
Напоследок еще раз хотелось бы порекомендовать вам поработать с программой DiskEdit. Уверяю вас, что от этого вы ничего не потеряете, даже наоборот. Возьмите чистую дискету, запишите на нее несколько файлов и просматривайте в DiskEditor'е. Вам откроются все секреты файловой системы ОС.
Еще раз отмечу, что нет смысла изучать в рассылке ассемблерный код полноценно работающей оболочки, т.к. ее размер будет слишком велик, да и повторяться придется несколько раз, что сделает выпуски скучными и неинтересными, т.к. не будет в них уже некоторой новизны. Уверен, что вы уже пишите свою некоторую программу (многие также пишут и свою оболочку) на основе изучаемого материала из рассылки. Это очень хорошо! Любой язык программирования нужно не только знать, но и уметь им пользоваться, иметь опыт программирования на этом языке. Для того, чтобы написать простейшую программу, не достаточно знать только операторы языка, нужно уметь их применять на практике, взаимозаменять, разбирать код других программы, изучать алгоритмы. А на это нужно время, терпение и желание. Только так вы сможете достигнуть мастерства в программировании.
В нашей рассылке, с момента выхода ее первого номера, я сам много чему научился, узнал и разобрал для того, чтобы изложить материал по возможности в простой форме для всех желающих выучить Ассемблер. Естественно, я допускал ошибки, промахи и пр., но вы, уважаемые читатели, меня всегда поправляли, указывали на неточности, советовали как вести рассылку. Спасибо всем, кто оставался все время верным читателем и активным членом нашего образовавшегося небольшого клуба программистов. Очень надеюсь, что время, потраченное на создание каждого выпуска рассылки, пошло на пользу не только мне одному, но и всем вам. Я очень рад, что многие открыли для себя новый мир программирования, новые возможности компьютера и провели много интересных минут в своей жизни, сидя перед монитором.
Наш курс по программированию на Ассемблере под ОС MS-DOS подошел к концу. Но это вовсе не значит, что мы расстаемся, что рассылка закрывается. Совсем наоборот (я уже писал об этом выше)! После того, как будет готова книга, я продолжу вести рассылку (примерно в конце октября), только уже на другом уровне - программирование на Ассемблере под ОС Windows. Очень надеюсь, что продолжение рассылки будет таким же интересным (и даже больше!), как и первая ее часть. По крайней мере, я приложу максимум усилий, чтобы заинтересовать вас, уважаемые читатели, как можно больше. Как-никак, а небольшой опыт ведения рассылки у меня уже есть...
Оставайтесь с нами!
С уважением,
Автор рассылки: Электронный адрес: Адрес сайта: ICQ № |
Калашников Олег Assembler@Kalashnikoff.ru http://www.Kalashnikoff.ru 68951340 |
|
По вопросам сотрудничества, рекламы и спонсорства обращайтесь:
- Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
- Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, (095) 492-23-53
Реклама на сайте Kalashnikoff.ru
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу | Рейтингуется SpyLog |
В избранное | ||