Задание
Реализовать графическое приложение, показывающее в виде дерева структуру каталогов всех гибких дисков (FDD), имеющихся в системе, аналогично Проводнику Windows, используя прямой доступ к диску.
Цель
Научиться осуществлять работу с диском в режиме прямого доступа. Научиться осуществлять поиск файлов и каталогов, непосредственно используя данные файловой системы FAT12.
Описание
Приложение, реализуемое в данной лабораторной работе, должно показывать структуру каталогов всех гибких дисков (ГМД), имеющихся в системе (при этом сами диски должны обозначаться одними значками, а их каталоги – другими).
Задача может быть реализована в несколько этапов:
а) определение имеющихся гибких дисков в системе;
б) организация прямого доступа к диску;
в) разбор данных файловой системы с целью поиска каталогов.
Задача ограничена лишь гибкими дисками в целях безопасности целостности данных на жестких дисках, а также по причине простоты файловой системы FAT12, применяемой на гибких дисках.
Определение имеющихся гибких дисков
Для определения гибких дисков, имеющихся в системе, нужно использовать совместно с функцией GetLogicalDriveStrings (или GetLogicalDrives) функцию GetDriveType. Последняя возвращает тип проверяемого диска (сменный / постоянный / CD-ROM и т.д.). В данной лабораторной работе интересен именно первый тип – сменный диск.
Прямой доступ к диску
Принцип организации прямого доступа к диску различается в ОС семейства NT (NT,2000,XP) и семейства 9x (95, 98, ME).
Рассмотрим прямой доступ к диску в Windows NT.
Для того чтобы осуществить прямой доступ к диску в Windows NT, необходимо сначала открыть диск с помощью функции CreateFile. Одной из возможностей этой функции является отображение диска в виде одного большого непрерывного фала. Возвращаемый функцией хендл может использоваться для перемещения указателя по этому файлу (функция SetFilePointer), а также для чтения данных с диска (функция ReadFile). Таким образом, чтобы считать N-й логический сектор диска (нумерация логических секторов начинается с 0), нужно установить указатель открытого файла на позицию N*(байт_на_сектор) и считать (байт_на_сектор) байт.
|
По завершении работы с диском необходимо закрыть полученный файл с помощью функции CloseHandle.
Файловая система FAT12
Обычная дискета содержит 4 основных области:
- загрузочный сектор (boot sector или boot record);
- таблица размещения файлов (file allocation table);
- корневой каталог;
- область данных.
Загрузочный сектор содержит короткую (менее 512 байт) программу начальной загрузки ОС в память компьютера. Независимо от типа ОС и способа форматирования дискеты, эта программа всегда занимает самый первый сектор на самой первой дорожке диска. Также этот сектор содержит всю важную информацию о характеристиках диска. Структура этой информации следующая:
Смещение, байт | Название | Размер, байт | Описание |
00h | Команда JMP | Длинный или короткий переход на программу загрузчика | |
03h | Идентификатор | Идентификатор версии ОС, с помощью которой отформатирован диск (например, “MSDOS6.0”) | |
0Bh | Байт/Сектор | Размер сектора в байтах | |
0Dh | Сектор/Кластер | Число секторов в кластере | |
0Eh (*) | Резерв | Количество резервных секторов | |
10h | Число FAT | Число копий FAT на диске | |
11h | Число корневых записей | Макс. количество записей в корневом каталоге диска | |
13h (**) | Всего секторов | Общее число секторов на диске | |
15h | Носитель | Тип магнитного носителя | |
16h | Сектор/FAT | Число секторов в каждой из FAT | |
18h | Сектор/дорожка | Число секторов на одну дорожку | |
1Ah | Число головок | Число головок на диске | |
1Ch | Скрытых секторов | Число скрытых секторов на диске | |
20h | Больших секторов | Общее число секторов | |
24h | Номер накопителя | Номер накопителя по BIOS'у | |
25h | Зарезервировано | Резерв | |
26h | Сигнатура | Содержит число 29h | |
27h | ID тома | Идентификатор тома диска | |
2Bh | Метка тома | Копия метки тома | |
36h | ID типа FAT | “FAT12 “ или “FAT16 “ | |
3Eh | Загрузчик | ? | Программа загрузчика |
36h | Конец загрузочного сектора |
* - для формата IBM PC длина зарезервированной области всегда составляет 1 сектор (сектор загрузчика)
|
** - если более 65535, то равно 0, а действительное число секторов лежит по смещению 20h.
Таблица размещения файлов (FAT) содержит информацию о месторасположении записанных на дискету файлов. ОС выделяет для хранения файла, в зависимости от его длины, один или более кластеров (кластер – единица хранения данных на диске, обычно один кластер равен нескольким секторам), однако ОС не заботится, чтобы запись файла происходила последовательно, поэтому необходимо хранить информацию, по каким именно кластерам раскидан данный файл. В силу особой важности этой информации FAT
существует на диске в двух копиях. FAT дискеты состоит из 12-битовых элементов. Структура таблицы размещения файлов следующая:
|
Элемент FAT | Выполняемая функция |
Идентификатор формата | |
Зарезервирован (должен быть FFF) | |
Статус кластера 2 | |
Статус кластера 3 | |
... | ... |
Идентификатор формата может принимать следующие значения:
- F0 - 3'5/2/18 (дискета 3'5, 2 стороны, 18 секторов)
- F8 - жесткий диск
- F9 - 5'25/2/15 или 3'5/2/9
- FC - 5'25/1/9
- FD - 5'25/2/9
- FE - 5'25/1/8
- FF - 5'25/2/8
Статус кластера может быть следующим:
- 000 - кластер свободен
- FF0..FF6 - зарезервирован
- FF7 - испорчен
- FF8...FFF - последний кластер
- иначе - номер следующего кластера файла
Корневой каталог следует непосредственно за FAT. Содержит информацию об основных параметрах файлов (длине, дате создания, и т.д.). Каждая запись в каталоге соответствует тому или иному файлу (кроме, разумеется, метки диска), включает номер первого кластера, назначенного ОС этому файлу, который используется как точка входа в FAT. Начиная с этой точки, каждая запись в FAT содержит номер следующего кластера, распределенного под этот файл, или метку последнего кластера. Структура записи в корневом каталоге следующая:
Смещение | Название | Описание |
00h | Имя | Имя файла 0 если запись свободна 05 если первый символ имени файла – E5 E5 если файл удален 2E запись родительского каталога |
08h | Расширение | Расширение файла |
0Bh | Атрибуты | Атрибуты файла |
0Ch | Зарезервировано | Резерв |
16h | Время | Время последней перезаписи файла |
18h | Дата | Дата последней перезаписи файла |
1Ah | Кластер | Номер первого отведенного кластера |
1Ch | Размер | Размер файла (4 байта) |
Чтение структуры каталогов
Исходя из вышеуказанных данных, для чтения структуры каталогов путем непосредственного использования данных файловой системы FAT12, необходимо реализовать следующий алгоритм: