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

MS-DOS для программиста

© Александр Фролов, Григорий Фролов
Том 18, М.: Диалог-МИФИ, 1995, 254 стр.

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

2.8. Блок описания дисков DINFO

Очень интересные сведения находятся в структуре, адрес которой находится в поле drv_info векторной таблицы связи. Это массив, описывающий дисковые устройства. Количество элементов в массиве равно количеству дисковых устройств в системе.

Для каждого диска в этом массиве можно найти текущий путь доступа в виде строки ASCIIZ , указатель на блок управления устройствами DDCB и номер начального кластера текущего каталога (кстати, если к какому-либо каталогу ни разу не обращались, в этом поле находится -1).

Формат массива описания дисковых устройств DINFO

Приведем формат элемента массива DINFO :

Смещение, байт Размер, байт Имя поля Описание
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 Зарезервировано
81 7 reserv7 Зарезервировано

Для доступа к массиву из программ, составленных на языке программирования С, мы определили тип данных 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 (&regs, &regs, &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;
  }
}

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