Таблица файлов MSDOS
2.4. Таблица файлов MS-DOS
DOS создает таблицу открытых файлов и помещает ее адрес в поле file_tab векторной таблицы связи. В этой таблице для каждого открытого файла хранится такая информация, как количество файловых чисел (file handle), связанных с данным файлом, режим открытия файла (чтение, запись и т.д.), слово информации об устройстве, указатель на заголовок драйвера, обслуживающего данное устройство, элемент дескриптора файла (дата, время, имя файла, номер начального кластера, распределенного файлу), номер последнего прочитанного кластера и т.д.
Эта информация может пригодиться при организации защиты программы от копирования путем ее привязки к номерам занимаемых программой кластеров. Заметьте, что получить информацию о начальном кластере файла довольно трудно - стандартные средства DOS не предоставляют такой возможности. Приходится работать с диском на уровне секторов, отслеживать FAT, читать напрямую каталог и т.д. Таблица файлов содержит этот номер в явном виде.
Строка файла CONFIG.SYS может содержать оператор FILES=xx. Этот оператор в конечном счете определяет размер таблицы файлов DOS (DFT). Каждая таблица DFT содержит указатель на следущую таблицу и количество управляющих блоков файлов DOS (DFCB). Сами блоки DFCB (по одному для каждого файла) расположены в конце таблицы DFT.
Формат этого блока различается для DOS 3.х и 4.х. Информация по некоторым полям отсутствует. И хотя эти поля отмечены как резервные, на самом деле они используются, но неизвестно как.
Приведем сначала формат таблицы файлов для DOS 3.х:
(0) 4 | next | указатель на следующую таблицу файлов |
(+4) 2 | file_count | количество файлов в этой таблице |
--- Дальше идут блоки DFCB в количестве file_count штук ---- | ||
(0) 2 | handl_num | количество файловых чисел, связанных с данным файлом (file handle) |
(+2) 1 | access_mode | режим доступа к файлу, заданный при открытии файла |
(+3) 2 | reserv1 | зарезервировано |
(+5) 2 | dev_info | информация IOCTL, полученная для устройства, на котором расположен этот файл (подробно формат и назначение этого поля будут рассмотрены в главе, посвященной драйверам) |
(+7) 4 | driver | указатель на драйвер, обслуживающий устройство, содержащее файл |
(+11) 2 | first_clu | номер первого кластера, распределенного файлу |
(+13) 2 | time | время последнего изменения файла в упакованном формате |
(+15) 2 | date | дата последнего изменения файла в упакованном формате |
(+17) 4 | fl_size | размер файла в байтах |
(+21) 4 | offset | текущее смещение внутри файла в байтах |
(+25) 2 | reserv2 | зарезервировано |
(+27) 2 | last_clu | номер только что прочитанного кластера |
(+29) 3 | reserv3 | зарезервировано |
(+32) 11 | filename | имя файла в формате FCB (имя выровнено на левую границу поля, дополнено пробелами до 8 символов, справа к нему прилегает 3 символа расширения без точки) |
(+43) 2 | reserv4 | зарезервировано |
(+45) 2 | ownr_psp | PSP программы, открывшей файл |
(+47) 2 | reserv5 | зарезервировано |
Операционная система MS-DOS версии 4.х отличается расположением поля last_clu, кроме того изменилась длина DFCB: