Глава 14. Структура информации на диске.

- Нет, виноват! Разоблачение совершенно необходимо. Без это­го ваши блестящие номера ос­тавят тягостное впечатление.

М.А. Булгаков. Мастер и Маргарита.

Материал настоящей главы носит справочный характер (см. [5,9,11,17]). Для того чтобы досконально разобраться в излагаемом здесь материале, вооружитесь каким-ни­будь дисковым редактором (например, DISKEDIThs пакета Norton Utilites) и тщательно проверьте все, о чем мы будем Вам рассказывать. Здесь приводятся данные как для опе­рационной системы MS DOS, так и для Windows. Однако справочная информация по Windows нами ограничена вследствие ограниченности объема книги. Всем желающим разобраться в структуре информации для Windows, рекомендуются книги [27,29].

I. Структура ЕХЕ-программ для MS DOS.

Смещение

Длина

Имя

Комментарий

+0

2

MZ

подпись, признак ЕХЕ-программы

+2

2

PartPag

длина неполной последней страницы

+4

2

PageCnt

длина в страницах (512 б.), включая заголовок и последнюю страницу

+6

2

ReloCnt

число элементов в таблице перемещения

+8

2

HdrSize

длина заголовка в параграфах

+0АН

2

MinMem

минимум требуемой памяти за концом программы

+0СН

2

MaxMem максимум требуемой памяти за концом программы

+0ЕН

2

ReloSS

сегментный адрес стека

+10Н

2

EXESp

значение регистра SP

+12Н

2

ChkSum

контрольная сумма

+14Н

2

ЕхеІР

значение регистра ІР

+16Н

2

ReloCS

сегментный адрес кодового сегмента

+18Н

2

ТаЬЮЙГ

шещешевфайлепфюгоэлементатаблицьгаеремещения

+1АН

2

Overlay

номер оверлея, 0 для главного модуля

* Конец форматированной порции заголовка **

+1СН

** Начало таблицы перемещения (возможно с 1СН) "*

+?

4*?

смещ.               смещ. сегмент

Рис. 14.1. Структура

DSEG SEGMENT

TEXT DB 'Обычная ЕХЕ-программа.','$',13,10

DSEG ENDS

SSEG SEGMENT STACK

STAC  DW  60 DUP(?)

SSEG ENDS CODSEG SEGMENT

ASSUME    CS:CODSEG,   DS:DSEG, SS:SSEG

BEGIN:

MOV AX,SEG TEXT       ; * MOV DS, AX

MOV AX,SEG STAC ;* MOV SS,AX LEA  DX,TEXT MOV AH,9

INT 21H

MOV АН,4CH •

INT 21H CODSEG ENDS

END BEGIN

Рис. 14.2. Текст простой программы.

Заголовок

0000: 4D

В6

00

02

00

02

00

- 20

00

00

00

FF

FF

02

00

0010: 78

00

16

FD

00

00

ОА

00

- 1Е

00

00

00

01

00

01

 

0020:

ОА

00

Об

00

ОА

00

00

00

- 00

00

00

00

00

00

00

 

0030

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

0040

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

 

0050

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

0060:

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

0070

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

 

0080

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

0090:

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

ООАО

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

 

оово

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

ООСО

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

OODO

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

ООЕО

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

OOFO:

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

 

0100: 00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

0110

00

00

00

00

00

00

00

00

- 0.0 00

00

00

00

00

00

00................

0120: 00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

 

0130:

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

0140:

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

0150: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

0160: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

0170: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

0180: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00 ................

 

0190: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

01АО: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

01ВО: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00...............

 

01СО: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

0ШО: 00 00

00

00

00

00

00

00.

- 00

00

00

00

00

00

00

00................

 

01ЕО: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00................

 

01БО: 00 00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00...............

 

Начало образа задачи.

Сегмент данных (сегментный адрес ООН):

0200: 8Е А1 ЕВ Е7 АБ АО ЕР 20 - 45 58 45 2Б АР ЕО АЕ А3 Обычная ЕХЕ-прог 0210: ЕО АО АС АС АО 2Е 24 ОБ - ОА 00 00 00 00 00 00 00 Рамма.$.........

Сегмент стека (сегментный адрес 02Н):

0220

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00......

0230

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00.....

0240

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00......

0250

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00.....

0260

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00......

0270

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00.....

0280

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00......

0290

00

00

00

00

00

00

00

00

- 00

00

00

00

00

00

00

00.....

Сегмент кода (сегментный адрес О АН):

02А0: В8 00 00 8Е Б8 В8 02 00   - 8Е БО 8Б 16 00 00 В4 09................

02ВО: СБ21 В4 4С СБ21 00 00   - 00 00 00 00 00 00 00 00 .!.Ь.!..........

Рис. 14.3. КодЕХЕ-программь(Рис. 14.2) на диске.

На Рис. 14.1 представлена структура заголовка ЕХЕ-программ. Необходимость наличия такого заголовка заключается в том, что ЕХЕ-программа состоит в общем случае из нескольких сегментов. Это, в свою очередь, приводит к появлению команд, в которых явно фигурируют адреса сегментов (длинные ТМР или САЕЦ команды типа МОУ АХ.ЗЕО метка). С другой стороны - программа может быть помещена в любую область памяти. Поэтому эти адреса требуют неизбежной корректировки. Этими за­нимается загрузчик, когда запускает ЕХЕ-программу, а нужную информацию он полу­чает из заголовка.

Замечу, что структура ЕХЕ-программ довольно гибкая. Так, длина ЕХЕ-модуля может быть длиннее загружаемой части, В оставшейся части могут находиться дан­ные, оверлеи и т.п.

Корректировка адресов происходит по таблице перемещения, где содержатся ад­реса всех слов, представляющих собой сегментные адреса. На Рис. 14.2 представлена простаяпрограмма,дисковаякопияЕХЕ-модулякоторойпоказананаРис. НЗ.Пользу-ясьтаблицей на Рис. 14.1 ,находим, что таблица перемещения начинается со смеще­ния 1 ЕН.Длина ее равна 2 элементам (по 4 байта каждый):

1-й элемент 01 00 ОА 00, т.е. ОООАНЮОО Ш - адрес в первой команде; 2-й элемент 06 00 02 00, т.е. 0002Н:0006Н - адрес в третьей команде. В других командах сегмент­ные адреса не используются, поэтому таблица перемещения состоит всего из двух элементов.

Ниже таблицы перемещения находится непосредственно образ задачи. Первому сегменту, находящемуся в образе, присваивается сегментный адрес 0. Замечу, что един­ственный сегмент, положение и размер которого можно вычислить из заголовка, - это сегмент стека. Для сегмента кода можно получить только начало. Всю остальную ин­формацию можно узнать лишь путем анализа кода программы.

Расшифруем сегмент кода:

В8 GG GG

MOV АХ, G

; 0- адрес сегмента данных

8Е D8

MOV DS,AX

 

В8 02 00

MOV AX,02

;   2- адрес сегмента стека

BE DO

MOV SS,AX

 

8D 16 GG

00 LEA DX, [0000]

;   0- смещение строки в сегменте

В4 G9

MOV AH, 09

 

CD 21

INT 21H

 

В4 4С

MOV AH,4CH

 

CD 21

INT 21H

 

Обращу Ваше внимание еще на один важный момент. Количество памяти в бай­тах, необходимое для загрузки ЕХЕ-программы в ОЗУ, вычисляется по формуле (PageCnt-1)*512+PartPag. Довольно часто это число совпадаете длиной программно­го модуля. Если же длина модуля оказывается длиннее, то это может быть по двум

причинам (исключая вирус):

а) модуль удлинился вследствие сбоя ОС,

б) за загружаемой частью программа хранит оверлей или данные.

ЕХЕ-заголовки для программ работающих под Windows (16-битный вариант).

16-битныепрограммы, работающие в среде Windows 95 (а также OS/2 версии 1), имеют следующую структуру:заголовок DOS-программы

DOS-программа, выводящая простое сообщение о невозможности работать в среде MS DOS

Windows-заголовок

Windows-программа

Легко понять, что при запуске программы в среде DOS запускается DOS-програм­ма, которая после вывода сообщения возвращает управление операционной системе. При запуске же программы в среде Windows загрузчик распознает, что данная про­грамма есть приложение Windows (в заголовке имеется сигнатура РЕ или NE) и запус­кает ее как положено. Ниже приводится структура заголовка для 16-битныхприложе-ний под Windows.

Смещение

Длина

Содержание

 

-И)

2

NE - подпись, признак ЕХЕ-программыдля Windows

 

+2

1

номер версии компоновщика

 

+3

1

номер модификации компоновщика

 

+4

2

смещение таблицы элементов

 

+6

2

число байтов в таблице элементов

 

+8

4

32-битовый CRC всего файла

 

+СН

2

ключевое слово: OOOOh-NOAUTODATAOOOlh - SINGLEDATA 0002h - MULTIPLEDATA 2000h - ошибка во время ' редактирования 8000h - библиотечный модуль

 

+ЕН

2

номер сегмента с данными типа automatic

 

+10Н

2

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

 

+12Н

2

начальный размер стека, добавленный к DS (0 - DS не равно SS)

 

+14Н

4

CS:IP

 

+18Н

4

SS:SP

 

+1СН

2

число элементов в таблице сегментов

 

+1ЕН

2

число байтов в таблице с не резидентным именем

 

+20Н

2

смещение таблицы сегментов (относительно начала этой

секции заголовка)

 

+22Н

2

смещение таблицы ресурсов (... )

 

+24Н

2

смещение таблицы с резидентным именем (... )

 

+26Н

2

смещение таблицы ссылок модуля (... )

 

+28Н

2

смещение таблицы внешних имен(...)

+2АН

4

смещение таблицы с нерезидентным именем (относительно начала файла)

2ЕН

2

число точек перемещаемых элементов

ЗОН

2

счетчик сдвига при выравнивании логического сектора (логарифм по основанию 2, от размера сектора сегмента)

32Н

2

число резервных сегментов

34Н

1G

зарезервировано

ЕХЕ-заголовки для программ, работающих под Windows

(32-битный вариант).

Не буду утомлять внимание читателей описанием полей РЕ-заголовка. Все интере­сующиеся смогут найти эту структуру, обратившись к заголовочному файлу WINNT.H из пакета С++для Windows. Эта структура называется IMAGE_NT_HEADERS.

II. Средство работы с диском.

Все возможности операционной системы MS DOS для работы сдискетами ижест-кими дисками основываются на прерывании

Прерывание 13Н дает весьма обширный сервис работы с дисками на физическом уровне. Среди функций, выполняемых данным прерыванием, - дать статус ошибки последней дисковой операции, проверить сектор, форматировать дорожку, дать пара­метры диска и т.д. Мы разберем лишь чтение-запись с помощью данного прерывания, атакжеформатированиедорожкидиска. Подробнеео нем можно прочесть, например, в [13,17] или в нашем справочнике (см. Приложение 8).

Чтение. -

Вход: АН-02,

DL-номер диска (0-А, 1 - В; для твердого 80Н, для второго-81Н)

- номер головки,

- число читаемых секторов, ES:BX - буфер для чтения,

СХ - номер сектора и цилиндра: первые 6 бит - номер сек­тора, остальные - номер цилиндра, причем 8 и 7 бит следует поставить перед другими (8-1G,7-9). 0:0078Н - адрес таблицы параметров дискеты (Рис. 14.10).

Выход:

если взведен флаг С, то код ошибки в АН. Запись. Аналогична чтению.

Форматирование дорожки.

Вход: АН-05,

AL - число секторов на дорожке или коэффициент чередования в случае жесткого диска, СХ-номерсектораицилиндра(также,какдля чтения-записи), DL-номер устройства, DH - номер головки,

Е&ВХ - буфер с информацией для разметки. Для дискеты это последовательность четырехбайтных величин: 1-й - номер дорожки, 2-й - номер головки, 3-й - номер сек­тора, 4-й - длина сектора (О-128,1 - 256,2 - 512, 3 - 1024). Для жесткого диска буфер состоит из пар байт: 1-й либо 0 -разметить как обычный сектор, либо 80Н - разметить какдефектный сектор, 2-й номер сектора. Для некоторых моделей контролеров жест­ких дисков содержимое буфера игнорируется.

Меняя содержимое буфера, можно произвести нестандартное форматирование. Например, изменить нумерацию секторов надорожке. В некоторых случаях измене­ния буфера недостаточно - требуется изменить содержимое таблицы параметров дис­кеты или жесткого диска. Такая ситуация может возникнуть при форматировании с меньшим числом секторов, чем предусматривает дисковод. Если дорожка отформати­рована нестандартно, то для чтения-записи нее также необходимо менять таблицу параметров.

Выход: АН - код ошибки, еслифлагСустановлен. Возможна ситуация, когда BIOS не поддерживает форматирование жесткого диска. В этом случае в АН будет возвра­щена ошибка 1 - нераспознанная команда, и Вам не останется ничего иного, как фор­матировать посредством обращения к контролеру жесткого диска.

Прерывания 25Н, 26Н. Данные прерывания DOS осуществляют чтение-запись логических секторов (в каждом разделе или гибком диске сектора пронумерованы от О до п-1, п - число секторов в разделе или гибкомдиске).

Чтение. Вход: АН - 25Н, AL - номер устройства (0 - А, 1 - В, 2 - С и т.д.), СХ -количество секторов,

DX - номер сектора,

DS:BX - адрес буфера.

Выход:

если взведен флаг С, то код ошибки в АХ.

В стеке остается лишнее слово (см. главу 12, перехват 25/26 прерываний). Запись. Аналогична чтению. Начиная с DOS 4.0 появилась новая возможность работы с устройствами емкости свыше 32 Мб. Если в СХ FFFFH, то: DS:[BX] - номер сектора (DWORD), DS:[BX+4] - количество секторов (WORD), DS:[BX+6] - смещение буфера (WORD), DS:[BX+8] - сегмент буфера (WORD).

Здесь может возникнуть следующая проблема. Старые ОС не поддерживают пос­леднее. Поэтому в своей программе нужно предусмотреть возможность запуска в сре­де ОС более ранних версий. Можно поступить следующим образом: попробовать вна­чале осуществить операцию чтения/записи новым методом; если будет установлен флаг ошибки, попытаться осуществить действие старым способом.

III. Сектора загрузки.

Начнем с первого сектора дискеты. Логический номер этого сектора 0, а физичес­кие координаты — (1,0,0) 38. Это ВООТ-сектор. В нем содержатся данные о дискете (Рис. 14.4), а также программа для запуска системных файлов. Формирование ВООТ-сектора происходит во время форматирования дискеты.

Обратимся теперь к жесткому диску. Каждый раздел жесткого диска также начи­нается с ВООТ-сектора, логический номер которого 0. У жесткого диска имеется и Главная загрузочная запись (Master Boot Sector - MBS). Физические координаты ее

такие же, как у ВООТ-сектора дискеты. Как и ВООТ-сектор она состоит из двух час­тей: вначале идет небольшая программа, а затем таблица разделов (Partition Table) (Рис. 14.5). В таблице разделов содержатся сведения о том, какие разделы имеются на жестком диске, типы этих разделов и их физические координаты (Рис. 14.6). При заг­рузке системы с винчестера BIOS считывает MBS по абсолютному адресу 0:7С00Н и передает управление программе. Программа, руководствуясь Partition Table, находит системный раздел и загружает в память ВООТ-сектор этого раздела, после чего пере­дает ему управление. Далее все идет так же, как в случае с дискетой.

Вернемся снова к MBS. Изучая его для винчестеров с разным количеством разде­лов, Вы обнаружите, что число разделов, которые указываются в Partition Table, ни­когда не превышает 2. Второй раздел называется расширенным (Extended). Оказыва­ется, он имеет свой MBS, только без загрузочной программы. В его Partition Table

также имеются ссылки на один или два раздела, один из которых имеет тип Extended и т.д. Изложенное схематично изображено на Рис. 14.7. Таким образом, имеется возмож­ность работать с любым количеством логических разделов на жестком диске любого объема. Такая структура в программировании называется связанным списком.

Смещение

Размер байт

Содержание

ООН

3

Короткий илидлинный JMP на программу загрузки

ОЗН

8

Имя и версия

ОВН

2

Количество байт на сектор

0DH

1

Количество секторов на кластер

ОЕН

2

Количество резервных секторов, включая

ЮН

1

ЧислотаблицЕАТ

11Н

2

Максимальное количество элементов в корневом оглавлении

13Н

2

Общее количество секторов на логическом диске (<32 Мб)

15Н

1

Тип носителя

16Н

2

Количество секторов в одной FAT

18Н

2

Количество секторов на трек

1АН

2

Количество головок

38 На физическом уровне подсчет секторов проводится в следующем порядке: вначале сектор, затем головка, затем цилиндр.

1СН

4

Количество "скрытых" секторов

20Н

4

Общее количество секторов на логическомдиске

24Н

1

Физический номер диска

25Н

1

Зарезервировано

26Н

1

Сигнатура 29Н

27Н

4

Двоичный номер диска

28Н

11

Метка диска

36Н

8

Зарезервировано

ЗЕН

Программазагружи

1FEH

2

Сигнатура ОАА55Н

Рис. 14.4. Boot-сектор. Начиная со смещения ВН и заканчивая смещением 16Н, расположен ВРВ - BIOS Parameters Block.

Байты

Размер в байтах

Содержание

 

00H-1BDH

446

Программа главной загрузки

 

1BEH-1CDH

16

Элемент первого раздела

 

1CEH-1DDH

16

Элемент второго оглавления

 

1DEH-1EDH

16

Элемент третьего оглавления

Partition

1EEH-IFDH

16

Элемент четвертого оглавления

Table

lFEH-lFFH

2

Сигнатура ОАА55Н

 

Рис. 14.5. Главная загрузочная запись (MasterBoot-сектор).

Смещение    Размер байт Содержание

ООН 1 Признак загрузки

80Н - загружаемый раздел ООН - незагружаемый раздел

 

 

Начало раздела диска

01Н

1

бит 0-7:номер головки (0-255)

02Н

1

бит0-5:номер сектора (1-63)

 

 

бит 6-7:старшие биты ном.цилин.

ОЗН

1

бит 0-7: младшие биты ном.цилин. (0-1023)

 

 

Тип раздела

04Н

1

00 - раздел не используется

 

 

01Н - DOS 2.Хс 12-бит. FAT

 

 

04Н - DOS З.Хс 16-бит. FAT

05Н - DOS 3.3 Extended-раздел 06H - DOS 4.Xc 16-бит. FAT

Конец раздела диска

05Н

1

бит 0-7:номер головки (0-255)

06Н

1

бит0-5:номер сектора (1-63)

 

 

бит 6-7:старшиебитыном.цилин.

07Н

1

бит 0-7:младшие биты ном.цилин. (0-1023)

 

 

Относительный сектор

08Н

4

Количество секторов перед началом раздела

 

 

Раздел

осн

4

Количество секторов в разделе

Рис. 14.6. Формат полей описания раздела диска.

 

 

 

 

Master Bool-сектор

 

Partition Table

 

 

 

 

Boot-сектор

 

Fat-таблица,Корневая

директория, данные.

 

 

-►

Вторичный master boot сектор

 

Таблица лог. диска

 

 

 

L

boot-сектор

 

FAT, корневая дирек­тория, данные

 

 

 

Вторичный master

 

boot сектор

 

Таблица лог. диска

 

 

 

 

boot-сектор

 

FAT, корневая дирек­тория, данные

 

 

Рис. 14,7. Общая структура логических дисков винчестера.

Ниже (Рис. 14.8) приводится простой пример работы с корневыми секторами же­сткого диска. Программа читает название фирмы-изготовителя программы, с помо­щью которой был отформатирован первый раздел жесткого диска.

DATA SEGMENT

BUFER DB  512 DUP(?)

DATA ENDS

STT SEGMENT STACK

DW 40 DUP(?) STT ENDS CODE SEGMENT

ASSUME CS:CODE,  DS:DATA, SS:STT

BEGIN:

/установка  сегментных секторов MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX, STT MOV SS,AX

/читать главную загрузочную запись винчестера TEA BX,DS:BUFER MOVAX,0201H MOV DX,0080H MOVCX,0001H INT 13H

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

MOVDH,DS:BUFER[lBFH] /1ВЕН+1

MOV CX,WORD PTR DS: BUFER  [1COH] /1ВЕН+2

MOV AX, 0201H /читаем загрузочный сектор

INT 13H

MOV  BYTE   PTR   DS:BUFER    [3+8],'$'        /Отмечаем конец строки /ВЫВОДИМ  создателя   загрузочного сектора MOV DX,BX ADD  DX, 3 MOV АН,9 INT 21H

KON:

.MOV АН, 4CH

INT 21H code ends

. end begin

Puc. 14.8. Программа чтения имени и версии из первого раздела жесткого диска.

Простая программа на Рис. 14.9читает главную загрузочную запись и проверяет правильность сигнатуры. Если сигнатура не верна, то программа автоматически ис­правляет ее.

CODE SEGMENT

ASSUME CS.-CODE,   DS.-CODE,   SSrCODE, ES.-CODE

ORG  10 OH

BEGIN: ■

/чтение  главной   загрузочной   записи   первого   жесткого диска MOV DL,80H   /первый жесткий диск MOV АН, 2 /чтение MOV DH, 0       /номер головки MOV один сектор

MOV СХ, 1      /номер сектора 1,   номер цилиндра О LEA BX,BUF   /ES:BX на буфер PUSH CS

POP INT JC

ES 13H

NO_R

;проверка сигнатуры CMP

JZ

WORD   PTR BUF+1FEH, OAA55H

OK

/исправим сигнатуру

LEA

DX,MES4

OK:

NO R:

MOV   AH, 9

INT 21H

MOV WORD  PTR BUF+1FEH, 0AA55H

MOV AH,3 /запись

MOV DL,80H

MOV DH,0

MOV AL,1

MOV CX,1

LEA BX,BUF

INT 13H

JC NO_W

RET LEA

MOV AH, 9

INT 21H RET

LEA DX,MES1 MOV AH, 9

INT 21H RET

NO_W:

LEA

MOV ан,9

INT 21H RET

BUF     DB   512 DUP(?) MES1 DB   'Ошибка чтения',13,10, '$' MES2  DB   'Ошибка записи',13,10, '$' MES3 DB   'Сигнатура Ок! *, 13,10, '$'

MES4   DB   'Сигнатура отсутствует,   исправляем.', 13,10, '$ '

CODE ENDS

END BEGIN

Рис. 14.9. Проверка и исправление сигнатуры жесткого диска.

IV. Расположение файлов на диске.

Прежде введем обозначения: количество    на сектор

количество секторов на кластер - количество резервных секторов, начиная с

число максимальное количество элемен-

тов в корневом каталоге - эл._кат., количество секторов в одной FAT-таблице- cck.„FAT. эти данные хранятся

Расположение файла на диске определяют две структуры: и ката-

логи 40. Различают корневой41 каталог и подкаталоги. Подкаталоги фактически пред­ставляют собой обычные файлы, имеющие специальный атрибут. Корневой же ката­лог имеет фиксированную длину и место положения. Длина одного элемента каталога равна 32 байтам. Отсюда длина каталога в килобайтах составляет:

32*эл._кат./1024, при эл._кат.=512 получим 16К, или 32 сектора. Начало корнево­го каталога (логический сектор): рез._сек.+сек._РАТ*кол._РАТ.

Начало области данных (логический сектор):

Элемент каталога имеет

структуру, представленную Рис.

В элементе каталога содержится номер начального кластера. Кластер является той единицей деления файла, которой непосредственно оперирует операционная система. Расположение кластеров файла на логическом диске содержится в FAT-таблице. К из­ложению структуры FAT-таблицымы сейчас приступаем.

39 FAT - file allocation table, т.е. таблица размещения файлов.

<» Запись FAT-таблица, какВы, наверное, понимаете, тавтология. Мы, однако, пользуемся этим

термином, сознавая некоторую некорректность. «1 Название "корневой" довольно уместно, если представить систему каталогов в виде дерева.

Смещение

Длина

Содержимое

О

8

Имяфайла

8

З

Расширение

овн

1

Атрибут файла

оси

ОАН

Резерв

16Н

2

Время создания или последней модификации

18Н

2

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

1АН

2

Номер начального кластера

1СН

4

Размер файла

Рис. 14,10. Структура элемента каталога.

FAT-таблица состоит из элементов. Элемент может быть как 12-битным, так и 16-битным. Тип элемента указан в Partition Table. Каждый элемент соответствует некото­рому кластеру на диске (по порядку). Если кластер принадлежит файлу, то в соответ­ствующем ему элементе содержится ссылка на следующий кластер. Та­ким образом, зная начало файла из каталога, по FAT-таблице можно отыскать весь файл. Надо только иметь в виду, что ссылки начинаются с третьего элемента. Первым байтом в таблице является дескриптор. В ранних версиях MS DOS он однозначно оп­ределял тип носителя (формат дискеты, раздел винчестера, электронный диск). Сле­дующие семь байт (5 байт в 12-битнойтаблице) содержат FFH. В FAT-таблице приня­ты следующие

(0)000Н кластер доступен,

ШРТОН-^РТбН. зарезервированный кластер,

плохой кластер, ^)ЕР8Н-(Е)РЕЕН конец цепочки,

(0) 002Н- (Е) РЕГН номер следующего кластера.

Старшая цифра в скобках относится к FAT.

Приведу полезную формулу получения номера логического сектора из номера кластера: обл._цан.+(кластер-2)*сек._на_кл.,здесьобл._дан. - начало области данных.

Как уже отмечалось, доя того чтобы определить, какая имеется FAT-таблица, не­обходимо обратиться к таблице разделов. Таблица разделов при этом может ссылаться на другую таблицу, а та, в свою очередь, на третью и т.д. Поэтому получить параметры данной FAT-таблицы не всегда простая задача. Есть, однако, более простые способы определения типа FAT-таблицы. Пользуйтесь таким правилом: если общее количе­ство секторов в разделе больше 20740, то используется 16-битная FAT-таблица, в про­тивном случае используется таблица. Общее количество секторов можно определить из ВООТ-сектора

Ниже приводится значение битов атрибута файла для операционной системы MS DOS. Как уже было сказано, под атрибут отводится один байт.

Вкзы

.   О: 1

■ 1: 1

■ 2: 1

З: І

. й: 1 - только для

сисгеыиыи.

тома. подкаталог.

5: 1 - архивный. Копия файла не создавалась

Рис. 14.11. Атрибут файла.

При работе с атрибутами помните, что поиск по атрибуту функций FindFirst и FindNext включающий. Т.е. ищутся файлы, имеющиеданный бит. Если Вы, например, ищете все директории, то следует искать файлы со всеми атрибутами: директорий, архив, скрытыйитолькодлячтения.Затемужепоатрибутунайденногофайламожно определить, является он каталогом или нет. Надо иметь в виду, что стандартными ме­тодами DOS можно менять биты 0,1,2,5. Биты третий и четвертый можно изменить, только обратившись кдиску в обход стандартных функций MS DOS.

В операционной системе Windows под атрибут файла отводится четыре байта, т.е. 32 бита. Однако количество определенных битов стало не намного больше. К выше определенным битам добавились также: Бит 7 - нормальный (нет других атрибутов), Бит 8 - временный, Бит 10 - сжатый, Бит 11 - офлайновый (данные файла могут быть недоступны в настоящее время). Для работы с атрибутами файл в Windows имеются две API функции GetFileAttributesn SetFileAttributes.

Файловое время.

В операционной системе каждому файлу ставится в соответствие время и дата создания. Приэтом при изменении файла время и дата создания заменяются на время и дату модификации. Под время и дату отводится по слову. Слово времени: часы -5 старших бит, минуты - 6 бит (с 5 по 10), секунды - 5 первых бит. Причем хранится количество секунд, деленное на 2 (иначе не хватит места). Получить или изменить датуили время файла можно посредством функции 57Н (см. Приложение 6).

Иная ситуация в операционной системе Windows. Каждому файлу ставится три времени (время идата): время создания, время последней модификации, время после­днего доступа. Причем время хранится в 100-наносекундныхинтервалах как проме­жуток времени, начиная с 1600 года. На это отводится три 64-битных слова. Устанав­ливать и получать файловое время можно при помощи API-функций GetFileTime и SetFileTime. Заметим, кстати, чтoвWindowsпoявилacь возможность сортировать файлы на файлы, часто (редко) модифицируемые, и файлы с частым (редким) доступом, что

можно использовать для оптимизации файловой системы.

В конце раздела приводятся структуры данных для гибкого и жесткого дисков, определяющие параметры, необходимые для основных операций с дисками.

Смещение Длина Содержание

40

І

биты 0-3: SRT (step rate time); биты 4-7: head unload time

І

бит 0:1=испЛЭМА; биты 2-7: head load time

+2

І

период отключения мотора (55-мс интервалов перед отключением мотора)

+3

І

Размер сектора (0=128, 1=256,2=512,3=1024)

44

І

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

+5

І

длина промежутка для операций чтения/записи

+6

І

максимальная длина данных

+7

І

длина промежутка для операции форматирования

+8

І

символ-заполнитель для форматирования (обычноОГбН)

49

І

основной временной интервал в миллисекундах

■кш

І

время запуска мотора (в Ш-секундных интервалах)

Рис.14.12. Параметры дискеты, расположенные по адресу, определяемому

вектором 1ЕН.

Смещение

Длина

Содержание

■ю

2

максимальное число цилиндров

+2

І

максимальное число головок

+3

2

starting reduced-write current cylinder

+5

2

startingwriteprecomper^tion cylinder

+7

І

maximum ECC data burst length +- bit 7: disable disk-access retri

+8

І

drive step options _-j bit 6: disable ECC retries +- bits 2-0: drive option

+9

І

стандартное значение таймаута

-кш

І

значениетаймаутадля форматирования

-кш

І

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

-кш

4

(резерв)

Рис. 14.13. Параметры жесткого диска, расположенные по адресу, определяемому вектором 41Н. Если есть второй жесткий диск, то параметры

определяет вектор 46Н.

V. Увеличение размера раздела и 32-битная FAT.

При увеличении раздела жесткого диска возникают проблемы с FAT. Можно увели­чить ее размер. Но нельзя это делать безгранично. Во-первых, для большой FAT-табли-цытребуется много места в памяти. Во-вторых, увеличивая таблицу, мытемсамымумень-шаем пространство для данных. Второй путь - увеличить размер кластера. Но здесь возникает проблема, связанная тем, что в последних незаполненных кластерах теряет­ся часть свободного пространства. Чем больше небольших файлов, тем больше эти по­тери. Такие потери могут достигать 40% всего свободного пространства.

В операционной системе Windows 95 появилась возможность создавать разделы с 32-битной FAT. Элемент в такой таблице имеет длину 4 байта. Это позволяет адресо­вать больше пространства и, следовательно, создавать большие разделы. Вместе тем следует отметить, что 32-битная FAT - это полумера, т.к. опять предел (хотя и большой) на объем раздела. Но все это является следствием необходи­мости поддерживать совместимость с предыдущими версиями системы.

VI. Содержание списка списков.

О списке списков, получаемом при помощи функции 52Н, уже упоминалось. Сей­час приводится описание некоторых наиболее важных полей этой структуры.

Смещение

Длина

Описание

-8

4

указатель на текущий дисковый буфер

-2

2

сегментный адрес первого блока МСВ

0

4

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

4

4

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

8

4

указатель на заголовок активного драйвера

І2

4

указатель на заголовок активного драйвера CON

І6

2

максимальный размер сектора в байтах

І8

4

указатель на информационную запись дискового буфера

22

4

указатель на массив структур текущего каталога

32

І

число установленных блочных устройств

33

І

число элементов в массиве структур тек. каталога

34

І8

заголовок драйвера устройства NUL

63

2

значение X в директиве BUFFERS=X, Y

65

2

значение Y в директиве BUFFERS=X,Y

67

І

дисковод загрузки

Поле со смещением 2 мы уже использовали для определения начала цепочки МСВ. В дальнейшем нам понадобится также начало системной таблицы файлов -смещение 4. Структура этой таблицы такова: вначале идут 6 байт заголовка. Пер­вые 4 байта содержат ссылку на следующую таблицу или FFFFH, если таблица

последняя. Далее идут блоки, структура и размер которых может, вообще говоря, меняться для различных версий MS DOS. Ниже представлены некоторые важные поля такого блока.

Смещение

Длина

Описание

0

2

количество дескрипторов, закрепленных заданным файлом, или 0, если блок свободен

2

2

режимдоступа к файлу

4

І

атрибут файла

5

2

информационное слово устройства

7

4

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

И

2

номер первого кластера файла

І3

2

времяпоследнеймодификациифайла

І5

2

дата последней модификации файла

І7 .

4

размер файла в байтах

4

текущее положение указателя файла

25

2

относительный номер последнего прочитанного или записанного кластера

27

4

номер сектора с записью каталога о данном файле

І

номер записи каталога внутри сектора

32

ІІ

имя и расширение файла

46

2

сегментный адрес РБР программы, открывшей файл

53

2

абсолютный номер последнего записанного или

прочитанного кластера файла

В главе 19 будет показано, как последняя информация может быть использована для защиты программ от несанкционированного копирования.

VH. Соображения по поводу файловой структуры MS DOS.

Файловая система MS DOS, на мой взгляд, обладает рядом серьезных изъянов, которые я излагаю ниже, как обычно, пронумеровав их.

1. Ограничение на длину файловых имен. Причем не предусмотрено какого-либо

резерва. Отсюда хитрости Windows 95 (см. ниже).

2. Ограничения, накладываемые на знаки, используемые для имен файлов. Сбой, в результате которого на диске появится файл с "экзотическим" именем, приводит к не­возможности справиться с таким файлом средствами DOS.

3. Нет автоматической защиты от сбоев. Для устранения всяких неполадок прихо­дится обращаться к утилитам типа Disk Doctor.

4. Нет защиты от прямого доступа кдиску. Используя утилитутипа DISKEDIT.EXE, неискушенный пользователь легко может испортить содержимое диска. Я уже не го­ворю о неискушенном программисте, использующем прерывания 25Н,

VIII. Длинные имена.

В Windows 95 реализована возможность использования для файлов длинных имен.

Сейчас я намерен разобрать этот вопрос.

Естественно фирма Microsoft должна была подумать о совместимости с каталога­ми старого формата. Нужно было в каталогах старого формата (состоящих из 32-бай-тных записей) поместить информацию о длинном имени файла. При этом здесь же должны храниться записи старого формата.

Решение специалистов основывается на следующем факте: запись с атрибутом, равным OFH, не видна ни для каких функций DOS. Итак, что же нового привнесла Windows 95 в структуру каталогов?

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

2. Для файлов с обычными именами запись в каталоге осталась той же самой.

3. Файл с длинным именем имеет в каталоге одну запись, идентичную записи для

файлов с обычным именем (первая запись), и несколько записей с атрибутом OFH,

которые находятся перед обычной записью и в которых хранится длинное имя, а так­же другая информация (см. ниже).

4. Имя файла в первой записи - шесть первых символов его полного имени. Седь­мым символом является ~, восьмым - цифра от І и выше. Цифра нужна, чтобы разли­чать файлы, у которых шесть первых символов в имени совпадают.

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

1. Длинное имя хранится в UNICODE (на каждый символ 2 байта).

2. Длинное имя хранится в обратном порядке - начинается в записи ближней к

первой записи, и заканчивается в самой дальней.

Структура:

байтО - байт порядка следования, биты      содержат номер бит 5= О,

бит 6 - 1 - запись последняя (точнее, первая), бит 7 = О,

байты      - пять символов имени,

9-4072

Учебный

байт 11 - равен OFH (атрибут),

байт12-равенО,

байт 13 - контрольная сумма,

байты 14-25 - шесть символов имени,

байты 26-27 равны О,

байты 28-31 два символа имени.

Длинные имена в корневом каталоге могут создать определенные проблемы для пользователя. Дело в том, что размер корневого каталога в MS DOS фиксирован (см. выше). Windows 95 унаследовала этот недостаток. Ясно, что количество файлов с длин­ными именами в корневом каталоге ограничено этим размером.