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

Операционная система 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:

(0) 64 path текущий путь доступа для диска
(+64) 2 reserv1 зарезервировано
(+66) 2 reserv2 зарезервировано
(+68) 1 reserv3 зарезервировано
(+69) 4 ddcb адрес соответствующего DDCB
(+73) 2 cdir_clu первый кластер текущего каталога на диске. 0 соответствует корневому каталогу, -1 - если к диску еще не обращались
(+75) 2 reserv4 зарезервировано
(+77) 2 reserv5 зарезервировано
(+79) 2 reserv6 зарезервировано
    ---------------- для DOS 4.х -----------------
(+81) 7 reserv7 зарезервировано

Приводимое ниже определение типа 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 и использовать соответствующие форматы управляющих блоков.

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