//readmbr.c //written by, Soni #include "mbr.h" static void near * ptrMBR; static void near * ptrFATA; static void near * ptrDIR; unsigned int cyl = ZERO; unsigned int head = ZERO; unsigned int sec = ZERO; /* sectors , sectors/cylinder, sectors/track */ extern void getCHS(unsigned int, unsigned int, unsigned int); char ptrFileName[11] = {'B','O','O','T',' ',' ',' ',' ','I','M','G'}; void main(int argc, char * argv[]){ unsigned int flag = ZERO; unsigned int fatCount = ZERO; unsigned int reservedArea = ZERO; unsigned int ra = ZERO; /* reserved Area */ unsigned int sc = ONE; /* sector count */ unsigned int link = ZERO; unsigned blockFileHandle = ZERO; unsigned char CHSCHS[THREE]; unsigned int fatSize = ZERO; unsigned int sectorSize = ZERO; unsigned int sectorsPerTrack = ZERO; unsigned int mediaDescriptor = ZERO; unsigned int dirSectorCount = ZERO; unsigned int dirSize = ZERO; unsigned int count = ZERO; unsigned int localCount = ZERO; unsigned int A = ZERO; unsigned int B = ZERO; unsigned int BB = ZERO; if( ( ptrMBR = malloc(SIZE * TWO) ) == NULL ){ printf("Unable to allocate memory in the near heap.\n"); printf("Check the value of directive SIZE, if it is more than 0x0200,\n"); printf("then decrease it by 0x0100 and then recompile.\n"); return; } //reads MBR from the FD. //A drive is default. Change DRIVE_FD for other drive. flag = readSector(ptrMBR, DRIVE_FD + HEAD, TRACK + SECTOR_ONE, SECTORS); if( flag != 0 ){ printf("Read error %.4x\n",flag); return; } //check if what is read, is MBR. /* if( ((unsigned char *)ptrMBR)[SYMBOLAINDEX] == SYMBOLA && ((unsigned char *)ptrMBR)[SYMBOLBINDEX] == SYMBOLB ) printf("read MBR....\n\n"); else{ printf("unable to read MBR, returning\n"); return; } */ if(*((unsigned char *)ptrMBR) != 0xeb && *((unsigned char *)ptrMBR + 1) != 0x3c){ printf("Dude your are not dealing with DOS bootable disk.... returning\n"); return; } else printf("JMP 03Eh(short jump)\n"); printf("\Bytes per sector = %.2x%.2xh\n",*( (unsigned char *)ptrMBR + INDEX(1) ), *( (unsigned char *)ptrMBR + INDEX(0) ) ); printf("Number of sectors per cluster = %.2xh\n", *( (unsigned char *)ptrMBR + INDEX(2) ) ); printf("Number of sectors in reserved area = %.2x%.2xh\n", *( (unsigned char *)ptrMBR + INDEX(4) ), *( (unsigned char *)ptrMBR + INDEX(3) ) ); printf("Number of copies of FAT = %.2xh\n", *( (unsigned char *)ptrMBR + INDEX(5) ) ); printf("Number of root directory entries = %.2x%.2xh\n",*( (unsigned char *)ptrMBR + INDEX(7) ), *( (unsigned char *)ptrMBR + INDEX(6) ) ); printf("Total number of sectors = %.2x%.2xh\n",*( (unsigned char *)ptrMBR + INDEX(9) ), *( (unsigned char *)ptrMBR + INDEX(8) ) ); printf("DOS media descriptor = %.2xh\n",*( (unsigned char *)ptrMBR + INDEX(10) ) ); printf("Number of sectors per FAT = %.2x%.2xh\n", *( (unsigned char *)ptrMBR + INDEX(12) ), *( (unsigned char *)ptrMBR + INDEX(11) ) ); printf("Number of sectors per track = %.2x%.2xh\n", *( (unsigned char *)ptrMBR + INDEX(14) ), *( (unsigned char *)ptrMBR + INDEX(13) ) ); printf("Number of heads = %.2x%.2xh\n", *( (unsigned char *)ptrMBR + INDEX(16) ), *( (unsigned char *)ptrMBR + INDEX(15) ) ); printf("Number of hidden sectors = %.2x%.2xh\n", *( (unsigned char *)ptrMBR + INDEX(18) ), *( (unsigned char *)ptrMBR + INDEX(17) ) ); mediaDescriptor = *( (unsigned char *)ptrMBR + INDEX(10)); *((unsigned char *)&fatSize) = *( (unsigned char *)ptrMBR + INDEX(11)); *((unsigned char *)&fatSize + ONE) = *( (unsigned char *)ptrMBR + INDEX(12)); *((unsigned char *)&fatCount) = *( (unsigned char *)ptrMBR + INDEX(5) ); *((unsigned char *)&reservedArea) = *( (unsigned char *)ptrMBR + INDEX(3) ); *((unsigned char *)&reservedArea + ONE) = *( (unsigned char *)ptrMBR + INDEX(4) ); *((unsigned char *)§orSize) = *( (unsigned char *)ptrMBR + INDEX(0) ); *((unsigned char *)§orSize + ONE) = *( (unsigned char *)ptrMBR + INDEX(1) ); *((unsigned char *)§orsPerTrack) = *( (unsigned char *)ptrMBR + INDEX(13) ); *((unsigned char *)§orsPerTrack + ONE) = *( (unsigned char *)ptrMBR + INDEX(14) ); if( ( ptrFATA = malloc(fatSize * sectorSize * fatCount) ) == NULL ){ printf("Unable to allocate memory in the near heap.\n"); printf("Check the value of directive SIZE, if it is more than 0x0200,\n"); printf("then decrease it by 0x0100 and then recompile.\n"); return; } printf("\n\nReading FAT.....\n"); sc = reservedArea; for(; count <(fatCount * fatSize);){ if( sc < sectorsPerTrack){ sc++; } else{ sc = ONE; if( ra > ZERO ) ra = ZERO; if( A == HEAD ) A = HEAD_ONE; else{ A = HEAD; BB = BB + 0x0100; /* Increasing the track */ } } B = BB + sc; printf("#"); flag=ZERO; flag = readSector( ((unsigned char *)ptrFATA + (count * sectorSize)), A, B, SECTORS); if( flag != 0 ){ printf("Read error %.4x\n",flag); return; } printf("##"); count++; } printf("\n\n"); if(fatCount > ONE) for(count=ZERO ; count<(fatSize * sectorSize); ){ if( *((unsigned char *)ptrFATA + count) != *((unsigned char *)ptrFATA + (fatSize * sectorSize) + count) ){ printf("\n\nFAT MISMATCH :-( \n"); printf("%.2x,%2x,%.2x <> ",*((unsigned char *)ptrFATA + count),*((unsigned char *)ptrFATA + count + ONE),*((unsigned char *)ptrFATA + count + TWO)); printf("%.2x,%2x,%.2x .\n", *((unsigned char *)ptrFATA + (fatSize * sectorSize) + count),*((unsigned char *)ptrFATA + (fatSize * sectorSize) + count + ONE),*((unsigned char *)ptrFATA + (fatSize * sectorSize) + count + TWO)); return; } count++; } /* for(count = ZERO; count < ((fatSize * sectorSize));){ if( (*((unsigned int *)ptrFATA + count) & 0x0FFF ) == ZERO ){ *((unsigned int *)((unsigned char *)ptrFATA + count)) = *((unsigned int *)((unsigned char *)ptrFATA + count)) + 0x0ff7; printf("[%d = %.4x]", count / THREE, *((unsigned int *)((unsigned char *)ptrFATA + count)) & 0xFFFF); } if( ( *((unsigned int *)((unsigned char *)ptrFATA + count + ONE)) & 0xFFF0 ) == ZERO ){ *((unsigned int *)((unsigned char *)ptrFATA + count + ONE)) = *((unsigned int *)((unsigned char *)ptrFATA + count + ONE)) + 0xff70; printf("<%d = %.4x>",count/THREE, *((unsigned int *)((unsigned char *)ptrFATA + count + ONE)) & 0xFFFF ); } count+=THREE; } for(count=ZERO ; count<(fatSize * sectorSize); ){ *((unsigned char *)ptrFATA + (fatSize * sectorSize) + count) = *((unsigned char *)ptrFATA + count); count++; } */ switch(mediaDescriptor){ case 0xf0: dirSectorCount = 14; dirSize = dirSectorCount * sectorSize; break; } if( ( ptrDIR = malloc(dirSize) ) == NULL ){ printf("Unable to allocate memory in the near heap.\n"); printf("Check the value of directive SIZE, if it is more than 0x0200,\n"); printf("then decrease it by 0x0100 and then recompile.\n"); return; } printf("Reading DIR.....\n"); for(count = ZERO; count <(dirSectorCount);){ if( sc < sectorsPerTrack){ sc++; } else{ sc = ONE; if( ra > ZERO ) ra = ZERO; if( A == HEAD ) A = HEAD_ONE; else{ A = HEAD; BB = BB + 0x0100; /* Increasing the track */ } } B = BB + sc; printf("#"); flag=ZERO; flag = readSector( ((unsigned char *)ptrDIR + (count * sectorSize)), A, B, SECTORS); if( flag != 0 ){ printf("Read error %.4x\n",flag); return; } printf("##"); count++; } printf("\n\n"); for(count = ZERO; count < dirSize;){ for(localCount = ZERO; localCount < ELEVEN;){ if( ((unsigned char *)ptrDIR + count)[localCount] != ptrFileName[localCount] ) break; else localCount++; } if( localCount == ELEVEN ){ link = *((unsigned int *)((unsigned char *)ptrDIR + count + 26) ); break; } count+=32; } if(link > ZERO) if( (blockFileHandle = open("block.bin", O_CREAT | O_TRUNC | O_RDWR | O_BINARY, S_IREAD | S_IWRITE)) < ZERO ){ printf("Unable to open block.bin .\n"); return; } /* /////////////////////////////////////////////////////////// // */ if(link > ZERO){ while(link < 0x0FF8){ getCHS(link + 32, 0x0024, 0x0012); if( ( link % TWO) == ZERO ) link = (*((unsigned int *)((unsigned char *)ptrFATA + ((link * THREE)/TWO ))) & 0x0FFF); else{ link = (*((unsigned int *)((unsigned char *)ptrFATA + ((link * THREE)/TWO))) & 0xFFF0); link = link >> 0x04; link = link & 0x0fff; } /* if( (cyl & 0x003f) == 0x0000) cyl = cyl + 0x0001; */ *((unsigned int *)CHSCHS) = cyl; CHSCHS[TWO] = *((unsigned char *)&head); if( write(blockFileHandle, (void *)CHSCHS, THREE) < ZERO ){ printf("Unable to write the file\n"); return; } } close(blockFileHandle); } /* **************************************************************** */ /* A = ZERO; B = ZERO; BB = ZERO; printf("\n\nWriting FAT.....\n"); sc = reservedArea; for(count = ZERO; count <(fatCount * fatSize);){ if( sc < sectorsPerTrack){ sc++; } else{ sc = ONE; if( ra > ZERO ) ra = ZERO; if( A == HEAD ) A = HEAD_ONE; else{ A = HEAD; BB = BB + 0x0100; } } B = BB + sc; printf("#"); flag=ZERO; flag = writeSector( ((unsigned char *)ptrFATA + (count * sectorSize)), A, B, SECTORS); if( flag != 0 ){ printf("Write error %.4x\n",flag); return; } printf("##"); count++; } printf("\n\nWriting DIR.....\n"); for(count = ZERO; count <(dirSectorCount);){ if( sc < sectorsPerTrack){ sc++; } else{ sc = ONE; if( ra > ZERO ) ra = ZERO; if( A == HEAD ) A = HEAD_ONE; else{ A = HEAD; BB = BB + 0x0100; } } B = BB + sc; printf("#"); flag=ZERO; flag = writeSector( ((unsigned char *)ptrDIR + (count * sectorSize)), A, B, SECTORS); if( flag != 0 ){ printf("Write error %.4x\n",flag); return; } printf("##"); count++; } */ if(argc == TWO) if(*argv[ONE] == 'w' || *argv[ONE] == 'W'){ fatCount-=ONE; reservedArea+=fatSize; *( (unsigned char *)ptrMBR + INDEX(5) ) = *((unsigned char *)&fatCount); *( (unsigned char *)ptrMBR + INDEX(3) ) = *((unsigned char *)&reservedArea); *( (unsigned char *)ptrMBR + INDEX(4) ) = *((unsigned char *)&reservedArea + ONE); ((unsigned char *)ptrMBR)[SYMBOLAINDEX] = SYMBOLA; ((unsigned char *)ptrMBR)[SYMBOLBINDEX] = SYMBOLB; flag = ZERO; flag = writeSector(ptrMBR, DRIVE_FD + HEAD, TRACK + SECTOR_ONE, SECTORS); if(flag != 0) printf("\n\nWrite error %.4x\n\n",flag); } printf("\n:-)"); }