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


Пример 9 - часть 2


и число секторов */ sect=boot->ResSect+boot->FatSize*boot->FatCnt; lastsect=boot->RootSize*32/boot->SectSize+sect; } else { /* подкаталог */ sect=Clust_to_Sect(clust); lastsect=boot->ClustSize+sect; } /* посекторное чтение всего корневого каталога или одного кластера подкаталога */ for (; sect<lastsect; sect++) { Sect_to_Daddr(sect); Read_13(dir); /* поиск имени в прочитанном секторе */ if ((dirnum=Find_Name())>=0) goto FIND; } /* до последнего кластера подкаталога */ } while (clust=Next_Clust(clust)); /* весь каталог просмотрен, а имя не найдено - ошибка */ printf("%s -",cname); if (jobptr==NULL) End_of_Job(4); else End_of_Job(5); FIND: /* имя найдено */ rootdir=0; } while (jobptr!=NULL); /* найдено имя файла */ /* из оглавления получаем размер и 1-й кластер */ fsize=dir[dirnum].size; clust=dir[dirnum].cl; text=(char *)buff2; /* движение по файлу */ do { sect=Clust_to_Sect(clust); lastsect=sect+boot->ClustSize; /* посекторное чтение кластера */ for ( ; sect<lastsect; sect++) { Sect_to_Daddr(sect); Read_13(text); /* распечатка прочитанного кластера */ for (n=0;n<boot->SectSize;n++) { printf("%c",text[n]); /* контроль длины файла */ if (!(--fsize)) goto EOJ; } } } while (clust=Next_Clust(clust)); /* если кластеры закончились, а длина не исчерпана - ошибка */ printf("\n%s -",job); End_of_Job(6); EOJ: /* нормальное завершение программы */ printf("\n"); End_of_Job(7); } /*---------------------------------------*/ /* чтение MBR и поиск требуемого раздела */ void Read_Mbr(void) { int i; char ndrive; word *EndList; caddr.h=0; caddr.ts=1; ndrive='C'; mbr=(struct MBR *)buff1; NEXT: Read_13(buff1); for (EndList=(word *)&mbr->rt[(i=0)]; (*EndList!=0xaa55)&&(mbr->rt[i].Size>0L); EndList=(word *)&mbr->rt[++i]) { if (mbr->rt[i].SysCode==5) { caddr.h=mbr->rt[i].Begin_Hd; caddr.ts=mbr->rt[i].Begin_SecTrk; goto NEXT; } if (ndrive==job[0]) { movmem(&mbr->rt[i],&part,sizeof(struct PART)); return; } else ndrive++; } /* требуемый раздел не найден */ printf("%c: -",job[0]); End_of_Job(1); } /*---------------------*/ /* чтение boot-сектора */ void Read_Boot(void) { if (Fdisk<0x80) { caddr.h=0; caddr.ts=1; } else { caddr.h=part.Begin_Hd; caddr.ts=part.Begin_SecTrk; } Read_13(buff1); boot=(struct BootRec *)buff1;__ _.Get_First(); } /*------------*/ /* чтение FAT */ void Read_Fat(void) { dword s, ls; byte *f; fat=(byte *)malloc(boot->FatSize*boot->SectSize); if (fat==NULL) { printf("Размещение FAT -"); End_of_Job(3); } fatalloc=1; s=boot->ResSect; ls=s+boot->FatSize; for (f=fat; s<ls; s++) { Sect_to_Daddr(s); Read_13(f); f+=boot->SectSize; } /* установка формата FAT */ if (Fdisk>=0x80) if (part.SysCode==1) fat16=0; else fat16=1; else fat16=0; } /*--------------------------------------------*/ /* чтение 1 сектора при помощи прерывания 13. */ void Read_13(void *mem) { /* mem - адрес в ОП */ union REGS rr; struct SREGS sr; rr.h.ah=2; rr.h.al=1; rr.h.dl=Fdisk; rr.h.dh=caddr.h; rr.x.cx=caddr.ts; sr.es=FP_SEG(mem); rr.x.bx=FP_OFF(mem); int86x(0x13,&rr,&rr,&sr); /* Проверка ошибок чтения */ if (rr.x.cflag&1) { printf("%u -",rr.h.ah); End_of_Job(2); } } /*-------------------------------------------------*/ /* определение абс.номера сектора начала лог.диска */ void Get_First(void) { word s, t; if (Fdisk<0x80) FirstSect=0; else { /* формирование # сектора из физич.


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