Таблица 1



Таблица 1

(-2) 2mcb_seg сегмент первого управляющего блока памяти (MCB)
(0) 4 dev_cb указатель на первый блок управления устройствами DOS (DOS Device Control Block)
(+4) 4 file_tab указатель на таблицу файлов DOS
(+8) 4clock_dr указатель на драйвер CLOCK$, установленный или резидентный
(+12) 4con_dr указатель на актуальный драйвер CON, установленный или резидентный
------------------------- DOS 2.x -------------------------
(+16) 1num_lgdr число логических драйверов в системе
(+17) 2max_btbl максимальное число байт/блоков любого блочного устройства
(+19) 4disk_buf указатель на первый дисковый буфер
(+23) null_dr начало драйвера NUL - первого драйвера в списке драйверов DOS
--------------- DOS 3.x, 4.x----------------
(+16) 2 max_btbl максимальное число байт в блоке блочного устройства
(+18) 4disk_buf указатель на первый дисковый буфер
(+22) 4drv_info указатель на массив информации об устройствах
(+26) 4fcb_tabl указатель на таблицу FCB
(+30) 2fcb_size размер таблицы FCB
(+32) 1num_bdev число блочных устройств
(+33) 1lastdriv значение LASTDRIVE в файле CONFIG.SYS (по умолчанию равно 5)
(+34) null_dr начало драйвера NUL - первого драйвера в списке драйверов DOS

Функция get_cvt возвращает адрес поля dev_cb. Для удобства работы с векторной таблицей связи определим тип CVT: #pragma pack(1) typedef struct _CVT_ { 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; #pragma pack()

Эта структура содержит описание полей векторной таблицы связи для MS-DOS версий 3.х, 4.х и 5.0.

Директива #pragma pack(1) предназначена для выравнивания полей структуры на границу байта. Эта директива необходима потому, что по умолчанию транслятор Microsoft выравнивает поля в структуре на границу 16-ти битового слова. Неправильное выравнивание может привести к тому, что поля структуры не будут располагаться в памяти последовательно.

Заметьте, что функция get_cvt возвращает указатель на поле dev_cb. Модифицируем эту функцию так, чтобы можно было использовать для обращения к полям векторной таблицы связи структуру _CVT_: /** *.Name get_mcvt * *.Title Получить адрес векторной таблицы связи * *.Descr Функция возвращает адрес векторной таблицы связи * для DOS версий 2.х, 3.х, 4.00, 4.01 * *.Params Нет * *.Return Указатель на векторную таблицу связи **/ #include <dos.h> #include <stdio.h> #include "sysp.h" CVT far *get_mcvt(void) { union REGS inregs, outregs; struct SREGS segregs; inregs.h.ah = 0x52; intdosx( &inregs, &outregs, &segregs ); return((CVT far*)FP_MAKE(segregs.es,outregs.x.bx-2)); }

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



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