First read MBR of card | | | Master Boot Record MMC card 512 Bytes per Sector Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ 000001C0 02 00 0B 07 E0 C0 61 00 00 00 9F C0 03 00 00 00 ....àÀa...ŸÀ.... 000001D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000001F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............Uª | Lookup Partition Entry 1 | | Partition Entry 1 in MBR 16 Bytes 000001BE 00 03 02 00 0B 07 E0 C0 61 00 00 00 9F C0 03 00 Byte 0 Boot Indicator: 0x00 Byte 1 Start Head: 0x03 Byte 2 Start Sector: 0x02 Byte 3 Start Cylinder: 0x00 Byte 4 Partitions Type: 0x0B || 0x0C <- Use Byte 5 End Head: 0x07 Byte 6 End Sector: 0xE0 Byte 7 End Cylinder: 0xC0 Byte 8-11 Partition LBA begin: 0x00000061 <- Use Byte 12-15 Sectors in Partition: 0x0003C09F <- Use for check | Store Sectors per Partition as check value, prevent reading behind partition end Store Partition_LBA_Begin Read Boot Record from Partition 1 | | Boot Record for partition one starts in sector 97 - 0x61 512 Bytes per Sector Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 0000C200 EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 02 24 00 ëXMSDOS5.0...$. 0000C210 02 00 00 00 00 F8 00 00 3F 00 FF 00 61 00 00 00 .....ø..?.ÿ.a... 0000C220 9F C0 03 00 BA 03 00 00 00 00 00 00 02 00 00 00 ŸÀ..º........... 0000C230 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000C240 00 00 29 72 05 EF 40 4E 4F 20 4E 41 4D 45 20 20 ..)r.ï@NO NAME 0000C250 20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4 FAT32 3ɎѼô 0000C260 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08 {ŽÁŽÙ½.|ˆN.ŠV@´. 0000C270 CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F Í.s.¹ÿÿŠñf.¶Æ@f. 0000C280 B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7 ¶Ñ€â?÷â†ÍÀí.Af.· 0000C290 C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E Éf÷áf‰Føƒ~..u8ƒ~ 0000C2A0 2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9 *.w2f‹F.fƒÀ.».€¹ 0000C2B0 01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC ..è+.éH. ú}´}‹ð¬ 0000C2C0 84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB „Àt.<ÿt.´.»..Í.ë 0000C2D0 EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19 î û}ëå ù}ëà˜Í.Í. 0000C2E0 66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06 f`f;Fø.‚J.fj.fP. 0000C2F0 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4 Sfh....€~...… .´ 0000C300 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55 A»ªUŠV@Í..‚..ûU 0000C310 AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4 ª.…..öÁ..„..þF.´ 0000C320 42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58 BŠV@‹ôÍ.°ùfXfXfX 0000C330 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE fXë*f3Òf.·N.f÷ñþ 0000C340 C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A ŠÊf‹ÐfÁê.÷v.†ÖŠ 0000C350 56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61 V@ŠèÀä..̸..Í.fa 0000C360 0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3 .‚TÿÃ..f@I.…qÿà 0000C370 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00 NTLDR ..... 0000C380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000C390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000C3A0 00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 44 61 ..............Da 0000C3B0 74 65 6E 74 72 84 67 65 72 20 65 6E 74 66 65 72 tentr„ger entfer 0000C3C0 6E 65 6E FF 0D 0A 4D 65 64 69 65 6E 66 65 68 6C nenÿ..Medienfehl 0000C3D0 65 72 FF 0D 0A 4E 65 75 73 74 61 72 74 3A 20 54 erÿ..Neustart: T 0000C3E0 61 73 74 65 20 64 72 81 63 6B 65 6E 0D 0A 00 00 aste drcken.... 0000C3F0 00 00 00 00 00 00 00 00 00 AC C4 D3 00 00 55 AA .........¬ÄÓ..Uª | Check the 3 critical fields: Sectors per FAT, RootDir First Cluster, Signature | | Field Microsoft's Name Offset Size Value -------------------------------------------------------------------------------------------------------------- Bytes Per Sector BPB_BytsPerSec 0x0B 16 Bits Always 512 Bytes Sectors Per Cluster BPB_SecPerClus 0x0D 8 Bits 1,2,4,8,16,32,64,128 Number of Reserved Sectors BPB_RsvdSecCnt 0x0E 16 Bits Usually 0x20 Number of FATs BPB_NumFATs 0x10 8 Bits Always 2 Sectors Per FAT BPB_FATSz32 0x24 32 Bits Depends on disk size Root Directory First Cluster BPB_RootClus 0x2C 32 Bits Usually 0x00000002 Signature (none) 0x1FE 16 Bits Always 0xAA55 | Compute mostly needed variables | | (unsigned long) fat_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors; (unsigned long) cluster_begin_lba = Partition_LBA_Begin + Number_of_Reserved_Sectors + (Number_of_FATs * Sectors_Per_FAT); (unsigned char) sectors_per_cluster = BPB_SecPerClus; (unsigned long) root_dir_first_cluster = BPB_RootClus; From actual card data: (unsigned long) Sectors_per_Partition = 0x0003C09F; (unsigned long) Partition_LBA_Begin = 0x00000061; (unsigned int) Bytes_Per_Sector = 0x0200; (unsigned char) Sectors_Per_Cluster = 0x02 (unsigned int) Number_of_Reserved_Sectors = 0x0024; (unsigned char) Number_of_FATs = 0x02; (unsigned long) Sectors_Per_FAT = 0x000003BA; (unsigned long) RootDir_First_Cluster = 0x0000002 Computed: (unsigned long) fat_begin_lba = 0x00000061 + 0x0024 = 0x00000085 (unsigned long) cluster_begin_lba = 0x00000061 + 0x0024 + (0x02 * 0x000003BA) = 0x000007F9 (unsigned char) sectors_per_cluster = 0x02; (unsigned long) root_dir_first_cluster = 0x0000002; | Compute LBA address (or Sector) for a specific cluster | | (unsigned long) lba_addr = cluster_begin_lba + (cluster_number - 2) * sectors_per_cluster; or for actual data (unsigned long) lba_addr = 0x000007F9 + (cluster_number - 2) * 0x02; | Compute LBA address where the RootDir starts | | (unsigned long) lba_addr = cluster_begin_lba + (RootDir_First_Cluster - 2) * sectors_per_cluster; or for actual data (unsigned long) lba_addr = 0x000007F9 + (2 - 2) * 0x02 = 0x000007F9 | | | Actual RootDir Data 512 Bytes per Sector Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000FF200 4D 4D 43 31 20 20 20 20 20 20 20 08 00 00 00 00 MMC1 ..... 000FF210 00 00 00 00 00 00 0F 68 27 34 00 00 00 00 00 00 .......h'4...... 000FF220 E5 78 00 74 00 00 00 FF FF FF FF 0F 00 DB FF FF åx.t...ÿÿÿÿ..Ûÿÿ 000FF230 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF ÿÿÿÿÿÿÿÿÿÿ..ÿÿÿÿ 000FF240 E5 48 00 65 00 6C 00 6C 00 6F 00 0F 00 DB 5F 00 åH.e.l.l.o...Û_. 000FF250 57 00 6F 00 72 00 6C 00 64 00 00 00 2E 00 74 00 W.o.r.l.d.....t. 000FF260 E5 45 4C 4C 4F 5F 7E 31 54 58 54 20 00 4B F3 78 åELLO_~1TXT .Kóx 000FF270 27 34 27 34 00 00 F4 78 27 34 00 00 00 00 00 00 '4'4..ôx'4...... 000FF280 42 78 00 74 00 00 00 FF FF FF FF 0F 00 DB FF FF Bx.t...ÿÿÿÿ..Ûÿÿ 000FF290 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF ÿÿÿÿÿÿÿÿÿÿ..ÿÿÿÿ 000FF2A0 01 48 00 65 00 6C 00 6C 00 6F 00 0F 00 DB 5F 00 .H.e.l.l.o...Û_. 000FF2B0 57 00 6F 00 72 00 6C 00 64 00 00 00 2E 00 74 00 W.o.r.l.d.....t. 000FF2C0 48 45 4C 4C 4F 5F 7E 31 54 58 54 20 00 4B F3 78 HELLO_~1TXT .Kóx 000FF2D0 27 34 27 34 00 00 F4 78 27 34 03 00 0C 00 00 00 '4'4..ôx'4...... 000FF2E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF2F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF310 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF330 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF350 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF370 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF390 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF3A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF3B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF3C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF3D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF3E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 000FF3F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ | Each Dir entry is 32byte width, this means 16 records per sector | | First Entry is Volume ID Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000FF200 4D 4D 43 31 20 20 20 20 20 20 20 08 00 00 00 00 MMC1 ..... 000FF210 00 00 00 00 00 00 0F 68 27 34 00 00 00 00 00 00 .......h'4...... | | Short Name entry for file Hello_World.txt Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000FF2C0 48 45 4C 4C 4F 5F 7E 31 54 58 54 20 00 4B F3 78 HELLO_~1TXT .Kóx 000FF2D0 27 34 27 34 00 00 F4 78 27 34 03 00 0C 00 00 00 '4'4..ôx'4...... FF2D4 = High Word of Cluster Number, 2bytes = 0x0000 FF2DA = Low Word of Cluster Number, 2 Bytes = 0x0003 FF2DC = File Size in Bytes, 4 Bytes = 0x0000000C Long Name entry for file Hello_World.txt Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000FF280 42 78 00 74 00 00 00 FF FF FF FF 0F 00 DB FF FF Bx.t...ÿÿÿÿ..Ûÿÿ 000FF290 FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF ÿÿÿÿÿÿÿÿÿÿ..ÿÿÿÿ 000FF2A0 01 48 00 65 00 6C 00 6C 00 6F 00 0F 00 DB 5F 00 .H.e.l.l.o...Û_. 000FF2B0 57 00 6F 00 72 00 6C 00 64 00 00 00 2E 00 74 00 W.o.r.l.d.....t. | | | Compute LBA address where the first cluster starts | | (unsigned long) lba_addr = cluster_begin_lba + (File_First_Cluster - 2) * sectors_per_cluster; or for actual data (unsigned long) lba_addr = 0x000007F9 + (0x00000003 - 2) * 0x02 = 0x000007FB | File Hello_Wolrd.txt starts at LBA address (Sector) 0x000007FB | | Short Name entry for file bootload.bin Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F 000FF2E0 42 4F 4F 54 4C 4F 41 44 42 49 4E 20 18 49 0E 84 BOOTLOADBIN .I.„ 000FF2F0 27 34 27 34 00 00 F9 61 27 34 04 00 50 19 00 00 '4'4..ùa'4..P... FF2F4 = High Word of Cluster Number, 2bytes = 0x0000 FF2FA = Low Word of Cluster Number, 2 Bytes = 0x0004 FF2FC = File Size in Bytes, 4 Bytes = 0x00001950 | | Compute LBA address where the first cluster starts | (unsigned long) lba_addr = cluster_begin_lba + (File_First_Cluster - 2) * sectors_per_cluster; or for actual data (unsigned long) lba_addr = 0x000007F9 + (0x00000004 - 2) * 0x02 = 0x000007FD | File bootload.bin starts at LBA address (Sector) 0x000007FD | |