|
|
|
|
Системная таблица файлов
Из всех структур данных, за которыми обращаются в список списков, для 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)
----------------------------------------------------------------
|
|
|