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


Пример 9



Пример 9

/*== ПРИМЕР 10.6 ==*/ /*======== Поиск и чтение файла средствами BIOS ========*/ #include <dos.h> #include <string.h> #include <stdlib.h> #include <ctype.h> /*== типы и структуры данных ==*/ #define byte unsigned char #define word unsigned int #define dword unsigned long #define daddr struct DADDR struct DADDR { /* физический дисковый адрес */ byte h; /* головка */ word s, /* сектор */ t, /* дорожка */ ts; /* сектор, дорожка упакованные */ }; struct PART { /* структура элемента раздела */ byte Boot, Begin_Hd; word Begin_SecTrk; byte SysCode, End_Hd; word End_SecTrk; dword RelSec, Size; }; struct MBR { /* стpуктуpа главной загpузочной записи */ char LoadCode[0x1be]; struct PART rt[4]; word EndFlag; }; struct BootRec { /* структура корневой записи */ byte jmp[3], ident[8]; word SectSize; byte ClustSize; word ResSect; byte FatCnt; word RootSize ,TotSecs; byte Media; word FatSize, TrkSecs, HeadCnt; word HidnSecL, HidnSecH; dword LongTotSecs; byte Drive, reserved1, DOS4_flag; dword VolNum; char VolLabel[11], FatForm[8]; }; struct Dir_Item { /* структура элемента оглавления */ char fname[11]; byte attr; char reserved[10]; word time, date, cl; dword size; }; /*== описания функций ==*/ void Read_Mbr(void); void Read_Boot(void); void Get_First(void); void Read_Fat(void); void Read_13(void *mem); void Sect_to_Daddr(dword sect); dword Clust_to_Sect(word clust); word Next_Clust(word clust); char *Get_Name(char *s, char *d); int Find_Name(); void End_of_Job(int n); /*== переменные ==*/ struct PART part; /* текущий элемент раздела */ byte buff1[512]; /* буфер MBR и boot */ struct MBR *mbr; /* указатель на таблицу разделов */ struct BootRec *boot; /* указатель на корневую запись */ byte buff2[512]; /* буфер каталога и текста */ struct Dir_Item *dir; /* указатель на часть каталога */ char *text; /* указатель на текстовый буфер */ byte *fat; /* указатель на FAT */ char job[81]; /* строка-задание */ char *jobptr; /* текущий указатель в job */ char cname[12]; /* текущее имя для поиска */ byte Fdisk; /* физический номер диска */ daddr caddr; /* текуший дисковый адрес */ dword sect; /* текуший номер сектора */ word clust; /* текуший номер кластера */ byte fat16; /* признак формата FAT */ dword fsize; /* размер файла */ int dirnum; /* номер элемента в оглавлении */ dword FirstSect; /* абс.сектор начала */ byte rootdir=1; /* признак корневого каталога или подкаталога (1/0) */ word lastsect; /* последний сектор при чтении */ byte fatalloc=0; /* признак выделения памяти */ /*-------------------------------------------------*/ main() { int n; /* ввод имени файла */ printf("Укажите имя файла >"); scanf("%s",job); /* перевод в верхний регистр */ strupr(job); /* проверка правильности идентификатора диска */ if ((!isalpha(job[0]))(job[1]!=':')(job[2]!='\\')) { printf("%c%c%c -",job[0],job[1],job[2]); End_of_Job(0); } jobptr=job+3; if (job[0]>'A') { /* для жесткого диска - физический номер и чтение MBR */ Fdisk=0x80; Read_Mbr(); } else /* для гибкого диска - физический номер */ Fdisk=job[0]-'A'; Read_Boot(); /* чтение boot-сектора */ Read_Fat(); /* чтение FAT */ dir=(struct Dir_Item *)buff2; do { /* движение по каталогам */ if (!rootdir) clust=dir[dirnum].cl; /* начальный кластер */ /* выделение следующего элемента из строки-задания */ jobptr=Get_Name(jobptr,cname); do { /* пока не дойдем до последнего кластера */ if (rootdir) { /* корневой каталог */ /* нач.сектор корневого огл.


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