Системное программное обеспечение персональных ЭВМ


Пример 7



Пример 7

/*== ПРИМЕР 13.2 ==*/ /*================= Распечатка всех DPB =================*/ #include <dos.h> #define byte unsigned char #define word unsigned int struct DPB_1 { /* 1-я часть DPB */ byte dev_num, dev_num_mod; word SectSize; byte MaxSect, Log2Sect; word ResSect; byte FatCnt; word RootSize, Data1st, MaxClust, FatSize; } *dpb_1; struct DPB_2 { /* 2-я часть DPB */ word Root1st; void *drv_ptr; byte Media, access; struct DPB_1 *next; word Free1st, FreeCnt; } *dpb_2; word dd_seg, dd_off; /* адрес 1-го DPB */ byte ldrive; /* номер диска */ byte dos; /* номер версии DOS */ union REGS rr; struct SREGS sr; main() { /* номер версии DOS */ rr.h.ah=0x30; intdos(&rr,&rr); dos=rr.h.al; /* адрес CVT */ rr.h.ah=0x52; intdosx(&rr,&rr,&sr); printf("\nТаблица DPB по спискам\n"); /* адрес 1-го DPB */ dd_off=peek(sr.es,rr.x.bx); dd_seg=peek(sr.es,rr.x.bx+2); dpb_1=(struct DPB_1 *)MK_FP(dd_seg,dd_off); while(FP_OFF(dpb_1)!=0xffff) { /* движение по списку */ print_dpb(); dpb_1=dpb_2->next; } printf("\nТаблица DPB по INT 32H\n"); for(ldrive=1; ;ldrive++) { /* перебор всех дисков */ rr.h.ah=0x32; /* функция 32 */ rr.h.dl=ldrive; /* номер диска */ intdosx(&rr,&rr,&sr); if (rr.h.al==0xff) break; /* адрес DPB для диска ldrive */ dpb_1=(struct DPB_1 *)MK_FP(sr.ds,rr.x.bx); print_dpb(); } } /*==== распечатка содержимого DPB ====*/ print_dpb() { /* смещение 2-й части DPB зависит от версии DOS */ if (dos<4) dpb_2=(struct DPB_2 *)((char *)dpb_1+0x10); else dpb_2=(struct DPB_2 *)((char *)dpb_1+0x11); printf("\nАдрес DPB - %Fp\n",dpb_1); printf(" устройство %u(%u) - диск %c\n", dpb_1->dev_num,dpb_1->dev_num_mod,'A'+dpb_1->dev_num); printf(" тип носителя - %02X\n",dpb_2->Media); printf(" адрес драйвера - %Fp\n",dpb_2->drv_ptr); printf(" разм.сектора - %u(байт)\n", dpb_1->SectSize); printf(" разм.кластера - %u(сект) %u\n", dpb_1->MaxSect+1, 1<<dpb_1->Log2Sect); printf(" рез.секторов - %u\n",dpb_1->ResSect); printf (" всего кластеров - %u, начиная с сектора %u\n", dpb_1->MaxClust,dpb_1->Data1st); printf(" FAT - "); if (dos<4) printf("%u",(byte)dpb_1->FatSize); else printf("%u",dpb_1->FatSize); printf("(сект) * %u\n",dpb_1->FatCnt); printf (" корневой каталог - %u(элементов) с сектора %u\n", dpb_1->RootSize,dpb_2->Root1st); printf(" доступ - %X\n",dpb_2->access); printf(" свободный кластер - %04X",dpb_2->Free1st); printf(" (всего - %u)\n",dpb_2->FreeCnt); if (getch()==27) exit(); }

Одно из полей CVT содержит указатель на начало Массива Текущих Каталогов. В версиях DOS до 3.0 такого массива не было, подобная информация содержалась в DPB. В современных версиях DOS возникла необходимость в такой структуре данных в связи с тем, что новые команды DOS SUBST и JOINT позволяют присвоить некоторому узлу дерева каталогов идентификатор диска или наоборот - описать диск как подкаталог другого диска. Общее количество возможных идентификаторов дисков задается параметром команды LASTDRIVE в CONFIG.SYS и хранится в CVT. Каждый элемент массива - Структура Текущего Каталога (CDS - Current Directory Structure) сохраняет информацию о текущем каталоге на логическом диске.

Структура CDS для версий DOS 3.x следующая:




- Начало -  - Назад -  - Вперед -