Je to soubor, kerej obsahuje hlavičky všech souború včetně sebe. Obvykle zabírá 1/8 disku.
| Ofset | Velikost | Význam |
|---|---|---|
| 13 | 1 | Velikost klastru v sektorech (sektor = 512 B) |
| 48 | 8 | Číslo klastru MFT |
| 56 | 8 | Číslo klastru MFTMirr (záloha prvních 4 souború) |
| 64 | 1 | Velikost MFT záznamu v bajtech (-N = 2N) (0F6h = 1024) |
| Číslo | Název |
|---|---|
| 0 | $MFT |
| 1 | $MFTMirr |
| 2 | $LogFile |
| 3 | $Volume |
| 4 | $AttrDef |
| 5 | . (Root Directory) |
| 6 | $BitMap |
| 7 | $Boot |
| 8 | $BadClus |
| 9 | $Secure |
| 10 | $UpCase |
| 11 | $Extend |
| 12-23 | $ObjId |
| 12-23 | $Quota |
| 12-23 | $Reparse |
| 12-23 | $UsnJrnl |
| FileDescriptor | Atribut1 | Atribut2 | Atribut3 | ... | 0xFFFFFFFF | ... |
| 1024 | ||||||
Každej sektor v MFT končí dvoubajtovym číslem update sequence. V 1024 bajtovym záznamu to sou 2 položky. Data, kerý byly na těhle pozicích púvodně, se ukládají do update_seq_array.
Atributy se dělej na rezidentní a nerezidentní. Rezidentní sou celý v MFT záznamu, nerezidentní obsahujou takzvanej DataRun, kerej odkazuje do datový části disku. Rezidentní atributy začínaj strukturou StandardHeader.
struct StandardHeader{| Číslo | Význam |
|---|---|
| 10h | STANDARD INFORMATION |
| 20h | ATTRIBUTE LIST |
| 30h | FILE NAME |
| 40h | OBJECT ID |
| 50h | SECURITY DESCRIPTOR |
| 60h | VOLUME NAME |
| 70h | VOLUME INFORMATION |
| 80h | DATA |
| 90h | INDEX ROOT |
| 0A0h | INDEX ALLOCATION |
| 0B0h | INDEX BITMAP |
| 0C0h | REPARSE POINT |
| 0D0h | EA INFORMATION |
| 0E0h | EA |
| 0F0h | PROPERTY SET |
| 100h | LOGGED UTILITY STREAM |
U nerezidentních atributú.
VCN (Virtual Cluster Number) = číslo klastru v souboru.
LCN (Logical Cluster Number) = číslo klastru na disku.
| Ofset | Velikost | Význam |
|---|---|---|
| 0 | 1 | sizes (& 0Fh = počet bajtú count, >> 4 = počet bajtú base, 00 = konec) |
| 1 | sizes & 0Fh | count (počet klastrú) |
| 1 + sizes & 0Fh | sizes >> 4 | base (klastr začátku, se znamínkem, relativní k předchozímu) |
Příklad (hex):
31
02 56 34 12
11 04 24
11
06 F0
00
1. datarun: count = 2, base = 0 + 123456h
2. datarun: count = 4, base = 123456h + 24h = 12347Ah
3. datarun: count = 6, base = 12347Ah + 0F0h = 12347Ah - 10h = 12346Ah
Obsahuje tyhle atributy:
10h - STANDARD INFORMATION
30h - FILE NAME (pro každej hardlink)
50h - SECURITY DESCRIPTOR (přístupový práva)
80h - DATA (obsah souboru - rezidentní nebo nerezidentní)
struct StandardInformation{
// +StandardHeader
DateTime created
DateTime modified
DateTime mft_modified
DateTime accessed
uns4 permissions
uns4 max_versions // 0 - not limited
uns4 version
}
struct FileNameAtr{
// +StandardHeader
uns8 parent_dir
DateTime created
DateTime modified
DateTime mft_modified
DateTime accessed
uns8 allocated
uns8 size
uns4 flags // 1 read only, 2 hidden, 4 system, 20h arch, 40h dev,
100h tmp, 200h sparse, 400h reparse, 10000000h dir
uns4 ea_reparse
uns1 name_len
uns1 namespace
uns2 name[256]
}
Méno souboru je v UTF-16 LE.
Namespace: 0 posix, 1 win, 2 dos, 3 dos & win
Obsahuje tyhle atributy:
10h - STANDARD INFORMATION
30h - FILE NAME
50h - SECURITY DESCRIPTOR
90h - INDEX ROOT
Pokud je nastaven flag large:
0A0h - INDEX ALLOCATION - nerezidentní
0B0h - INDEX BITMAP
Ména atributú (ne souboru) sou "$I30" (UTF-16 LE)
Pokud se IndexEntry nevejdou do MFT záznamu, nastaví se flag large
a IndexRoot obsahuje pouze jeden IndexEntry, jehož subnode odkazuje na
VCN kořenovýho uzlu (root node).
| StandardIndexHeader (18h) | NodeHeader (10h) | Fixup (18h) | IndexEntry1 | IndexEntry2 | IndexEntry3 | ... |
| 4096 | ||||||
Číslo subnode je VCN do INDEX ALLOCATION.
Subnode obsahuje ty uzly, kerý sou menší než aktuální uzel, kromě posledního.
Fixup je to samý jako update_sequence. Velikost uzlu je 4096 (8 sektorú) a 1
číslo update sequence, takže potřebujeme 9 * 2 B, zbytek je zarovnání na 8 B.
Najdi první klíč, kerej je věčí než novej. Přidej novej před něj.
1: Pokud je uzel plnej: rozděl ho na dva, najdi medián(prostřední klíč), ten přidej
do rodiče. goto 1
Add a node (en)
Smaž klíč
Pokud měl potomka: Najdi nejvěčího potomka a přesuň ho sem.
To samý pro uzel nejvěčího potomka.
2: Pokud uzel není dostatečně zaplněnej:
Pokud sourozenec má dostatek klíčú, ukradni jeden, jinak spoj se sourozencem.
goto 2