Чтение структуры каталогов




Задание

Реализовать графическое приложение, показывающее в виде дерева структуру каталогов всех гибких дисков (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, необходимо реализовать следующий алгоритм:

  1. Открыть диск функцией CreateFile.
  2. Считать загрузочный сектор диска, получить из него геометрию диска - размер сектора, количество секторов в кластере и т.д. (фактически размер сектора всегда равен 512 байт, а один кластер дискеты соответствует одному сектору).
  3. Считать FAT.
  4. Используя FAT, считать корневой каталог, выбрать из него (по атрибутам) записи подкаталогов.
  5. Для каждой записи подкаталога определить кластер, в котором находится подкаталог.
  6. Используя FAT, считать подкаталог, выбрать из него записи его подкаталогов и т.д.


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: