[© 2004 ZWAGA.COM,  vrij te gebruiken, mits deze bron wordt vermeld. De door ons gebruikte bronnen dienen ook vermeld te worden]
 

[ terug]

FAT

 

FAT staat voor File Allocation Table, en daarmee wordt zowel het filesysteem aangegeven, alsook de fysieke tabel waarin wordt bijgehouden welke files en folders op het volume (partitie) staan en waar.

FAT is het filesysteem dat eerst voor MS-DOS werd gebruikt (afgeleid van CP/M). Oorspronkelijk was dat FAT12, waarmee werd aangegeven dat 12 bits gebruikt werden voor het nummeren van de beschikbare clusters. Dat levert evenwel maar 212 clusters (= 4096) op. Er van uitgaand dat elke cluster 1 sector (512 bytes) groot is, levert dat een maximale omvang van 2.097.152 bytes (= 2 MB) per volume op. Meer sectoren per cluster gebruiken vergroot het adresseerbare deel van de disk. Voor harddisk is men evenwel overgegaan op FAT16, met 16 bits voor een clusternummer. FAT12 wordt alleen nog gebruikt voor ouderwetse 5,25" floppies. Zelf de 3,5" floppies worden met FAT16 geformatteerd.

 

FAT16 heeft evenwel ook forse beperkingen, dus introduceerde Microsoft FAT32 bij Windows 95 OSR2 (ook wel Windows 95B genoemd). Hiermee werd het eenvoudiger de vergrote capaciteiten van harddisks te benutten.

 

Verschillen

FAT(16)

FAT32

Omvang clusternummer in FAT

16 bits worden gebruikt om een clusternummer aan te geven

32 bits (1e 4 bits zijn gereserveerd) Praktisch worden dus 28 bits gebruikt om een clusternummer aan te geven.

Aantal clusters

216

232-4 = 228

Max. bruikbare clusters

65.524 (door de reservering van sommige clusters)

228 – 18 clusters. Minimaal 65527 clusters, maar max. 4.177.918 voor de meeste Windows versies.

Aantal FAT tabel ingangen (entries) voor de root-folder

512

Geen bijzondere restricties. De root is een normale entry. Aantal bestanden in de root kan 65.534 zijn.

clustergroottes

Volumeomvang tot

clustergrootte

4.193.536 KB = 4 GB

64 KB

2.096.768 KB = 2 GB

32 KB

1.048.384 KB = 1 GB

16 KB

524.192 KB = 512 MB

8 KB

262.096 KB = 256 MB

4 KB

131.048 KB = 128 MB

2 KB

65.524 KB = 64 MB

1 KB

32.762KB = 32MB

512 bytes

Volumeomvang tot

clustergrootte

8,4 TB (praktisch 2 TB)

32 KB (= max)

4,2 TB (praktisch 2 TB)

16 KB

2 TB

8 KB

1 TB

4 KB

511,9 GB

2 KB

255,9 GB

1 KB

127,9 GB

512 bytes

Backup van boot sector

Nee

Ja

Ondersteund door

Alle standalone en netwerk OS-en van Microsoft, sommige Linux en Unix versies

MS-DOS, Windows 95 (tot OSR2) en alle NT-versies tot NT 4.0 kunnen geen FAT32 volume lezen.

Opmerkingen

Alleen efficiënt met volumes kleiner dan 256 MB.

Lange bestandsnamen gebruiken in de rootfolder reduceert het aantal mogelijke entries voor de root folder.

Verspilt veel ruimte bij de opslag van veel kleine bestanden op een “groot” volume. Een file van 2KB opslaan op een volume met 32 KB clusters, benut maar 2 KB van het cluster. De rest (30 KB)is onbruikbaar.

Windows 2000 en hoger kan een volume van maximaal 32 GB met FAT32 maken en lezen. Windows 98 maximaal 127,5 GB.

FAT32 gaat veel efficiënter om met de beschikbare ruimte door het gebruik van fors kleinere clusters.

 

Compressie

Nee (alleen met additionele tools)

Nee (alleen met additionele tools)

Bestandsbeveiliging

Nee

Nee

Indeling van het begin van het volume

Boot Sector

FAT 1 (de omvang is afhankelijk van de volumegrootte)

FAT 2 (kopie)

Root folder (voor 512 entries)

Andere folders en alle files

Boot sector

Root folder (voor 65.535 entries)

FAT 1

FAT 2 (kopie)

Andere folders en alle files

Max. file grootte

4 GB – 1 byte

4 GB – 2 bytes

# files / volume

65.524

4.177.920

 

FAT16 en FAT32 gebruiken een tabel voor het bijhouden van de clusters. Op een FAT partitie zijn twee van deze FAT’s (File Allocation Tables) aanwezig. Een daarvan is de reserve kopie.

 

Het begin van elk FAT-volume is steeds op de zelfde manier ingedeeld. Alleen de afmetingen zijn sterk afhankelijk van de afmetingen van het volume, en dus van de gebruikte clustergrootte.

 

FAT16

 

De boot sector van een FAT16 volume bevindt zich op sector 0 van een volume en bestaat uit de volgende onderdelen:

Een CPU jump instructie (BS_jmpBoot) 3 bytes Het MBR geeft de uitvoering door de CPU aan de bootsector van de partitie door. Deze 3 eerste bytes moeten daarom een CPU-instructie bevatten. Met deze instructie wordt de besturing doorgegeven aan code elders in de boot sector. Deze instructie is nog OS-onafhankelijk. De instructie daarna zijn afhankelijk van welk OS het volume heeft geformatteerd.

De OEM identificatie

(BS_OEMName)

8 bytes Hiermee wordt de naam en het versienummer van het OS aangegeven welke gebruikt werd voor het formatteren. (B.v. MSDOS5.0)
Het BIOS Parameter Block (BPB) 25 bytes Hierin staat informatie over de indeling van de disk, en waar het laadprogramma voor de disk is opgeslagen,
 

veld

#bytes  

Bytes/sector

(BPB_BytsPerSec)

2 Is meestal 512. Maar 1024, 2046, of 1096 zijn ook geldige waarden

Sectors/cluster

(BPB_SecPerClus)

1 Op een FAT16 volume kunnen maar 65.524 clusters worden benut. Grote volumes worden daarom ondersteund door het aantal sectoren per cluster te verhogen. Geldige waarden zijn 1, 2, 4, 8, 16, 32, 64 en 128.

gereserveerde sectors

(BPB_RsvdSecCnt)

2 Het aantal sectoren vóórdat de eerste FAT volgt. Dat is meestal 1 (de bootsector).

Aantal FAT's

(BPB_NumFATs)

1 Het aantal kopieën van de FAT op dat volume. Meestal 2.

Root Entries

(BPB_RootEntCnt)

2 Het aantal ingangen van de FAT voor de Root van dat volume. Elke ingang is 32 bytes voor een file of een folder. Voor de root is dit standaard 512. Één ingang wordt gebruikt voor het volume label.

Small Sectors

(BPB_TotSec16)

2 Het aantal sectoren als dat minder is dan 65.536 (16 bits). Is het aantal groter dan is deze waarde 0 en wordt "Large sectors" gebruikt.

Media Descriptor

(BPB_Media)

1

Geeft het soort medium aan:

0xF8 = harddisk

0xF0 = 3,5 inch high density floppy

(Wordt door XP niet meer gebruikt)

Sectors/FAT

(BPB_FATSz16)

2 Geeft de omvang van de FAT aan. Deze waarde wordt onder andere gebruikt om te bepalen waar de root-directory en de data op het volume beginnen.

Sectors/Track

(BPB_SecPerTrk)

2 Onderdeel van de geometrie van de disk. Wordt verkregen bij een low-level format.

Aantal heads

(BPB_NumHeads)

2 Onderdeel van de geometrie van de disk. Wordt verkregen bij een low-level format.

Verborgen sectors

(BPB_HiddSec)

4 Het aantal sectoren vóór de boot sector. Deze waarde wordt onder andere gebruikt om te bepalen waar de root-directory en de data op het volume beginnen.

Large sectors

(BPB_TotSec32)

4 Als "small sectors" 0 is, dan bevat dit veld het aantal sectoren (32bits). Als "Small sectors" niet 0 is dan is dit veld 0.
Het uitgebreide BPB 26 bytes Aanvullende informatie over de disk en het volume
 

veld

#bytes  

Fysieke drive nummer

(BS_drvNum)

1 Deze waarde is gerelateerd aan de BIOS waarde voor het volgnummer van de fysieke disk. Floppies krijgen de waarde 0x00, en de fysieke harddisks worden geïdentificeerd met 0x80. Deze waarde wordt ingesteld vóórdat een INT 13 BIOS aanroep specificeert welk apparaat moet worden benaderd. Deze waarde is alleen relevant als van dit volume geboot wordt.

Gereserveerd

(BS_Reserved1)

1 Altijd 0

Extended Boot Signature

(BS_BootSig)

1 Moet voor XP altijd de waarde 0x28 of 0x29 hebben

Volume Serie Nummer

(BS_VolID)

4 Een willekeurig serienummer welke tijdens het formatteren wordt gecreëerd om het volume te kunnen identificeren.

Volume label

(BS_VolLab)

11 Werd ooit gebruikt voor het label van het volume. Het label is nu een speciale ingang in de FAT.

Filesystem type

(BS_FilSysType)

8 Wordt niet gebruikt door Windows. Bevat "FAT12   ", "FAT16   " of "FAT     ".
Bootstrap Code 448 bytes

Bevat de programma code waarin staat hoe het besturingssysteem moet worden gestart.

Bij MSDOS wordt de uitvoering doorgegeven aan IO.SYS en bij de netwerkversies aan NTLDR.

Einde sector markering 2 bytes Bevat 55AA. De End Of Cluster (EOC) markering

 

Voorbeeld van een FAT16 bootsector:

OFFSET     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  *0123456789ABCDEF*
00000000: EB 3C 90 4D 53 44 4F 53 35 2E 30 00 02 40 01 00   .<.MSDOS5.0..@..
00000010: 02 00 02 00 00 F8 FC 00 3F 00 40 00 3F 00 00 00   ........?.@.?...
00000020: 01 F0 3E 00 80 00 29 A8 8B 36 52 4E 4F 20 4E 41   ..>...)..6RNO NA
00000030: 4D 45 20 20 20 20 46 41 54 31 36 20 20 20 33 C0   ME    FAT16   3.
00000040: 8E D0 BC 00 7C 68 C0 07 1F A0 10 00 F7 26 16 00   ....|h......&..
00000050: 03 06 0E 00 50 91 B8 20 00 F7 26 11 00 8B 1E 0B   ....P.. ..&.....
00000060: 00 03 C3 48 F7 F3 03 C8 89 0E 08 02 68 00 10 07   ...H........h...
00000070: 33 DB 8F 06 13 02 89 1E 15 02 0E E8 90 00 72 57   3.............rW
00000080: 33 DB 8B 0E 11 00 8B FB 51 B9 0B 00 BE DC 01 F3   3.......Q.......
00000090: A6 59 74 05 83 C3 20 E2 ED E3 37 26 8B 57 1A 52   .Yt... ...7&.W.R
000000A0: B8 01 00 68 00 20 07 33 DB 0E E8 48 00 72 28 5B   ...h. .3...H.r([
000000B0: 8D 36 0B 00 8D 3E 0B 02 1E 8F 45 02 C7 05 F5 00   .6...>....E.....
000000C0: 1E 8F 45 06 C7 45 04 0E 01 8A 16 24 00 EA 03 00   ..E..E.....$....
000000D0: 00 20 BE 86 01 EB 03 BE A2 01 E8 09 00 BE C1 01   . ..............
000000E0: E8 03 00 FB EB FE AC 0A C0 74 09 B4 0E BB 07 00   .........t......
000000F0: CD 10 EB F2 C3 50 4A 4A A0 0D 00 32 E4 F7 E2 03   .....PJJ...2....
00000100: 06 08 02 83 D2 00 A3 13 02 89 16 15 02 58 A2 07   .............X..
00000110: 02 A1 13 02 8B 16 15 02 03 06 1C 00 13 16 1E 00   ................
00000120: F7 36 18 00 FE C2 88 16 06 02 33 D2 F7 36 1A 00   .6........3..6..
00000130: 88 16 25 00 A3 04 02 A1 18 00 2A 06 06 02 40 3A   ..%.......*...@:
00000140: 06 07 02 76 05 A0 07 02 32 E4 50 B4 02 8B 0E 04   ...v....2.P.....
00000150: 02 C0 E5 06 0A 2E 06 02 86 E9 8B 16 24 00 CD 13   ............$...
00000160: 0F 83 05 00 83 C4 02 F9 CB 58 28 06 07 02 76 11   .........X(...v.
00000170: 01 06 13 02 83 16 15 02 00 F7 26 0B 00 03 D8 EB   ..........&.....
00000180: 90 A2 07 02 F8 CB 42 4F 4F 54 3A 20 43 6F 75 6C   ......BOOT: Coul
00000190: 64 6E 27 74 20 66 69 6E 64 20 4E 54 4C 44 52 0D   dn't find NTLDR.
000001A0: 0A 00 42 4F 4F 54 3A 20 49 2F 4F 20 65 72 72 6F   ..BOOT: I/O erro
000001B0: 72 20 72 65 61 64 69 6E 67 20 64 69 73 6B 0D 0A   r reading disk..
000001C0: 00 50 6C 65 61 73 65 20 69 6E 73 65 72 74 20 61   .Please insert a
000001D0: 6E 6F 74 68 65 72 20 64 69 73 6B 00 4E 54 4C 44   nother disk.NTLD
000001E0: 52 20 20 20 20 20 20 00 00 00 00 00 00 00 00 00   R      .........
000001F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA   ..............U.

 

Na de bootsector komen 2 exemplaren van de FAT. Het aantal sectoren wat voor een FAT wordt gebruikt is afhankelijk van de omvang van het volume.

 

De File Allocation Table op het FAT16 volume

De FAT bestaat uit een tabel van 65.536 entries van 16 bits. Elke entry wijst naar een cluster, waarvan de status is weergegeven.

Elke cluster wordt in de FAT geïdentificeerd als:

Status FAT code
Beschikbaar 0000
In gebruik door een file. Geeft de volgende cluster aan. 0002-FFEF
Gereserveerde cluster FFF0-FFF6
Slechte cluster FFF7
Laatste cluster in een file FFF8-FFFF

 

Als een file gelezen moet worden uit bijvoorbeeld de root-folder, dan wordt eerst in de root folder opgezocht op welke start-cluster de file begint.

Deze startcluster wordt opgezocht in de FAT. Wordt als status FFFF opgegeven, dan staat de hele file op die ene cluster. Wordt een waarde opgegeven tussen 0002-FFEF, dan geeft dit de volgende cluster aan voor de file. Dit clusternummer wordt weer opgezocht in de FAT, met hetzelfde resultaat. Net zolang tot FFFF als status wordt gegeven. Alle clusters, welke dan door de file in beslag genomen worden zijn dan bekend en de hele file kan gelezen worden.

De FAT is een singly linked list van pointers naar sectoren:

FAT1

Clusternr Status

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Uitleg
0002 0000 beschikbaar
0003 0000 beschikbaar
0004 0006 volgende cluster is 0006 (file1)
0005 FFFF einde van een file (file2)
0006 0009 volgende cluster is 0009 (file1)
0007 0008 volgende cluster is 0008 (file3)
0008 FFFF einde van een file (file3)
0009 FFFF einde van een file (file1)
000A FFF7 bad cluster
000B 0000 beschikbaar
000C 0000 beschikbaar
..   beschikbaar
FFEF 0000 beschikbaar

 

Er zijn hier drie files aangegeven:

 

File1 is gefragmenteerd en beslaat 3 cluster.

File2 beslaat maar één cluster.

File3 is aaneengesloten en beslaat 3 clusters.

 

Cluster 10 is gemarkeerd als slechte cluster.

 

Wordt een nieuwe file opgeslagen dan zullen achtereenvolgens cluster 0002, 0003, 0011 en dan 0012 gebruikt worden. De eerste vrije cluster worden altijd eerst benut. Hierdoor kunnen dus gefragmenteerde bestanden ontstaan.

 

 

 

Een Hex-dump ziet er dan als volgt uit. Vanwege the little endian notatie op Intel-PC's moet elke Word (2-bytes) en double-word (DWord; 4-bytes) in omgekeerde volgorde worden weergegeven. 0006 staat dus op de disk als 06 00. De eerste 4 bytes zijn gereserveerd, waarbij het eerste byte de media descriptor F8 is. Verder is deze dump een byte-weergave, dus de bytenummering niet verwarren met de clusternummers.

OFFSET 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0000: F8 FF FF FF 00 00 00 00 06 00 FF FF 09 00 08 00
0010: FF FF FF FF F7 FF 00 00 00 00 00 00 00 00 00 00

 

De Root folder

Elke file of subfolder in de root heeft een ingang in dit deel van de startsectoren van een volume. Elke ingang is 32 bytes groot. De root-folder op een FAT16 volume kan maar 512 ingangen bevatten. De grootte ligt dan ook vast: 512 x 32 bytes = 16.384 bytes = 16 KB

veldnaam

# Bytes

Voor

DIR_Name

11

8.3 DOS-naam van een file of folder

Alle tekens behalve . “ / \ [ ] : ; | = , * ? <spatie>

Namen in gebruik door het OS voor devices mogen niet:

CON, AUX, COMx (x=cijfer), LPTx (x=cijfer), PRN, NUL 

Als DIR_Name[0] = 0xE5 dan is deze tabelingang leeg.

Als DIR_Name[0] = 0x00 dan dito, maar worden alle volgende ingangen ook als leeg beschouwd.

(DIR_Name[0] is eerste teken in het veld.)

DIR_Attr

1

Attribuut. Dit specificeert met 6 flaggen:

bitnummer

naam

Wijzigbaar door

0

= Volume_ID

OS

1

= Directory

OS

2

Hidden

gebruiker

3

System

gebruiker

4

Read_only

gebruiker

5

Archive

gebruiker

6

Niet gebruikt

 

7

Niet gebruikt

 

DIR_NTRes 1 gereserveerd voor gebruik door NT. Niet in gebruik
DIR_CrtTimeTenth

1

Creatie tijd in miliseconden (0-199) behorende bij het volgende veld

DIR_CrtTime 2

Creatie tijd (Time stamp op 2 seconden nauwkeurig)

bit 0-4 seconden (0-29 intervallen van 2 seconden)

bit 5-10 minuten (0-59)

bit 11-15 uren (0-23)

Hiermee kan een tijd gespecificeerd worden van 00:00:00 (middernacht) t/m 23:59:58

DIR_CrtDate

2

Creatie datum (date stamp relatief t.o.v. 01-01-1980)

bit 0-4 dag (1-31)

bit 5-8 maand (1-12)

bit 9-15 aantal jaar na 1980 (0-127) Daarmee kan dus gedateerd worden tot 2107

DIR_LstAccDate

2

Datum waarop voor het laatst benaderd

DIR_FstClussHI 2 High word (linker 16 bits) voor eerste clusternummer. Is altijd 0 voor FAT16
DIR_WrtTime

2

Tijd waarop voor het laatst gewijzigd

DIR_WrtDate

2

Datum waarop voor het laatst gewijzigd

DIR_FstClusLO

2

Start cluster. Dit is een pointer naar de cluster waar de file start.

DIR_FileSize

4

Afmeting van de file

Het gebruik van lange bestandsnamen kan het aantal mogelijke bestanden en subfolders in de root nog verder beperken. Zie Lange bestandsnamen op FAT-volumes.

Root folder op een FAT-16 volume met 4 file-entries:

OFFSET 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0000: 4E 45 57 20 56 4F 4C 55 4D 45 20 08 00 00 00 00 NEW VOLUME .....

0010: 00 00 00 00 00 00 45 A4 CE 26 00 00 00 00 00 00 ......E..&......

0020: 4F 4E 45 20 20 20 20 20 54 58 54 10 08 79 BD A4 ONE     TXT..y..

0030: CE 26 CE 26 00 00 C0 A4 CE 26 02 00 00 00 00 00 .&.&.....&......

0040: 54 57 4F 20 20 20 20 20 54 58 54 10 08 BB C0 A4 TWO     TXT.....

0050: CE 26 CE 26 00 00 C1 A4 CE 26 08 00 00 00 00 00 .&.&.....&......

0060: E5 48 52 45 45 20 20 20 54 58 54 10 08 A2 C1 A4 .HREE   TXT.....

0070: CE 26 CE 26 00 00 C2 A4 CE 26 12 00 00 00 00 00 .&.&.....&......

De eerste ingang is de volume-naam omdat dit de root-folder is.

De tweede en derde zijn files met de namen ONE.TXT en TWO.TXT.

De vierde is een gewiste ingang, oorspronkelijk met de naam THREE.TXT. Als een file wordt gewist, dan wordt alleen het eerste teken in de naam vervangen door 0xE5, dat is decimaal 229. Waarmee wordt aangegeven dat de folderingang leeg is.

In rood zijn de startclusters van de files aangegeven.

 

De data op het FAT16 volume

De data op een volume bestaat uit de inhoud van files, of de inhoud van subfolders.

Een subfolder krijgt dezelfde structuur als de root-folder, alleen de grootte mag meer zijn, omdat het als een normale file op de data-ruimte staat. De beperking van de root geldt dus niet voor subfolders.

De werking is evenwel hetzelfde. Moet een file worden geopend uit een subfolder, dan wordt in de structuur van de subfolder de filenaam opgezocht en wordt het start-clusternummer gelezen en opgezocht in de FAT. De status wordt gelezen en of het is FFFF, waardoor het eind van de file is gevonden, of de volgende cluster wordt opgezocht.

Elke subfolderstructuur heeft minstens 2 ingangen. Één is voor de folder zelf, en één is voor de bovenliggende parent-folder. Deze worden met het dir-commando getoond met respectievelijk één en twee puntjes. (De DOT en DOTDOT entries).

.    <DIR>  deze folder 

..   <DIR>  parent folder

De bovenliggende parent folder wordt in de folderstructuur opgenomen om snel de start-cluster van de parent-folder te kunnen vinden.

 

Waar de data op een FAT-volume begint ( de eerste sector van cluster 2) wordt bepaald door de waarden in de BPB, en kan berekend worden met de volgende formules:

 

Eerste datasector = Gereserveerde sectors  +  (sectors/FAT x aantal FATs) + sectors voor Rootfolder

 

sectors voor rootfolder =   root entries x 32  + (bytes/sector - 1)   

                                                    bytes/sector

[ Volgens een white paper van Microsoft komt hier 0 uit voor een FAT32 volume. Dit zal wel fout zijn want bovenstaande formule komt op 1 uit als root entries gelijk is aan 0 ]

 

 

FAT32

 

De boot sector van een FAT32 volume is 3 sectors groot en start op sector 0 van een volume.

Deze bestaat uit de volgende onderdelen:

Een CPU jump instructie 3 bytes Het MBR geeft de uitvoering door de CPU aan de bootsector van de partitie door. Deze 3 eerste bytes moeten daarom een CPU-instructie bevatten. Met deze instructie wordt de besturing doorgegeven aan code elders in de boot sector. Deze instructie is nog OS-onafhankelijk. De instructie daarna zijn afhankelijk van welk OS het volume heeft geformatteerd.
De OEM identificatie 8 bytes Hiermee wordt de naam en het versienummer van het OS aangegeven welke gebruikt werd voor het formatteren. (B.v. MSDOS5.0)
Het BIOS Parameter Block (BPB) 53 bytes Hierin staat informatie over de indeling van de disk, en waar het laadprogramma voor de disk is opgeslagen,
 

veld

#bytes Uitleg

Bytes/sector

(BPB_BytsPerSec)

2 Is meestal 512. Maar 1024, 2046, of 1096 zijn ook geldige waarden

Sectors/cluster

(BPB_SecPerClus)

1 Op een FAT16 volume kunnen maar 65.524 clusters worden benut. Grote volumes worden daarom ondersteund door het aantal sectoren per cluster te verhogen. Geldige waarden zijn 1, 2, 4, 8, 16, 32, 64 en 128.

gereserveerde sectors

(BPB_RsvdSecCnt)

2 Het aantal sectoren vóórdat de Root folder volgt. Dat is meestal 32.

Aantal FAT's

(BPB_NumFATs)

1 Het aantal kopieën van de FAT op dat volume. Altijd 2.

Root Entries

(BPB_RootEntCnt)

2 Moet 0 zijn voor FAT32

Small Sectors

(BPB_TotSec16)

2 Moet 0 zijn voor FAT32

Media Descriptor

(BPB_Media)

1

Geeft het soort medium aan:

0xF8 = harddisk

0xF0 = 3,5 inch high density floppy

(Wordt door XP niet meer gebruikt)

Sectors/FAT

(BPB_FATSz16)

2 Moet 0 zijn voor FAT32

Sectors/Track

(BPB_SecPerTrk)

2 Onderdeel van de geometrie van de disk. Wordt verkregen bij een low-level format.

Aantal heads

(BPB_NumHeads)

2 Onderdeel van de geometrie van de disk. Wordt verkregen bij een low-level format. (Voor een floppy is dit altijd 2.)

Verborgen sectors

(BPB_HiddSec)

4 Het aantal sectoren vóór de boot sector. Deze waarde wordt onder andere gebruikt om te bepalen waar de root-directory en de data op het volume beginnen.

Large sectors

(BPB_TotSec32)

4 bevat het aantal sectoren voor een FAT32 volume (32bits).
tot hier gelijk aan FAT16

Sectors/FAT

(BPB_FATSz32)

4 Geeft de omvang van een FAT weer. Deze waarde wordt onder andere gebruikt om te bepalen waar de root-directory en de data op het volume beginnen.

ExtFlags

(BPB_ExtFlags)

2

Eén bit wordt gebruikt om de kopie van de FAT uit te schakelen voor een betere performance en om eventueel de tweede FAT de actieve primaire FAT te maken.

De FAT-mirror kan worden uitgeschakeld door bit 0x0080 (= bit 7) op 1 te zetten. Bits 0 t/m 3 worden gebruikt als bit 7 is gezet om de primaire FAT te specificeren

File System versie

(BPB_FSVer)

2 Het hoge byte geeft het versie nummer voor grote wijzigingen. Het lage byte geeft het versienummer voor kleine wijzigingen. Tot en met Windows XP staan hier 0-en in. Is voor toekomstige wijzigingen.

Root Cluster Nr

(BPBRootClus)

4 Geeft de cluster aan voor de root-folder.

FS Informatie sector nummer

(BPB_FSInfo)

2 Geeft de sector aan waar de Filesystem Information structuur te vinden is. Wordt BIGFATBOOTFSINFO genoemd. Volgt direct na de bootsector.

Backup Boot sector

(BPB_BkBootSec)

2 Dit geeft aan waar een kopie van de boot sectors te vinden is. Vrijwel altijd is dit 6. Een volledige kopie van en bootsector staat dus altijd op sector 6 en dat is inclusief de FSINFO sector.

Gereserveerd

(BPB_Reserved)

12 Gereserveerd voor uitbreidingen. Moet nu nog allemaal 0-en bevatten.
Het uitgebreide BPB 26 bytes Aanvullende informatie over de disk en het volume
 

veld

#bytes  

Fysieke drive nummer

(BS_DrvNum)

 

1 Deze waarde is gerelateerd aan de BIOS waarde voor het volgnummer van de fysieke disk. Floppies krijgen de waarde 0x00, en de fysieke harddisks worden geïdentificeerd met 0x80. Deze waarde wordt ingesteld vóórdat een INT 13 BIOS aanroep specificeert welk apparaat moet worden benaderd. Deze waarde is alleen relevant als van dit volume geboot wordt.

Gereserveerd

(BS_Reserved1)

1 Altijd 0

Extended Boot Signature

(BS_BootSig)

1 Moet voor XP altijd de waarde 0x28 of 0x29 hebben

Volume Serie Nummer

(BS_VolID)

4 Een willekeurig serienummer welke tijdens het formatteren wordt gecreëerd om het volume te kunnen identificeren.

Volume label

(BS_VolLab)

11 Werd ooit gebruikt voor het label van het volume. Het label is nu een speciale ingang in de FAT.

System ID

(BS_FilSysType)

8 Bevat de tekstwaarde "FAT32   "
Bootstrap Code 420 bytes

Bevat de programma code waarin staat hoe het besturingssysteem moet worden gestart.

Bij MSDOS wordt de uitvoering doorgegeven aan IO.SYS en bij de netwerkversies aan NTLDR.

Einde sector markering 2 bytes Bevat 55AA. Als bytes/sector echter groter is dan 512, dan is de bootsector dus ook groter. Deze twee bytes moeten echter op sector 1 op byte-posities 510 en 511 staan, ongeacht de grootte van de sector.

 

Voorbeeld van een FAT32 bootsector:

OFFSET     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  *0123456789ABCDEF*
00000000: EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 10 24 00   .X.MSDOS5.0...$.
00000010: 02 00 00 00 00 F8 00 00 3F 00 FF 00 3F 00 00 00   ........?...?...
00000020: 1D 91 11 01 2A 22 00 00 00 00 00 00 02 00 00 00   ....*
"..........
00000030: 01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
00000040: 80 00 29 F1 9E 5E 5E 4E 4F 20 4E 41 4D 45 20 20   ..)..^^NO NAME
00000050: 20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4     FAT32   3.....
00000060: 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08   {......|.N..V@..
00000070: CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F   ..s......f...@f.
00000080: B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7   ....?.......Af..
00000090: C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E   .f..f.F..~..u8.~
000000A0: 2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9   *.w2f.F.f.......
000000B0: 01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC   ...+..H...}.}...
000000C0: 84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB   ..t.<.t.........
000000D0: EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19   ...}....}.......
000000E0: 66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06   f`f;F...J.fj.fP.
000000F0: 53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4   Sfh.....~.... ..
00000100: 41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55   A..U.V@........U
00000110: AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4   .............F..
00000120: 42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58   B.V@......fXfXfX
00000130: 66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE   fX.*f3.f..N.f...
00000140: C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A   ...f..f....v....
00000150: 56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61   V@............fa
00000160: 0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3   ..T.....f@I..q..
00000170: 4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00   NTLDR      .....
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 0D 0A 43 61   ..............Ca
000001B0: 6E 6E 6F 74 20 73 74 61 72 74 2E 20 20 52 65 6D   nnot start.  Rem
000001C0: 6F 76 65 20 6D 65 64 69 61 2E FF 0D 0A 44 69 73   ove media....Dis
000001D0: 6B 20 65 72 72 6F 72 FF 0D 0A 50 72 65 73 73 20   k error...Press
000001E0: 61 6E 79 20 6B 65 79 20 74 6F 20 72 65 73 74 61   any key to resta
000001F0: 72 74 0D 0A 00 00 00 00 00 AC CB D8 00 00 55 AA   rt............U.

 

BIGFATBOOTFSINFO.

Dit is een structuur met informatie over o.a het aantal vrije clusters en de laatst toegewezen cluster. Hierdoor wordt voorkomen dat het OS de hele FAT daarvoor moet lezen. Waar deze sector zich bevindt staat in de BPB van de bootsector. Dit is één van de gereserveerde clusters.

Deze structuur bevat de volgende velden:

File System Information Signature

(FSI_LeadSig)

4 bytes

Bevat 0x41615252

Gereserveerd

(FSI_Reserverd1)

480 bytes

is 0. Gereserveerd voor toekomstig gebruik

Tweede signatuur

(FSI_StrucSig)

4 bytes

Bevat 0x61417272. Een tweede signuture, gelokaliseerd in de sector bij de plek met gebruikte velden.

Vrije clusters

(FSI_FreeCount)

4 bytes

Bevat het aantal vrije clusters of is 0xFFFFFFFF als deze waarde onbekend is

Volgende vrije cluster

(FSI_Nxt_Free)

4 bytes

Bevat het laatst toegewezen clusternummer. Is de waarde 0xFFFFFFFF, dan is de waarde niet bekend en moet de driver beginnen bij cluster2

Gereserveerd

(FSI_Reserved2)

12 bytes

 

is 0. Gereserveerd voor toekomstig gebruik

Afsluitende signatuur

(FSI_TrailSig)

4 bytes

Bevat 0xAA550000 = einde sector markering

 

De Root folder op een FAT32 partitie.

In tegenstelling met een FAT16 volume wordt bij FAT32 niet een aparte beperkte ruimte gereserveerd voor de de Root-folder. De root-folder is een normale folder, welke feitelijk overal op het volume kan worden geplaatst. Hierdoor heeft FAT32 niet de beperkingen voor de root-folder zoals bij FAT16.

De structuur van de rootfolder is hetzelfde als bij FAT16.

Er moet worden opgemerkt dat een folder niets anders is als een speciale file, met een datastructuur voor 32 byte ingangen. Omdat het een file is, is er dus een startcluster gespecificeerd in de BPB waar deze data staat.

Wat verder anders is, is dat de root folder geen ingangen voor "." en ".." heeft en geen naam, maar dat geldt ook voor FAT16. En alleen de root folder is een file waarvoor het VolumeID attribuut is gezet. Zie de root-folder bij FAT16.

 

De File Allocation Table op het FAT32 volume

De FAT werkt op een FAT32 volume hetzelfde als bij FAT16, alleen bestaat de tabel uit maximaal 228 - 18 entries ( = 268.435.438) van 28 bits. Er zijn echter wat beperkende factoren, zoals beperkingen van Scandisk in Windows, waardoor niet alle clusternummers gebruikt kunnen worden. Tot en met Windows 98 SE zorgde dat voor een volume-beperking van 4.177.920 clusters (= 124,55 GB). Deze beperking is in Windows ME weggewerkt.

Elke entry wijst naar een cluster, waarvan de status is weergegeven.

Elke cluster wordt in de FAT geïdentificeerd als:

Status FAT code
Beschikbaar 0x00000000
In gebruik door een file. Geeft de volgende cluster aan. 0x00000002 t/m 0x0FFFFFEF
Gereserveerde cluster 0x0FFFFFF0 t/m 0x0FFFFFF6
Slechte cluster 0x0FFFFFF7
Laatste cluster in een file >= 0x0FFFFFF8

Opmerking: een cluster wordt met 28 bits in een 32 bits veld opgegeven. De hoogste 4 bits worden daarbij genegeerd, en gewoonlijk op 0 gezet bij formatteren. Het maakt voor een correcte werking evenwel niet uit wat er in die 4 hoogste bits staat.

0x0FFFFFF7 of 0x3FFFFFF7

 

 

 

 

 

 

 

Als een file gelezen moet worden uit bijvoorbeeld de root-folder, dan wordt eerst in de root folder opgezocht op welke start-cluster de file begint.

Deze startcluster wordt opgezocht in de FAT. Wordt als status 0x0FFFFFFF opgegeven, dan staat de hele file op die ene cluster. Wordt een waarde opgegeven tussen 0x00000002 en 0x0FFFFFEF, dan geeft dit de volgende cluster aan voor de file. Dit clusternummer wordt weer opgezocht in de FAT, met hetzelfde resultaat. Net zolang tot 0x0FFFFFFF als status wordt gegeven. Alle clusters, welke dan door de file in beslag genomen worden zijn dan bekend en de hele file kan gelezen worden.

De FAT is een linked list van pointers naar sectoren:

FAT1

Clusternr Status

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Uitleg
0000-0002 0000-0000 beschikbaar
0000-0003 0000-0000 beschikbaar
0000-0004 0000-0006 volgende cluster is 00000006 (file1)
0000-0005 0FFF-FFFF einde van een file (file2)
0000-0006 0000-0009 volgende cluster is 00000009 (file1)
0000-0007 0000-0008 volgende cluster is 00000008 (file3)
0000-0008 0FFF-FFFF einde van een file (file3)
0000-0009 0FFF-FFFF einde van een file (file1)
0000-0010 0FFF-FFF7 bad cluster
0000-0011 0000-0000 beschikbaar
0000-0012 0000-0000 beschikbaar
..   beschikbaar
0FFF-FFEF 0000-0000 beschikbaar

 

Er zijn hier drie files aangegeven:

 

File1 is gefragmenteerd en beslaat 3 cluster.

File2 beslaat maar één cluster.

File3 is aaneengesloten en beslaat 3 clusters.

 

Cluster 10 is gemarkeerd als slechte cluster.

 

Wordt een nieuwe file opgeslagen dan zullen achtereenvolgens cluster 0002, 0003, 0011 en dan 0012 gebruikt worden. De eerste vrije cluster worden altijd eerst benut. Hierdoor kunnen dus gefragmenteerde bestanden ontstaan.

 

 

 

Een Hex-dump ziet er dan als volgt uit. Vanwege the little endian notatie op Intel-PC's moet elke Word (2-bytes) en double-word (DWord; 4-bytes) in omgekeerde volgorde worden weergegeven. 00000006 staat dus op de disk als 06 00 00 00. De eerste 8 bytes zijn gereserveerd, waarbij het eerste byte de media descriptor F8 is. Verder is deze dump een byte-weergave, dus de bytenummering niet verwarren met de clusternummers.

OFFSET 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
0000: F8 FF FF FF FF FF FF FF 00 00 00 00 00 00 00 00
0010: 06 00 00 00 FF FF FF 0F 09 00 00 00 08 00 00 00

0020: FF FF FF 0F FF FF FF 0F F7 FF FF 0F 00 00 00 00

0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

 

De data op het FAT32 volume

Tenslotte volgt de data van een FAT32 volume.

 

Lange bestandsnamen op FAT-volumes

Standaard staat in het register HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem\Win32FileSystem op 0, waardoor lange bestandsnamen automatisch worden ondersteund. Elke lange naam wordt volgens een algoritme omgezet in een 8.3 DOS-naam. De wijze waarop dit gebeurt verschilt bij enerzijds Windows95/98/ME en anderzijds Windows NT versies.

De Windows NT versies (Windows XP is NT versie 5.1) maken van de filenaam "The quick brown.fox" de 8.3 naam "THEQUI~1.FOX", volgens het algoritme:

1. Haal alle spaties weg

2. Neem de eerste 6 tekens

3. Voeg ~toe en een volgnummer beginnend bij 1.

4. Zoek de laatste punt in de naam en voeg een punt en de eerste 3 tekens na die laatste punt toe.

5. Bestaat die naam al, verhoog dan het volgnummer tot 9.

6. Bestaat die naam al, dan worden de eerste 5 tekens gebruikt en kan het volgnummer worden verhoogd tot 99.

7. Ten slotte wordt alles geconverteerd naar hoofdletters

 

Er worden vervolgens meerdere file/folder tabelingangen voor de file/folder gemaakt:

Filenaam

 

11 B

Attrib

 

1 B

Res

 

1 B

Create

time

3 B

Create

Date

2 B

Last

Accessed

2B

Res

 

2B

Modified

time

2B

Modified

date

2B

first

cluster

2B

file size

 

4 B

T H E Q U I ~ 1 F O X 20 NT x x x x x x x 00 00 x x x x x x x x x x
01 T h e   q 0F 00 CS u i c k   b 00 00 r o
42 w n . f o 0F 00 CS x 0000 FFFF FFFF FFFF FFFF 00 00 FFFF FFFF

(x  stelt een ingevulde waarde voor. CS is een Checksum. )

De opslag van de lange naam kost dus 2 extra tabelingangen. Eén voor de korte naam en twee voor de lange naam.

Het attribuut voor de lange-naam-ingang wordt op 0x0F gezet, dat wil zeggen het volume-ID-, hidden-, read-only-, en system-attribuut worden allemaal gezet. MS-DOS negeert gewoonlijk dit soort tabel-ingangen.

Omdat de lange filenaam in Unicode is, heeft elk teken 2 bytes.

 

[ begin pagina]

Belangrijkste referenties:

http://www.microsoft.com/technet

Boek: "Inside Windows 2000 Server", (William Boswell - New Riders -2000)

 

No information is blindly copied from other sites or resources. It is all translated, edited, corrected and, as much as possible, verified. However, I cannot garanty that all of of the above is correct (I'm sure it's not). I came across much conflicting information, which I have tried to sort out.

 

Aanvullend leeswerk

MBR

Als een actieve partitie is gevonden (ongeacht waar), dan wordt het boot record van die partitie ingelezen op geheugen locatie 0000:7c00, vervolgens wordt de MBR code toegevoegd, wijzend naar de partitietabel-ingang welke hoort bij de partitie waarvan wordt geboot. De boot record code gebruikt deze gegevens om te bepalen vanaf welke drive wordt geboot en de precieze locatie van de partitie op de disk. Als geen actieve partitie wordt gevonden, dan zal het boot-proces overgaan naar ROM BASIC via INT 18. Alle andere fouten zorgen dat het systeem stopt of gaat hangen.

Opmerkingen

  • Het eerste byte van het actieve partitie record in de partitietabel is 80.
    Deze byte wordt in het DL register geladen, voordat INT 13 wordt aangeroepen om de boot sector te lezen. Als INT 13 wordt aangeroepen, is DL het BIOS device number. Daarom kan door dit MBR-programma alleen de boot sector gelezen worden van BIOS apparaat nummer 80 (de eerste harddisk). Daardoor is het meestal niet mogelijk te booten vanaf een andere harddisk dan de eerste harddisk. Daar zijn natuurlijk weer uitzonderingen op.
     

  • Het MBR programma gebruikt de op CHS gebaseerde INT 13H AH=02H aanroep om de bootsector van de actieve partitie in te lezen. De locatie van de boot sector van de actieve partitie staat in CHS-formaat in de partitietabel. Als de disk meer dan 528MB is, dan moet deze CHS een vertaalde CHS zijn. Er worden geen adressen in LBA-vorm gebruikt. O.a. daarom lost LBA het 528MB probleem bij harddisks niet op.

Het hele MBR-record in hex en ASCII

Dit is een dump van een disk met één actieve partitie.

OFFSET 0 1 2 3  4 5 6 7  8 9 A B  C D E F  *0123456789ABCDEF*
000000 fa33c08e d0bc007c 8bf45007 501ffbfc *.3.....|..P.P...*
000010 bf0006b9 0001f2a5 ea1d0600 00bebe07 *................*
000020 b304803c 80740e80 3c00751c 83c610fe *.....t....u.....*
000030 cb75efcd 188b148b 4c028bee 83c610fe *.u......L.......*
000040 cb741a80 3c0074f4 be8b06ac 3c00740b *.t....t.......t.*
000050 56bb0700 b40ecd10 5eebf0eb febf0500 *V.......^.......*
000060 bb007cb8 010257cd 135f730c 33c0cd13 *..|...W.._s.3...*
000070 4f75edbe a306ebd3 bec206bf fe7d813d *Ou...........}.=*
000080 55aa75c7 8bf5ea00 7c000049 6e76616c *U.u.....|..Inval*
000090 69642070 61727469 74696f6e 20746162 *id partition tab*
0000a0 6c650045 72726f72 206c6f61 64696e67 *le.Error loading*
0000b0 206f7065 72617469 6e672073 79737465 * operating syste*
0000c0 6d004d69 7373696e 67206f70 65726174 *m.Missing operat*
0000d0 696e6720 73797374 656d0000 00000000 *ing system......*
0000e0 00000000 00000000 00000000 00000000 *................*
0000f0 00000000 00000000 00000000 00000000 *................*
000100 00000000 00000000 00000000 00000000 *................*
000110 00000000 00000000 00000000 00000000 *................*
000120 00000000 00000000 00000000 00000000 *................*
000130 00000000 00000000 00000000 00000000 *................*
000140 00000000 00000000 00000000 00000000 *................*
000150 00000000 00000000 00000000 00000000 *................*
000160 00000000 00000000 00000000 00000000 *................*
000170 00000000 00000000 00000000 00000000 *................*
000180 00000000 00000000 00000000 00000000 *................*
000190 00000000 00000000 00000000 00000000 *................*
0001a0 00000000 00000000 00000000 00000000 *................*
0001b0 00000000 00000000 00000000 00008001 *................*
0001c0 0100060d fef83e00 00000678 0d000000 *...........x....*
0001d0 00000000 00000000 00000000 00000000 *................*
0001e0 00000000 00000000 00000000 00000000 *................*
0001f0 00000000 00000000 00000000 000055aa *..............U.*
 

Disassembly van de MBR
Deze sector wordt eerst in geheugenlocatie 0000:7c00 geladen, 
maar verplaatst zichzelf meteen naar 0000:0600.
 
                 BEGIN:                      NOW AT 0000:7C00, RELOCATE

0000:7C00 FA            CLI                     disable int's
0000:7C01 33C0          XOR     AX,AX           set stack seg to 0000
0000:7C03 8ED0          MOV     SS,AX
0000:7C05 BC007C        MOV     SP,7C00         set stack ptr to 7c00
0000:7C08 8BF4          MOV     SI,SP           SI now 7c00
0000:7C0A 50            PUSH    AX
0000:7C0B 07            POP     ES              ES now 0000:7c00
0000:7C0C 50            PUSH    AX
0000:7C0D 1F            POP     DS              DS now 0000:7c00
0000:7C0E FB            STI                     allow int's
0000:7C0F FC            CLD                     clear direction
0000:7C10 BF0006        MOV     DI,0600         DI now 0600
0000:7C13 B90001        MOV     CX,0100         move 256 words (512 bytes)
0000:7C16 F2            REPNZ                   move MBR from 0000:7c00
0000:7C17 A5            MOVSW                      to 0000:0600
0000:7C18 EA1D060000    JMP     0000:061D       jmp to NEW_LOCATION

        NEW_LOCATION:                        NOW AT 0000:0600

0000:061D BEBE07      MOV     SI,07BE           point to first table entry
0000:0620 B304        MOV     BL,04             there are 4 table entries

        SEARCH_LOOP1:                        SEARCH FOR AN ACTIVE ENTRY

0000:0622 803C80      CMP     BYTE PTR [SI],80  is this the active entry?
0000:0625 740E        JZ      FOUND_ACTIVE      yes
0000:0627 803C00      CMP     BYTE PTR [SI],00  is this an inactive entry?
0000:062A 751C        JNZ     NOT_ACTIVE        no
0000:062C 83C610      ADD     SI,+10            incr table ptr by 16
0000:062F FECB        DEC     BL                decr count
0000:0631 75EF        JNZ     SEARCH_LOOP1      jmp if not end of table
0000:0633 CD18        INT     18                GO TO ROM BASIC

        FOUND_ACTIVE:                        FOUND THE ACTIVE ENTRY

0000:0635 8B14        MOV     DX,[SI]           set DH/DL for INT 13 call
0000:0637 8B4C02      MOV     CX,[SI+02]        set CH/CL for INT 13 call
0000:063A 8BEE        MOV     BP,SI             save table ptr

        SEARCH_LOOP2:                        MAKE SURE ONLY ONE ACTIVE ENTRY

0000:063C 83C610      ADD     SI,+10            incr table ptr by 16
0000:063F FECB        DEC     BL                decr count
0000:0641 741A        JZ      READ_BOOT         jmp if end of table
0000:0643 803C00      CMP     BYTE PTR [SI],00  is this an inactive entry?
0000:0646 74F4        JZ      SEARCH_LOOP2      yes

          NOT_ACTIVE:                        MORE THAN ONE ACTIVE ENTRY FOUND

0000:0648 BE8B06      MOV     SI,068B           display "Invld prttn tbl"

         DISPLAY_MSG:                        DISPLAY MESSAGE LOOP

0000:064B AC          LODSB                     get char of message
0000:064C 3C00        CMP     AL,00             end of message
0000:064E 740B        JZ      HANG              yes
0000:0650 56          PUSH    SI                save SI
0000:0651 BB0700      MOV     BX,0007           screen attributes
0000:0654 B40E        MOV     AH,0E             output 1 char of message
0000:0656 CD10        INT     10                   to the display
0000:0658 5E          POP     SI                restore SI
0000:0659 EBF0        JMP     DISPLAY_MSG       do it again

                HANG:                        HANG THE SYSTEM LOOP

0000:065B EBFE        JMP     HANG              sit and stay!

           READ_BOOT:                        READ ACTIVE PARITION BOOT RECORD

0000:065D BF0500      MOV     DI,0005           INT 13 retry count

           INT13RTRY:                        INT 13 RETRY LOOP

0000:0660 BB007C      MOV     BX,7C00
0000:0663 B80102      MOV     AX,0201           read 1 sector
0000:0666 57          PUSH    DI                save DI
0000:0667 CD13        INT     13                read sector into 0000:7c00
0000:0669 5F          POP     DI                restore DI
0000:066A 730C        JNB     INT13OK           jmp if no INT 13
0000:066C 33C0        XOR     AX,AX             call INT 13 and
0000:066E CD13        INT     13                   do disk reset
0000:0670 4F          DEC     DI                decr DI
0000:0671 75ED        JNZ     INT13RTRY         if not zero, try again
0000:0673 BEA306      MOV     SI,06A3           display "Errr ldng systm"
0000:0676 EBD3        JMP     DISPLAY_MSG       jmp to display loop

             INT13OK:                        INT 13 ERROR

0000:0678 BEC206      MOV     SI,06C2              "missing op sys"
0000:067B BFFE7D      MOV     DI,7DFE              point to signature
0000:067E 813D55AA    CMP     WORD PTR [DI],AA55   is signature correct?
0000:0682 75C7        JNZ     DISPLAY_MSG          no
0000:0684 8BF5        MOV     SI,BP                set SI
0000:0686 EA007C0000  JMP     0000:7C00            JUMP TO THE BOOT SECTOR WITH SI POINTING TO
                                                      PART TABLE ENTRY

Foutmeldingen beginnen hier.

0000:0680 ........ ........ ......49 6e76616c *           Inval*
0000:0690 69642070 61727469 74696f6e 20746162 *id partition tab*
0000:06a0 6c650045 72726f72 206c6f61 64696e67 *le.Error loading*
0000:06b0 206f7065 72617469 6e672073 79737465 * operating syste*
0000:06c0 6d004d69 7373696e 67206f70 65726174 *m.Missing operat*
0000:06d0 696e6720 73797374 656d00.. ........ *ing system.     *

Niet gebruikte ruimte.

0000:06d0 ........ ........ ......00 00000000 *           .....*
0000:06e0 00000000 00000000 00000000 00000000 *................*
0000:06f0 00000000 00000000 00000000 00000000 *................*
0000:0700 00000000 00000000 00000000 00000000 *................*
0000:0710 00000000 00000000 00000000 00000000 *................*
0000:0720 00000000 00000000 00000000 00000000 *................*
0000:0730 00000000 00000000 00000000 00000000 *................*
0000:0740 00000000 00000000 00000000 00000000 *................*
0000:0750 00000000 00000000 00000000 00000000 *................*
0000:0760 00000000 00000000 00000000 00000000 *................*
0000:0770 00000000 00000000 00000000 00000000 *................*
0000:0780 00000000 00000000 00000000 00000000 *................*
0000:0790 00000000 00000000 00000000 00000000 *................*
0000:07a0 00000000 00000000 00000000 00000000 *................*
0000:07b0 00000000 00000000 00000000 0000.... *............    *

De partitie tabel begint op 0000:07be.  Elke ingang van de tabel is
16 bytes.  Dit voorbeeld heeft 1 primaire partitie
welke ook de actieve bootable partitie is.

0000:07b0 ........ ........ ........ ....8001 *            ....*
0000:07c0 0100060d fef83e00 00000678 0d000000 *...........x....*
0000:07d0 00000000 00000000 00000000 00000000 *................*
0000:07e0 00000000 00000000 00000000 00000000 *................*
0000:07f0 00000000 00000000 00000000 0000.... *............    *

De laatste 2 bytes bevatten 55AAH, waarmee het einde wordt aaangegeven.

0000:07f0 ........ ........ ........ ....55aa *..............U.*