Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

[Назад] [Содеожание] [Дальше]

2.1. Поля векторной таблицы связи

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

Смещение, байт Размер, байт Имя поля Описание
-2 2 mcb_seg Сегмент первого блока памяти MCB
0 4 dev_cb Указатель на первый блок управления устройствами MS-DOS (MS-DOS Device Control Block)
4 4 file_tab Указатель на таблицу файлов MS-DOS
8 4 clock_dr Указатель на драйвер CLOCK$ , установленный в файле config.sys или резидентный
12 4 con_dr Указатель на драйвер CON , установленный в файле config.sys или резидентный
16 2 max_btbl Максимальный размер блока (в байтах) для устройства, выполняющего передачу данных отдельными блоками
18 4 disk_buf Указатель на структуру, описывающую дисковые буферы
22 4 drv_info Указатель на массив информации об устройствах
26 4 fcb_tabl Указатель на таблицу FCB
30 2 fcb_size Размер таблицы FCB
32 1 num_bdev Число устройств, выполняющих передачу данных отдельными блоками
33 1 lastdriv Значение LASTDRIVE в файле config.sys (по умолчанию равно 5)
34 ? null_dr Начало драйвера NUL. Этот драйвер всегда первый в списке драйверов MS-DOS

Заметим, что функция 52h возвращает адрес поля dev_cb. Для того чтобы получить адрес слова, содержащего сегмент первого блока памяти MCB , необходимо уменьшить значение смещения, полученное от функции 52h, на 2 байта.

Для удобства работы с векторной таблицей связи определим тип CVT следующим образом (имена полей соответствуют приведенному выше списку):

typedef struct
{
  unsigned mcb_seg;
  void far *dev_cb;
  void far *file_tab;
  void far *clock_dr;
  void far *con_dr;
  unsigned max_btbl;
  void far *disk_buf;
  void far *drv_info;
  void far *fcb_tabl;
  unsigned fcb_size;
  unsigned char num_bdev;
  unsigned char lastdriv;
} CVT ;

Определим также тип LPCVT как дальний указатель на векторную таблицу связи MS-DOS:

typedef CVT  far* LPCVT ;

Поле mcb_seg содержит сегментную компоненту адреса первого блока MCB . Зная это значение, нетрудно проследить и при необходимости даже изменить структуру блоков памяти.

Например, некоторые вирусы искусственно уменьшают размер самого последнего свободного блока памяти, записывая на освободившееся место свое тело. Зная структуру блоков MCB , можно удалить из памяти ненужные резидентные программы .

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

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

Поле file_tab содержит адрес таблицы файлов MS-DOS. В этой таблице для каждого открытого файла хранится разнообразная информация, такая как количество назначенных файлу идентификаторов (т. е. сколько раз файл был открыт), режим использования файла, номер первого кластера диска, распределенного файлу и т. д.

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

С помощью полей clock_dr и con_dr программа может получить доступ, соответственно, к драйверу CLOCK$ и драйверу консоли CON . Это может понадобиться для организации вызова драйвера непосредственно из программы.

Поле max_btbl содержит размер блока устройств, которые выполняют обмен данными отдельными блоками (пример - драйвер диска). Для MS-DOS версии 6.22 размер блока равен 512 байт.

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

Анализируя этот массив, программа может определить количество установленных в системе дисковых устройств и их параметры.

В поле fcb_tabl находится указатель на таблицу блоков FCB . Размер этой таблицы записан в поле fcb_size и определяется оператором fcbs=хх, расположенном в файле config.sys .

Поле lastdriv содержит значение параметра оператора lastdive, расположенном в файле config.sys (или значение, принятое по умолчанию). Его можно использовать для определения максимального количества дисковых устройств в системе.

В поле num_bdev хранится количество действительно используемых дисковых устройств.

Поле nul_dr само по себе не содержит никакой полезной информации. Имеет значение лишь его адрес - в этом месте расположен самый первый в цепочке драйвер MS-DOS. Зная адрес поля nul_dr, нетрудно проследить всю цепочку, организовав поиск нужного драйвера и непосредственное обращение к нему.

[Назад] [Содеожание] [Дальше]