сегмент первого управляющего блока памяти
Таблица 1
(-2) 2 | mcb_seg | сегмент первого управляющего блока памяти (MCB) |
(0) 4 | dev_cb | указатель на первый блок управления устройствами DOS (DOS Device Control Block) |
(+4) 4 | file_tab | указатель на таблицу файлов DOS |
(+8) 4 | clock_dr | указатель на драйвер CLOCK$, установленный или резидентный |
(+12) 4 | con_dr | указатель на актуальный драйвер CON, установленный или резидентный |
|
| ------------------------- DOS 2.x ------------------------- |
(+16) 1 | num_lgdr | число логических драйверов в системе |
(+17) 2 | max_btbl | максимальное число байт/блоков любого блочного устройства |
(+19) 4 | disk_buf | указатель на первый дисковый буфер |
(+23) | null_dr | начало драйвера NUL - первого драйвера в списке драйверов DOS |
|
| --------------- DOS 3.x, 4.x---------------- |
(+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 - первого драйвера в списке драйверов 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)); }
Ниже будут подробно описаны отдельные поля векторной таблицы связи и приведены примеры использования информации из этой таблицы.
Содержание Назад Вперед