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


Пример 4



Пример 4

/*== ПРИМЕР 10.2 ==*/ /*=== Чтение и анализ гл.загруз.записи твердого диска ===*/ #include <dos.h> #define byte unsigned char #define word unsigned int #define dword unsigned long #define SECT(x) x&0x3f #define TRK(x) (x>>8)|((x<<2)&0x300) main() { /* структура элемента раздела */ struct Part { byte ActFlag; /* описатель*/ /* физический адрес начала раздела */ byte Begin_Hd; /* # головки */ word Begin_SecTrk; /* # сектора и дорожки */ byte SysCode; /* код системы */ /* физический адрес конца раздела */ byte End_Hd; /* # головки */ word End_SecTrk; /* # сектора и дорожки */ dword RelSec; /* # сектора начала */ dword Size; /* число секторов */ }; /* стpуктуpа главной загpузочной записи */ struct MBR { char LoadCode[0x1be]; /* пpогpамма загpузки */ struct Part rt[4]; /* 4 эл-та pазделов */ word EndFlag; /* подпись MBR */ } mbr; int x=10,y; /* экpанные кооpдинаты */ byte head=0; /* номеp головки (0) */ word Sect_Trk=1; /* номеp доpожки и сектоpа (0,1) */ int ndrive=0; /* номеp лог.диска */ word *EndList; /* указатель на подпись */ union REGS rr; struct SREGS sr; word i;

clrscr(); printf("Разделы жесткого диска # 1\n"); printf("==========================\n\n"); printf("Лог.диск \nПризнак = \n printf("Код системы = \nНачало: гол.= \n"); printf(" дор. = \n сект. = \n"); printf("Конец : гол.= \n дор. = \n"); printf(" сект.= \nНач.сектор = \n"); printf("Размер = \n"); NEXT: /* Чтение при помощи прерывания 13. Только таким путем можно прочитать MBR, т.к. она не принадлежит никакому логическому диску. */ rr.h.ah=2; /* Чтение */ rr.h.al=1; /* Секторов 1 */ rr.h.dl=0x80; /* Тв.диск */ rr.h.dh=head; /* Головка */ rr.x.cx=Sect_Trk; /* Дорожка, сектор */ sr.es=FP_SEG(&mbr); /* Адрес буфера в ОП */ rr.x.bx=FP_OFF(&mbr); int86x(0x13,&rr,&rr,&sr); /* Проверка ошибок чтения */ if (rr.x.cflag) { printf("Ошибка чтения: %x. ",rr.h.ah); printf("Нажмите любую клавишу...\n\7"); getch(); exit(); } /* В нач.установках EndList указывает на 1-й байт 1-го элемента pаздела */ for (EndList=(word *)&mbr.rt[(i=0)]; /* пока не встpетилась подпись MBR или pаздел нулевого pазмеpа */ (*EndList!=0xaa55)&&(mbr.rt[i].Size>0L); /* пеpеход к след.


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