Системное программное обеспечение персональных ЭВМ


Пример 13



Пример 13

struct DFCB { word n_handles; /* число дескрипторов */ byte open_mode; /* режим открытия */ byte reserved; byte attr; /* атрибуты файла */ word info; /* состояние устройства */ char *drv_ptr; /* адрес драйвера/DPB */ word First_clust; /* номер начального кластера */ word F_time, F_date; /* время и дата */ dword F_size; /* размер файла */ dword F_seek; /* текущее смещение в файле */ word lst_cl_n; /* относит.номер текущ.кластера */ word dir_sect; /* номер сектора каталога */ byte reserved2[2]; byte dir_num; /* номер элемента в секторе */ char fname[11]; /* имя и расширение */ byte reserved3[6]; word owner; /* PID хозяина */ word lst_clust; /* абс.номер текущего кластера */ byte reserved4[6]; };

Рассмотрение полей DFCB упорядочим по их назначению, а не по порядку их расположения в памяти.

В поле fname содержится имя файла формата FCB, то есть имя дополняется до восьми, а расширение - до трех символов пробелами. Поле n_handles содержит число дескрипторов, связанных с этим файлом. Для закрытого файла (неиспользуемого DFCB) это число - 0. Поле info содержит информационное слово для файла, формируемое драйвером устройства. Интерес в этом слове для нас представляет разряд 7, являющийся индикатором того, дисковый это файл (0) или устройство (1), и разряды 0-5, которые для дисковых файлов содержат номер дисковода (0 - A, 1 - B и т.д.). Поле drv_ptr содержит адрес. Для дисковых файлов это - адрес DPB, а для файлов-устройств - адрес заголовка драйвера. Поле owner содержит PID (сегментный адрес PSP) программы, открывшей этот файл. Поле open_mode содержит режим доступа, заданный при открытии файла (1 в старшем разряде этого байта означает, что файл открыт методом FCB).

Следующая группа полей имеет смысл только для дисковых файлов и содержит данные из элемента оглавления, описывающего этот файл в каталоге. First_clust - первый кластер файла по FAT, F_time и F_date - время и дата последней модификации файла в формате каталога, F_size - размер файла в байтах, attr - байт атрибутов файла по каталогу.

Следующие поля определяют текущее состояние чтения/записи для дискового файла. F_seek - текущее смещение от начала файла в байтах, lst_cl_n - текущее смещение от начала файла в кластерах (относительный номер последнего считанного/записанного кластера), lst_clust - абсолютный номер на диске последнего считанного/записанного кластера (смещение этого поля различно для разных версий DOS).

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

Программа следующего примера позволяет просмотреть таблицы DFCB. Поскольку длины блоков разные для разных версий DOS, в описании DFCB - struct DFCB - имеется первая часть, инвариантная для всех версий DOS, и вторая - union VAR - описывающая варианты структуры DFCB для DOS 3.x и 4.x.




- Начало -  - Назад -  - Вперед -