Bueno, para que este Sábado no sea improductivo del todo ...
Vamos a interpretar el MBR ... por lo menos la entrada general y el BPB
El siguiente paso va a ser interpretar el xPBP o Información Extendida del FAT16
int32 start_lsec;
int32 partition_size;
int16 bytes_per_sector;
int8 sectors_per_cluster;
int16 sectors_reserved;
int16 root_entries;
int16 sectors_per_volumenL;
int16 sectors_per_fat;
int16 sectors_per_track;
int16 num_heads;
int32 sectors_invisibles;
int32 sectors_per_volumenH;
...
address = 0x00;
if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
// Read and Presentation
printf("\r\n\n>MMC read Master Partition Table\r\n\n");
printf("RAW in MPT 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
printf(" ===============================================\r\n");
for(i=0;i<4;i++){ // One for Partition Entry
f = 0x1BE + (i*0x10);
printf("P%u at %LX ",i+1,f);
for(j=0;j<0x10;j++){ // one for byte in Partition Entry
f = 0x1BE + (i*0x10) +j;
Partition_Entry[j]=MMCBuffer[f];
printf("%LX ",Partition_Entry[j]);
}
if(i==0) printf("*");
printf("\r\n");
}
// Reread the first partition
for(j=0;j<0x10;j++){ // one for byte in Partition Entry
f = 0x1BE+j;
Partition_Entry[j]=MMCBuffer[f];
}
// Interpretation
printf("\r\n");
// Type
printf("Partition Type %u\r\n",Partition_Entry[4]);
// start_lsec is address of the partion boot sector
start_lsec=make32(Partition_Entry[11],Partition_Entry[10],Partition_Entry[9],Partition_Entry[8]);
printf("Start Partition in sectors %Lu (Address of MBR 0x%LX)\r\n",start_lsec,start_lsec*(sector_size+1));
// partition_size
partition_size=make32(Partition_Entry[15],Partition_Entry[14],Partition_Entry[13],Partition_Entry[12]);
printf("Partition Size in sectors %Lu (Capacity in Bytes %Lu)\r\n",partition_size,partition_size*(sector_size+1));
// Continuing for MBR
printf("\r\nReading MBR in address %LX ...\r\n\n",start_lsec*(sector_size+1));
address = start_lsec*(sector_size+1);
if(mmc_read_block(address, sector_size,&MMCBuffer[0])==0){
// Jumping Code
printf("Jump Code .: ");
iOffset=0x00;
for(i=0;i<3;i++){
printf("0x%X ",MMCBuffer[iOffSet+i]);
}
printf("\r\n");
// OEM ID
printf("OEM ID ....: ");
iOffset=0x03;
for(i=0;i<8;i++){
printf("%c",MMCBuffer[iOffSet+i]);
}
printf("\r\n");
// BPB_Entry
printf("\r\nMMC read BIOS Parametrer Block\r\n\n");
printf("RAW in BPB 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
printf(" ===============================================\r\n");
printf(" ");
iOffset=0x0B;
for(i=0;i<25;i++){
BPB_Entry[ i ]=MMCBuffer[iOffSet+i];
printf("%X ",BPB_Entry[ i ]);
if(i==0x0F) printf("\r\n ");
}
printf("\r\n\n");
// bytes_per_sector
bytes_per_sector=make16(BPB_Entry[1],BPB_Entry[0]);
printf("Bytes per Sector ....: 0x%LX (%Lu)\r\n",bytes_per_sector,bytes_per_sector);
// sectors_per_cluster
sectors_per_cluster=(int8) BPB_Entry[2];
printf("Sectors per Cluster .: 0x%X (%u)\r\n",sectors_per_cluster,sectors_per_cluster);
// sectors_reserved
sectors_reserved=make16(BPB_Entry[4],BPB_Entry[3]);
printf("Sectors Reserved ....: 0x%LX (%Lu)\r\n",sectors_reserved,sectors_reserved);
// number copys of FAT
printf("Copys of FAT ........: 0x%X (%u)\r\n",BPB_Entry[05],BPB_Entry[05]);
// root_entries
root_entries=make16(BPB_Entry[7],BPB_Entry[6]);
printf("Root entries ........: 0x%LX (%Lu)\r\n",root_entries,root_entries);
// sectors_per_volumen LOW
sectors_per_volumenL=make16(BPB_Entry[9],BPB_Entry[8]);
printf("Volumen Sectors Low .: 0x%LX (%Lu)\r\n",sectors_per_volumenL,sectors_per_volumenL);
// Media Descriptor Byte
printf("Media Descriptor Byte: 0x%X (%u)\r\n",BPB_Entry[10],BPB_Entry[10]);
// sectors_per_fat
sectors_per_fat=make16(BPB_Entry[12],BPB_Entry[11]);
printf("FAT Sectors .........: 0x%LX (%Lu)\r\n",sectors_per_fat,sectors_per_fat);
// sectors_per_track
sectors_per_track=make16(BPB_Entry[14],BPB_Entry[13]);
printf("Track Sectors .......: 0x%LX (%Lu)\r\n",sectors_per_track,sectors_per_track);
// sectors_per_track
num_heads=make16(BPB_Entry[16],BPB_Entry[15]);
printf("Heads ...............: 0x%LX (%Lu)\r\n",num_heads,num_heads);
// sectors_invisibles
sectors_invisibles=make32(BPB_Entry[20],BPB_Entry[19],BPB_Entry[18],BPB_Entry[17]);
printf("Invisible Sectors ...: 0x%LX (%Lu)\r\n",sectors_invisibles,sectors_invisibles);
// sectors_per_volumen Hight
sectors_per_volumenH=make32(BPB_Entry[24],BPB_Entry[23],BPB_Entry[22],BPB_Entry[21]);
printf("Volumen Sectors Hight: 0x%LX (%Lu)\r\n",sectors_per_volumenH,sectors_per_volumenH);
// xBPB_Entry
}else{
printf("\n\r>Read MBR page fault");
}
}else{
printf("\n\r>Read MPT page fault");
}