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


Пример 6



Пример 6

/*== ПРИМЕР 10.4 ==*/ /*========== Чтение Таблицы Размещения Файлов ==========*/ #include <dos.h> #include <alloc.h> #define byte unsigned char #define word unsigned int #define dword unsigned long /* Структура корневой записи */ struct RootRec { byte jmp[3], ident[8]; word SectSize; byte ClustSize; word ResSect; byte FatCnt; word RootSize, TotSecs; byte Media; word FatSize, TrkSecs, HeadCnt, HidnSecL, HidnSecH; dword LongTotSecs; byte Drive; byte reserved1, DOS4_flag; dword VolNum; char VolLabel[11], FatForm[8]; } *rt; /* Структура параметров для INT 25 */ struct{ dword first_sect; word count; byte *ptr; } parm; union REGS rr; struct SREGS sr; main() { byte *buff; /* адрес буфера в ОП */ byte sys; /* признак диска > 32 Мбайт */ char drive; /* идентификатор диска */ byte fat16; /* признак 16-битной FAT */ word ss; int i,k,m,j;

ASK1:printf("\nУкажите идентификатор диска (A,B...) >"); drive=getche(); if (drive>'b') { ASK2:printf("\nОбьем лог. диска больше 32 Мбайт? (y/n) >"); sys=getche(); switch(sys) { case 'y': sys=1;break; case 'n': sys=0;break; default: goto ASK2; } } else sys=0; buff=(byte *)malloc(512); /* Чтение boot-сектора */ rr.h.al=drive-'a'; /* Диск */ if (!sys) { rr.x.cx=1; rr.x.dx=0; sr.ds=FP_SEG(buff); rr.x.bx=FP_OFF(buff); } else { sr.ds=FP_SEG(&parm); rr.x.bx=FP_OFF(&parm); parm.first_sect=0; parm.count=1; parm.ptr=buff; rr.x.cx=0xffff; } int86x(0x25,&rr,&rr,&sr); readerror(); rt=(struct RootRec *)buff; /* определение формата FAT */ if (rt->DOS4_flag==41) { /* для диска, отформатированного в DOS 4 можно определить формат FAT из Boot-сектора */ if (!memcmp(rt->FatForm,"FAT16",5)) fat16=1; else fat16=0; } else { ASK3:printf("\nФормат FAT 12-битный? (y/n)"); fat16=getche(); switch(fat16) { case 'y': fat16=0; break; case 'n': fat16=1; break; default: goto ASK3; } } /* Выделение памяти под FAT */ buff=(byte *)realloc(buff,rt->FatSize*512); if (buff==NULL) { printf("Нехватка памяти\n"); exit(); } /* Чтение FAT */ rr.h.al=drive-'a'; if (!sys) { /* маленький диск */ rr.x.cx=rt->FatSize; rr.x.dx=rt->ResSect; sr.ds=FP_SEG(buff); rr.x.bx=FP_OFF(buff); } else { /* большой диск */ parm.first_sect=rt->ResSect; parm.count=rt->FatSize; parm.ptr=buff; sr.ds=FP_SEG(&parm); rr.x.bx=FP_OFF(&parm); rr.x.cx=0xffff; } int86x(0x25,&rr,&rr,&sr); readerror(); clrscr(); /* Форматная распечатка FAT */ printf(" Диск %c: FAT - %d бит\n", drive-32,fat16*4+12); printf(" |"); for(i=0;i<10;printf("%5d ",i++)); printf("\n____|____________________________________"); printf("________________________"); for(j=0,i=0,k=0;i<220;i++) { if (!k) printf("\n%3d |",j); if (!fat16) { m=(i*3)/2; ss=*(word *)(buff+m); if(i%2) /* нечетный элемент */ ss>>=4; else /* четный элемент */ ss&=0x0fff; if (ss>0x0fef) printf(" %03xH ",ss); else printf("%5d ",ss); } else { m=i*2; ss=*(word *)(buff+m); if (ss>0xffef) printf("%04xH ",ss); else printf("%5d ",ss); } if (++k>=10) { j+=10; k=0; } } getch(); free(buff); } /*==== Проверка ошибок чтения ====*/ readerror() { if (rr.x.cflag) { printf("\nОшибка чтения: %x. ",rr.h.ah); printf("Нажмите любую клавишу...\n\7"); getch(); exit(); } }




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