На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 4 / Системная таблица файлов Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Системная таблица файлов

Из всех структур данных, за которыми обращаются в список списков, для TSR наиболее важны входы в таблицу системы файлов. Информация, которую содержат эти входы, влияет на способ обработки резидентными программами запросов на ввод/вывод. Эти структуры данных, которые размещены во внешней области данных DOS, содержат один или несколько блоков. Каждый блок содержит заголовок, который указывает на следующий блок, и несколько входов таблицы файловой системы. Каждый вход SFT является структурой данных.


Длина заголовка 6 байтов. Первое поле - это двойное слово, которое содержит адрес следующего блока в таблице файловой системы или единицу для обозначения конца списка. Второе поле - слово, которое указывает количество входов системы. Листинг 4-13 иллюстрирует структуру SFT.



               Листинг 4-13. Оглавление блока таблицы файлов системы
         ----------------------------------------------------------------

          SFTTBL          STRUC
          SFTTBL_D_Next   DD    0
          SFTTBL_W Count  DW    0
          SFTTBL          ENDS

          SFTTBL_K_Size   EQU   SIZE SFTTBL ; определено для дальнейшего
                                            ; использования
         ----------------------------------------------------------------

Многие поля каждого входа SFT важны только для блоковых устройств, но значение счетчика обращений и поле хозяина PSP непосредственно касаются TSR. Когда DOS открывает файл, он помещает вход в таблицу файловой системы и записывает текущий PSP в поле хозяина PSP со смещением 22h. Так как только владелец файла может закрыть его, то перед запросом к DOS закрыть файл, Вы должны быть уверены, что именно Ваш PSP установлен в качестве текущей программы. Так же перед окончанием работы Вы должны восстановить PSP первоначальной программы переднего плана.


Счетчик обращений является первым полем входа и содержит слово, в котором записано, сколько раз файл или устройство были открыты. Перед размещением нового входа, DOS проверяет все существующие входы для проверки, не открыт ли уже файл или устройство, к которым сделан запрос. Если вход SFT уже существует, DOS увеличивает счетчик обращений перед размещением нового входа. DOS уменьшает счетчик обращений, когда файл/устройство закрываются, но не освобождает вход до обнуления счетчика обращений.


Когда DOS обрабатывает запрос на открытие или создание (через FCB или описатель), он записывает текущий PSP в поле хозяина SFT и записывает биты состояния (означающие запрос на открытие в исключительном режиме или в режиме чтения) в поле режима SFT, если файл не был открыт раньше. Биты состояния определяют, какой тип доступа будет разрешен.



                         Листинг 4-14. Структура входа SFT
         ----------------------------------------------------------------

         SFT   STRUC
         SFT_W_RefCnt    DW    0 ; [00] счетчик обращений
         SFT_W_Mode      DW    0 ; [02] режим открытия
         SFT_B_DirAttrib DB    0 ; [04]
         SFT_W_Flags     DW    0 ; [05]
         SFT_D_DCB       DD    0 ; [07] (FILE) блок управления устройством
         SFT_W_Cluster1  DW    0 ; [0b] (FILE) начальный кластер
         SFT_W_HHMMS     DW    0 ; [0d] (FILE) часы, минуты, секунды
         SFT_W_YYMMDD    DW    0 ; [0f] (FILE) год, месяц, день
         SFT_D_FilSiz    DD    0 ; [11] размер файла/размещение EOF
         SFT_D_FilPos    DD    0 ; [15] текущая позиция файла
         SFT W RelClstr  DW    0 ; [19] (FILE) начало кластеров
         SFT_W_CurClstr  DW    0 ; [1b] (FILE) текущий кластер
         SFT_W_LBN       DW    0 ; [1d] (FILE) номер блока
         SFT_W_DirIndex  DB    0 ; [1f] (FILE) индекс каталога
         SFT_T_FileName  DB    0bh  DUP    (0)  ; [20] (FILE) имя файла
         SFT_T_Unknown   DB    04h  DUP    (0)  ; [2b] неизвестно
         SFT_W_OwnerMach DW    0 ; [2f] номер машины владельца файла
         SFT_W_OwnerPSP  DW    0 ; [31] PSP задачи, которая начинается
         SFT_W_Status    DW    0 ; [33]
         SFT   ENDS

         SFT_K_Size      EQU   SIZE SET
         ;
         ;MOde field
         ;
         SFT_M_FCB       EQU   8000h ; вход для FCB
         SFT_M_DenyNone  EQU   0040h ; разделяемые биты (4-6)
         SFT_M_DenyRead  EQU   0030h ; "
         SFT_M_DenyWrite EQU   0020h ; "
         SFT_M_Exclusive EQU   0010h ; "
         SFT_M_NetFCB    EQU   0070h ; это сетевой FCB
         SFT_M_Write     EQU   0001h ; биты доступа к файлу
         SFT_M_Read      EQU   0000h ; "
         ;
         ;Flags Field
         ;
         SFT_M_Shared    EQU   8000h ; сетевой доступ
         SFT_M)DateSet   EQU   4000h ; набор данных (только для FILE)
         SFT_M_IOCTL     EQU   4000h ; поддержка IOCTL (только для DEVICE)
         SFT_M_IsDevice  EQU   0080h ; вход для устройства
         SFT_M_EOF       EQU   0040h ; (DEVICE) конец ввода файла
         SFT_M_Binary    EQU   0020h ; (DEVICE) прозрачный режим
         SFT_M_Special   EQU   0010h ; (DEVICE) поддерживает вывод int 29h
         SFT_M_IsClock   EQU   0008h ; (DEVICE) устройство текущего времени
         SFT_M_IsNul     EQU   0004h ; (DEVICE) текущее фиктивное устройство
         SFT_M_IsStdOut  EQU   0002h ; (DEVICE) текущее устройство вывода
         SFT_M_IsStdIn   EQU   0001h ; (DEVICE) текущее устройство входа
         SFT_M_Written   EQU   0040h ; (FILE) пользовательский файл
         SFT_M_DriveMask EQU  003fh  ; (FILE) маска для битов драйвера (0-5)
         ----------------------------------------------------------------

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz