/*-------Лабораторная работа N8----------------*/
/*---"Главная загрузочная запись"--------------*/
/* Стандартные заголовки */
#include <dos.h>
#include <conio.h>
/* Типы данных */
#define byte unsigned char
#define word unsigned int
#define dword unsigned long
void read_MBR(void); /* Чтение MBR */
/* Получение из упакованного SecTrk # сектора */
#define SECT(x) x&0x3f
/* Получение из упакованного SecTrk # дорожки */
#define TRK(x) (x>>8)|((x<<2)&0x300)
/* структура элемента раздела */
struct Part {
byte ActFlag; /* признак активного раздела */
/* физический адрес начала раздела */
byte Begin_Hd; /* # головки */
word Begin_SecTrk; /* # сектора и дорожки */
byte SysCode; /* код системы */
/* физический адрес конца раздела */
byte End_Hd; /* # головки */
word End_SecTrk; /* # сектора и дорожки */
dword RelSec; /* # сектора початку */
dword Size; /* количество секторов */
};
/* стpуктуpа главной загрузочной записи */
struct MBR {
char LoadCode[0x1be]; /* п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;
/*-----------------------------------------------*/
main()
{
textbackground(0);
clrscr();
textattr(0x0a);
cprintf(" Лабораторная работа N8");
gotoxy(1,2);
cprintf(" Главная загрузочная запись");
textattr(12);
gotoxy(30,4);
cprintf("Разделы жесткого диска:\n");
gotoxy(1,6);
textattr(11);
cprintf("Лог.диск -----> \n\r");
cprintf("Признак ------> \n\r");
cprintf("Код системы --> \n\r");
cprintf("Начало: гол.--> \n\r");
cprintf(" дор.--> \n\r");
cprintf(" сект.-> \n\r");
cprintf("Конец: гол.--> \n\r");
cprintf(" дор. -> \n\r");
cprintf(" сект.-> \n\r");
cprintf("Нач.сектор ---> \n\r");
cprintf("Размер -------> \n\r");
textcolor(11);
NEXT:
read_MBR();
for (EndList=(word *)&mbr.rt[(i=0)];
(*EndList!=0xaa55)&&(mbr.rt[i].Size>0L);
EndList=(word *)&mbr.rt[++i])
{
/* кооpдинаты куpсоpа */
y=6;
x+=7;
gotoxy(x,y++);
if (mbr.rt[i].SysCode==5)
{textattr(13);
cprintf("Ext ");
}
else
textattr(12);
cprintf("%-7c",'C'+ndrive++);
gotoxy(x,y++); textattr(14);
cprintf("%02xH ",mbr.rt[i].ActFlag);
gotoxy(x,y++); textattr(15);
cprintf("%-7d",mbr.rt[i].SysCode);
gotoxy(x,y++); textattr(14);
cprintf("%-7d",mbr.rt[i].Begin_Hd);
gotoxy(x,y++); textattr(15);
cprintf("%-7u",TRK(mbr.rt[i].Begin_SecTrk));
gotoxy(x,y++); textattr(14);
cprintf("%-7u",SECT(mbr.rt[i].Begin_SecTrk));
gotoxy(x,y++); textattr(15);
cprintf("%-7d",mbr.rt[i].End_Hd);
gotoxy(x,y++); textattr(14);
cprintf("%-7u",TRK(mbr.rt[i].End_SecTrk));
gotoxy(x,y++); textattr(15);
cprintf("%-7u",SECT(mbr.rt[i].End_SecTrk));
gotoxy(x,y++); textattr(14);
cprintf("%-7lu",mbr.rt[i].RelSec);
gotoxy(x,y++); textattr(15);
cprintf("%-7lu",mbr.rt[i].Size);
if (mbr.rt[i].SysCode==5)
{
/* если код системы 5, pаздел содержит свою таблицу pазделов; определяется ее дисковый адpес, и новая таблица считывается в память */
head=mbr.rt[i].Begin_Hd;
Sect_Trk=mbr.rt[i].Begin_SecTrk;
goto NEXT;
}
}
gotoxy(x,y++);
textattr(10+128);
gotoxy(29,18);
cprintf("Нажмите любую клавишу...");
getch();
}
/*-----------Читання MBR------------------------*/
void read_MBR(void)
{
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();
}
}