Операционная система MS-DOS© Александр Фролов, Григорий ФроловТом 1, книги 1-2, М.: Диалог-МИФИ, 1991. 2.6. Другие поля векторной таблицы связиКак мы только что увидели, все драйверы связаны в цепочку, которую нетрудно проследить. Для драйверов часов CLOCK$ и консоли CON векторная таблица связи содержит их актуальные адреса, соответственно в полях clock_dr и con_dr. Если вам надо получить адреса актуальных драйверов, то самый быстрый способ - взять эти адреса из векторной таблицы связи. Поле lastdriv содержит значение команды LASTDRIVE в файле CONFIG.SYS. Его можно использовать для определения максимального количества дисковых устройств в системе. Количество действительно используемых блочных устройств находится в поле num_bdev. Если CONFIG.SYS содержит команду FCBS=xx, то в поле fcb_tabl находится адрес таблицы FCB, а в поле fcb_size - размер этой таблицы. В поле max_btbl находится максимальное число байтов, содержащихся в блоке блочного устройства. Очень интересные сведния находятся в массиве дисковой информации, на который указывает поле drv_info векторной таблицы связи. Количество элементов этого массива равно количеству дисковых устройств в системе. Для каждого диска в этом массиве можно найти текущий путь доступа в виде строки ASCIIZ, указатель на блок управления устройствами DOS DDCB, номер начального кластера текущего каталога (кстати, если к какому-либо каталогу ни разу не обращались, в этом поле находится -1). Приведем формат элемента массива и соответствующую структуру в файле sysp.h:
Приводимое ниже определение типа DINFO соответствует формату MS-DOS 4.х.
#pragma pack(1)
typedef struct _DINFO_ {
char path[64];
unsigned reserv1;
unsigned reserv2;
unsigned char reserv3;
DDCB far *ddcb;
unsigned cdir_clu;
unsigned reserv4;
unsigned reserv5;
unsigned reserv6;
unsigned char reserv7[7];
} DINFO;
#pragma pack()
Как пример использования этой информации приведем программу, которая выводит содержимое массива на экран:
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include "sysp.h"
void main(void);
void main(void)
{
CVT far *cvt;
DINFO far *dinfo;
unsigned i,j,k;
printf("Информация о дисковых устройствах\n"
"Copyright Frolov A. (C),1990\n");
cvt=get_mcvt(); // Адрес векторной таблицы связи
dinfo=cvt->drv_info; // Адрес таблицы дисковых
// устройств
i=cvt->num_bdev; // Количество дисковых устройств
for(j=0;j<i;j++) {
printf("Адрес: %Fp,путь: %Fs\n"
"Первый кластер каталога: %d\n\n",
dinfo,
dinfo->path,
dinfo->cdir_clu);
dinfo = dinfo+1;
}
exit(0);
}
На этом мы завершаем изучение векторной таблицы связи MS-DOS. Еще раз уместно напомнить, что вся приведенная выше информация отсутствует в документации и может меняться (и действительно меняется!) от версии к версии. Если вы хотите использовать описанные выше средства, вам необходимо динамически определять версию DOS и использовать соответствующие форматы управляющих блоков. |

