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


Пример 10



Пример 10

/*== ПРИМЕР 13.3 ==*/ /*======= Распечатка массива текущих каталогов ==========*/ #include <dos.h> #include <stdlib.h> #define byte unsigned char #define word unsigned int struct CDS { /* структура текущего каталога */ char path[67]; word flags; union VAR { struct { /* для DOS 3.x, 4.x */ void *ddcb; word dir_clust; byte reserved[11]; } dos4; struct { /* для DOS 5.x и выше */ byte drive reserved1; word par_clust, par_entry,dir_clust; byte reserved2[4]; } dos5; } dosx; } *cds; word a_seg, a_off; /* нач.адрес массива */ byte lastdrive; /* LASTDRIVE из CONFIG */ byte ndrive; /* счетчик */ word units; /* число блочных устр-в */ byte dos; /* версия DOS */ int cds_size; /* размер CDS */ union REGS rr; struct SREGS sr; main() { /* номер версии DOS */ rr.h.ah=0x30; intdos(&rr,&rr); dos=rr.h.al; if (dos!=4) cds_size=81; else cds_size=88; /* адрес CVT */ rr.h.ah=0x52; intdosx(&rr,&rr,&sr); printf("\nМассив текущих каталогов\n"); /* выборка информации из CVT */ a_off=peek(sr.es,rr.x.bx+22); a_seg=peek(sr.es,rr.x.bx+24); cds=(struct CDS *)MK_FP(a_seg,a_off); lastdrive=peekb(sr.es,rr.x.bx+33); printf("LASTDRIVE - %u\n",lastdrive); for(ndrive=0; ndrive<lastdrive; ndrive++) { printf("Адрес CDS - %Fp\n",cds); printf(" path - %s\n",cds->path); if (dos<5) { printf(" адр.DPB - "); if (cds->dosx.dos4.ddcb==NULL) printf("пусто\n"); else { printf(" %Fp\n",cds->dosx.dos4.ddcb); printf(" флаги - %04X\n",cds->flags); printf(" 1-й кластер тек.каталога - %04X\n", cds->dosx.dos4.dir_clust); } } else { printf(" флаги - %04X\n",cds->flags); printf(" 1-й кластер тек.каталога - %04X\n",cds->dosx.dos5.dir_clust); printf(" лог.диск #%d\n",cds->dosx.dos5.drive); printf(" верхний каталог - кластер %04X,",cds->dosx.dos5.par_clust); printf(" вход - %d\n",cds->dosx.dos5.par_entry); } cds=(struct CDS *)((byte *)cds+cds_size); if (getch()==27) exit(0); } }




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