FAT16和FAT32文件定位
- FAT16
FAT文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)中有兩個(gè)重要的結(jié)構(gòu):文件分配表和目錄項(xiàng)。
FAT16整體結(jié)構(gòu)由DBR扇區(qū)、FAT表、根目錄和數(shù)據(jù)區(qū)組成。下面將詳細(xì)介紹。
其也稱(chēng)為引導(dǎo)扇區(qū),由跳轉(zhuǎn)指令JUMP,OEM廠商標(biāo)志,BPB和擴(kuò)展BPB,引導(dǎo)代碼,結(jié)束標(biāo)志0XAA55構(gòu)成。下圖為winhex下的DBR扇區(qū)截圖。其具體內(nèi)容設(shè)計(jì)可查看FATwiki:https://zh.wikipedia.org/wiki/FAT#%E8%AE%BE%E8%AE%A1。其中,可以看到保留扇區(qū)為0x08,FAT表為兩個(gè),每簇扇區(qū)數(shù)為0x80(0x0d),每個(gè)FAT占位0x80扇區(qū)(0x16-0x17)。
緊跟在保留分區(qū)后面的是FAT區(qū),其由兩個(gè)完全相同的FAT(File Allocation Table,文件分配表)表單組成,FAT文件系統(tǒng)的名字也是因此而來(lái)。FAT 表是一組與數(shù)據(jù)簇號(hào)對(duì)應(yīng)的列表。FAT2緊跟在FAT1之后,它的位置可以通過(guò)FAT1的位置加上FAT表的扇區(qū)數(shù)計(jì)算出來(lái)。(有時(shí)也只有一個(gè)FAT,具體多少要看DBR中偏移量為0x10處的值)
它是映射到分區(qū)每個(gè)簇的條目列表。每個(gè)條目記錄下面五種信息中的一種。
- 鏈中下一個(gè)簇的地址
- 一個(gè)特殊的簇鏈結(jié)束符(EOC,End Of Cluster-chain,或稱(chēng)End Of Chain)符號(hào)指示鏈的結(jié)束
- 一個(gè)特殊的符號(hào)標(biāo)示壞簇
- 一個(gè)特殊的符號(hào)標(biāo)示保留簇
- 0來(lái)表示空閑簇
定位:0x8*512 = 0x1000
它是一個(gè)表示目錄的特殊類(lèi)型文件(現(xiàn)今通常稱(chēng)為文件夾)。它里面保存的每個(gè)文件或目錄使用表中的32字節(jié)條目表示。每個(gè)條目記錄名字、擴(kuò)展名、屬性(檔案、目錄、隱藏、只讀、系統(tǒng)和卷)、創(chuàng)建的日期和時(shí)間、文件/目錄數(shù)據(jù)第一個(gè)簇的地址,最后是文件/目錄的大小。FAT16的根目錄并不由簇進(jìn)行管理。FAT16固定為32個(gè)扇區(qū)。
定位:0x1000 + 0x80*512*2 = 0x21000
115.gif定位:0x21000 + 32*512 + (5-2)*128*512 = 0x55000
- FAT32
FAT32與FAT16類(lèi)似,它主要是由保留區(qū)(DBR,FSINFO信息扇區(qū),其余),文件分配表,數(shù)據(jù)區(qū)(根目錄,數(shù)據(jù))。整體上看,其區(qū)別主要在于保留區(qū),數(shù)據(jù)區(qū)中的根目錄由簇進(jìn)行管理。
具體設(shè)計(jì)還是參照wiki: https://zh.wikipedia.org/wiki/FAT#%E8%AE%BE%E8%AE%A1。
下面圖片是我的磁盤(pán)上的DBR信息,可以看到FAT表(0x10)為兩個(gè),保留扇區(qū)數(shù)(0x0e-0x0f)為0x2022=8226。
每個(gè)FAT表大小為(0x24-0x27)0x0FEF = 4079扇區(qū)。每簇扇區(qū)數(shù)為0x8(0x0d)。
?
FAT32在保留區(qū)中增加了一個(gè)FSINFO扇區(qū),用以記錄文件系統(tǒng)中空閑簇的數(shù)量以及下一可用簇的簇號(hào)等信息,以供操作系統(tǒng)作為參考。
根據(jù)DBR中信息:FAT表位置應(yīng)該是8226*512 = 0x404400。
0x404400+0xFEF*0x200*2 = 0x800000
可以看到a.txt的目錄項(xiàng)從0x8000e0開(kāi)始,總共32個(gè)字節(jié),位于8號(hào)簇。由DBR信息可知,每個(gè)簇占8個(gè)扇區(qū)(DBR信息),那么可以定位a.txt的位置為0x806000 = 0x80000 + 6 * 8 * 512。
- FAT16文件定位與FAT32文件定位區(qū)別
- FAT32 長(zhǎng)文件解析
我將a.txt文件改名為a0123456789.txt。
長(zhǎng)文件名使用目錄登記項(xiàng)格式,占用2個(gè)字節(jié)。采用Unicode格式(一個(gè)字符占兩個(gè)字節(jié)16位)一個(gè)長(zhǎng)文件名需要若干個(gè)這樣的不登記項(xiàng),它們的含義表示為:
| 偏移量 | 長(zhǎng)(字節(jié)) | 含義 |
| 0 | 1 | 順序字節(jié) |
| 1~10 | 10 | 長(zhǎng)文件名節(jié)(5個(gè)字符) |
| 11 | 1 | 文件屬性(3F) |
| 12 | 1 | 種類(lèi) |
| 13 | 1 | 校驗(yàn)和 |
| 14~25 | 12 | 長(zhǎng)文件名節(jié)(6個(gè)字符) |
| 26~27 | 2 | 起始簇號(hào) |
| 28~31 | 4 | 長(zhǎng)文件名節(jié)(2個(gè)字符) |
所以一個(gè)目錄登記項(xiàng)可以表示5+6+2共13個(gè)字符。第一個(gè)字節(jié)的低5位指明它在文件名中的順序號(hào),第6位為“1表明它是最后一項(xiàng)”,第5,7位未用置0。
這里直接進(jìn)行定位,定位方法和之前相同。
最后兩行是短目錄項(xiàng),一般遵從一下規(guī)則:
1、系統(tǒng)取長(zhǎng)文件名的前6個(gè)字符加上“~1”形成短文件名,其擴(kuò)展名不變;
2、如果已存在這個(gè)名字的文件,則符號(hào)“~”后的數(shù)字自動(dòng)增加;
3、如果文件名內(nèi)存在windows非法的字符,則以下劃線“_”代替;
上圖中可以看到其簇號(hào)還是0x08。
總結(jié)
以上是生活随笔為你收集整理的FAT16和FAT32文件定位的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java mail模板发送高级邮件(二)
- 下一篇: 在线食物卡路里计算器html源码,卡路里