MS-DOS для программиста© Александр Фролов, Григорий ФроловТом 18, М.: Диалог-МИФИ, 1995, 254 стр. 2.8. Блок описания дисков DINFOОчень интересные сведения находятся в структуре, адрес которой находится в поле drv_info векторной таблицы связи. Это массив, описывающий дисковые устройства. Количество элементов в массиве равно количеству дисковых устройств в системе. Для каждого диска в этом массиве можно найти текущий путь доступа в виде строки ASCIIZ , указатель на блок управления устройствами DDCB и номер начального кластера текущего каталога (кстати, если к какому-либо каталогу ни разу не обращались, в этом поле находится -1). Формат массива описания дисковых устройств DINFOПриведем формат элемента массива DINFO :
Для доступа к массиву из программ, составленных на языке программирования С, мы определили тип данных DINFO : typedef struct
{
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 ;
Программа DINFOLSTКак пример использования информации из массива DINFO приведем исходный текст программы DINFOLST, которая выводит содержимое массива на экран (листинг 2.8). Листинг 2.8. Файл dinfolst\ dinfolst.cpp #include <dos.h>
#include <stdio.h>
#include <stdlib.h>
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 ;
typedef CVT far* LPCVT ;
typedef struct _DDCB _
{
unsigned char drv_num;
unsigned char drv_numd;
unsigned sec_size;
unsigned char clu_size;
unsigned char clu_base;
unsigned boot_siz;
unsigned char fat_num;
unsigned max_dir;
unsigned data_sec;
unsigned hi_clust;
unsigned char fat_size;
char reserv1;
unsigned root_sec;
void far *drv_addr;
unsigned char media;
unsigned char acc_flag;
struct _DDCB _ far *next;
unsigned reserv2;
unsigned built;
} DDCB ;
typedef DDCB far* LPDDCB;
typedef struct
{
char path[64];
unsigned reserv1;
unsigned reserv2;
unsigned char reserv3;
LPDDCB ddcb;
unsigned cdir_clu;
unsigned reserv4;
unsigned reserv5;
unsigned reserv6;
unsigned char reserv7[7];
} DINFO ;
typedef DINFO far* LPDINFO;
void main(void);
void main(void)
{
union REGS regs;
struct SREGS sregs;
LPCVT lpCVT;
LPDINFO lpDINFO;
unsigned i,j,k;
printf("Информация о дисковых устройствах\n"
"(C) Фролов А.В., 1995\n"
"---------------------------------\n");
// Получаем адрес векторной таблицы связи
regs.h.ah = 0x52;
intdosx (®s, ®s, &sregs);
// Передвигаем указатель на поле msb_seg
lpCVT = (LPCVT )MK_FP (sregs.es, regs.x.bx - 2);
// Адрес таблицы дисковых устройств
lpDINFO = (LPDINFO)lpCVT->drv_info;
// Количество дисковых устройств
i = lpCVT->num_bdev;
for(j=0; j<i; j++)
{
printf("Адрес: %Fp, путь: %Fs\n"
"Первый кластер каталога: %d\n\n",
lpDINFO, lpDINFO->path, lpDINFO->cdir_clu);
lpDINFO = lpDINFO + 1;
}
}
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

