MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 2.1. Поля векторной таблицы связиПриведем список полей векторной таблицы связи
MS-DOS. Для каждого поля мы укажем его смещение
относительно адреса, полученного при помощи
недокументированной функции 52h, размер в байтах,
имя и краткое описание.
Заметим, что функция 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, нетрудно проследить всю цепочку, организовав поиск нужного драйвера и непосредственное обращение к нему. |