Рефераты. Работа с дисками

Остальная часть таблицы FAT состоит из 12- или 16-битовых ячеек. Каждая

ячейка соответствует одному кластеру диска. Эти ячейки могут содержать

следующие значения:

|FAT12 |FAT16 |Что означает |

|000h |0000h |Свободный кластер |

|FF0h - FF6h|FFF0h - FFF6h|Зарезервированный кластер |

|FF7h |FFF7h |Плохой кластер |

|FF8h - FFFh|FFF8h - FFFFh|Последний кластер в списке |

|002h - FEFh|0002h - FFEFh|Номер следующего кластера в |

| | |списке |

20. Чтение таблицы FAT.

Непосредственный доступ к FAT может потребоваться вам для организации

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

для организации защиты информации от несанкционированного копирования.

Общая схема использования FAT такая:

. Читаем таблицу FAT в память

Обычно FAT располагается сразу после загрузочного сектора (логический

сектор с номером 1). Для точного определения начального сектора FAT следует

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

параметров BIOS. В поле ressecs записано количество зарезервированных

секторов, которые располагаются перед FAT. Поле fatsize содержит размер FAT

в секторах. Кроме того, следует учитывать, что на диске может находиться

несколько копий FAT. Операционная система использует только первую копию,

но обновляет вторую. Другие копии FAT нужны для утилит восстановления

содержимого диска, таких как scandisk.exe . Количество копий FAT находится

в поле fatcnt загрузочного сектора.

. Получаем номер первого кластера файла, для которого необходимо

определить его расположение на диске

. Используем номер первого кластера как индекс в таблице FAT для

извлечения номера следующего кластера

. Повторяем предыдущую процедуру до тех пор, пока извлеченное из FAT

значение не будет соответствовать концу файла

Процедура извлечения номера кластера из FAT зависит от формата таблицы

размещения файлов.

16-битовую таблицу FAT можно представить как массив 16-битовых чисел. Для

определения номера следующего кластера вам надо просто извлечь 16-битовое

значение из FAT, использовав в качестве индекса номер предыдущего кластера.

Для 12-битовой таблицы FAT процедура значительно сложнее. Необходимо

выполнить следующие действия:

. умножить номер начального кластера на 3;

. разделить результат на 2 (так как каждый элемент таблицы имеет длину

1,5 байта);

. прочитать 16-битовое слово из FAT , используя в качестве смещения

значение, полученное после деления на 2;

. если номер начального кластера четный, на выбранное из FAT слово надо

наложить маску 0FFFh, оставив младшие 12 бит, если же номер начального

кластера нечетный, выбранное из FAT значение необходимо сдвинуть

вправо на 4 бита, оставив старшие 12 бит;

. полученный результат - это номер следующего кластера в цепочке, при

этом значение 0FFFh (или другое в диапазоне от 0FF8h до 0FFFh)

соответствует концу цепочки кластеров.

Используя описанные выше процедуры просмотра FAT , вы сможете для каждого

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

помощи прерывания INT 25h вам будет нужно установить соответствие между

номерами кластеров и номерами секторов, в которых располагаются эти

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

размер корневого каталога. Поэтому следующий раздел книги будет посвящен

каталогам и файлам. Там же будут приведены примеры программ для работы с

FAT.

21. Файлы и каталоги.

Вы, конечно, знаете, что файловая система MS-DOS имеет древовидную

структуру. В корневом каталоге располагаются 32-байтовые элементы, которые

содержат информацию о файлах и других каталогах. Для чтения корневого

каталога необходимо определить его расположение и размер.

6.22 Расположение и размер корневого каталога.

Корневой каталог находится сразу за последней копией FAT . Количество

секторов, занимаемых одной копией FAT, находится в блоке параметров BIOS в

загрузочном секторе (поле fatsize), а количество копий FAT - в поле fatcnt

блока BPB . Следовательно, перед корневым каталогом находится один

загрузочный сектор и fatcnt * fatsize секторов таблицы размещения файлов

FAT.

Размер корневого каталога можно определить исходя из значения поля

rootsize. При форматировании диска в это поле записывается максимальное

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

каталоге. Для каждого элемента в каталоге отводится 32 байта, поэтому

корневой каталог имеет длину 32 * rootsize байт.

Корневой каталог занимает непрерывную область фиксированного размера.

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

максимальное количество файлов и каталогов, которые могут быть в нем

описаны.

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

воспользоваться следующей формулой:

RootSecs = sectsize / (32 * rootsize)

В этой формуле sectsize - размер сектора в байтах, он может быть получен из

соответствующего поля загрузочного сектора.

22. Область файлов и подкаталогов.

Вслед за корневым каталогом на логическом диске находится область файлов

и подкаталогов корневого каталога.

Область данных разбита на кластеры, причем нумерация кластеров начинается

с числа 2. Кластеру с номером 2 соответствуют первые секторы области

данных.

Теперь мы можем привести формулу, которая позволит нам связать номер

кластера с номерами секторов, занимаемых им на логическом диске:

SectNu = DataStart + ((ClustNu - 2) * clustsize)

В этой формуле использованы следующие обозначения:

|SectNu |номер первого сектора, распределенного кластеру с номером |

| |ClustNu; |

|DataSta|начало области данных, вычисляется по формуле: ressecs + |

|rt |(fatsize * fatcnt) + (32 * rootsize/ sectsize); |

|ClustNu|номер кластера, для которого необходимо определить номер первого|

| |сектора; |

|clustsi|количество секторов, занимаемых кластером; находится в блоке |

|ze |параметров BIOS. |

23. Дескрипторы файлов.

Как мы уже говорили, любой каталог содержит 32-байтовые элементы -

дескрипторы, описывающие файлы и другие каталоги. Приведем формат

дескриптора:

|Смещение |Размер|Содержимое |

|0 |8 |Имя файла или каталога, выровненное на левую границу и|

| | |дополненное пробелами |

|8 |3 |Расширение имени файла, выровненное на левую границу и|

| | |дополненное пробелами |

|11 |1 |Байт атрибутов файла |

|12 |10 |Зарезервировано |

|22 |2 |Время создания файла или время его последней |

| | |модификации |

|24 |2 |Дата создания файла или дата его последней модификации|

|26 |2 |Номер первого кластера, распределенного файлу |

|28 |4 |Размер файла в байтах |

В любом каталоге, кроме корневого, два первых дескриптора имеют

специальное назначение. Первый дескриптор содержит в поле имени строку: ".

". Этот дескриптор указывает на содержащий его каталог. То есть

каталог имеет ссылку сам на себя.

Второй специальный дескриптор содержит в поле имени строку: ".. ".

Этот дескриптор указывает на каталог более высокого уровня. Если в поле

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

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

корневом каталоге.

Таким образом, в древовидной структуре каталогов имеются ссылки как в

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

проверки сохранности структуры каталогов файловой системы.

6.24 Атрибуты файлов.

Байт атрибутов является принадлежностью каждого файла. Биты этого байта

имеют следующие значения:

|Бит |Описание |

|0 |Файл предназначен только для чтения.В этот файл нельзя писать и его|

| |нельзя стирать |

|1 |Скрытый файл.Этот файл не будет появляться в списке файлов, |

| |создаваемом командой DIR |

|2 |Системный файл. Этот бит обычно установлен в файлах, являющихся |

| |составной частью операционной системы |

|3 |Данный дескриптор описывает метку диска.Для этого дескриптора поле |

| |имени файла и поле расширения имени файла должны рассматриваться |

| |как одно поле длиной 11 байт. Это поле содержит метку диска |

|4 |Дескриптор описывает файл, являющийся подкаталогом данного каталога|

|5 |Флаг архивации.Если этот бит установлен в 1, то данный файл не был |

| |выгружен утилитой архивации |

|6-7 |Зарезервированы |

Обычно файлы имеют следующие атрибуты:

|Атрибут |Описание |

|0 |Обычные файлы (тексты программ, загрузочные модули, пакетные |

| |файлы) |

|7 |Только читаемые, скрытые, системные файлы. Такая комбинация |

| |битов байта атрибутов используется для файлов операционной |

| |системы io.sys , msdos.sys |

|8 |Метка тома. Дескриптор метки тома может находиться только в |

| |корневом каталоге логического диска |

|10h |Дескриптор, описывающий каталог |

|20h |Обычный файл, который не был выгружен программами backup.exe |

| |или xcopy.exe |

6.25 Дескрипторы удаленных файлов.

При удалении файла первый байт его имени заменяется на байт E5h (символ

"х"). Все кластеры, распределенные файлу, отмечаются в FAT как свободные.

Если вы только что удалили файл, его еще можно восстановить, так как в

дескрипторе сохранились все поля, кроме первого байта имени файла. Но если

на диск записать новые файлы, то содержимое кластеров удаленного файла

будет изменено и восстановление станет невозможным.

6.26 Время создания или изменения файла.

Остановимся подробнее на полях времени и даты создания или последней

модификации файла. MS-DOS обновляет содержимое этих полей после любой

операции, изменяющей содержимое файла - создания файла, перезаписи

содержимого файла, добавления данных в файл или обновления содержимого

файла. После обновления файла MS-DOS устанавливает бит архивации 5 байта

атрибутов в 1.

Старшие пять бит содержат значение часа модификации файла, шесть бит с

номерами 5 - 10 содержат значение минут модификации файла, и, наконец, в

младших 5 битах хранится значение секунд, деленное на 2. Для того, чтобы

время обновления файла уместилось в шестнадцати битах, пришлось пойти на

снижение точности времени до двух секунд.

6.27 Дата создания или изменения файла.

Формат даты обновления файла напоминает формат времени. Для того чтобы

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

хранимой в старших семи битах, значение 1980. Поля месяца и дня каких-либо

особенностей не имеют, они полностью соответствуют календарной дате.

6.28 Длина файла.

Поле длины в дескрипторе содержит точную длину файла в байтах. Для

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

каталогом средствами MS-DOS, как с обычным файлом. Единственный способ

прочитать каталог как файл - использование таблицы FAT для определения

цепочки занимаемых каталогом кластеров и чтение секторов, соответствующих

этим кластерам при помощи прерывания INT 25h.

Список литературы.

1. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 1.

Часть 1, 2, 3. Операционная система MS-DOS. М: ДИАЛОГ-МИФИ, 1991,

1993.

2. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 2.

Аппаратное обеспечение IBM PC. Часть 1, 2. М: ДИАЛОГ-МИФИ, 1992.

3. Фролов А.В., Фролов Г.В. Библиотека системного программиста. Т. 19, MS-

DOS для программиста. Часть 2, М.: ДИАЛОГ-МИФИ, 1995.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.