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