天天看點

硬碟分區表

    人們在使用電腦時,有時由于異常操作,有時由于病毒侵襲,會導緻某個分區消失或硬碟無法啟動。究其原因,就是硬碟分區表受損。硬碟分區表可以說是支援硬碟正常工作的骨架.作業系統正是通過它把硬碟劃分為若幹個分區,然後再在每個分區裡面建立檔案系統,寫入資料檔案.本文主要講述的是分區表的位置,結構以及各個分區表是如何連結起來的.當掌握了這些知識後,即使分區表受到破壞,一樣也可以根據殘存的資料手工修複分區表,進而修複分區。

一、分區表的位置及識别标志

    分區表一般位于硬碟某柱面的0磁頭 1扇區.而第1個分區表(也即主分區表)總是位于(0柱面,1磁頭,1扇區),剩餘的分區表位置可以由主分區表依次推導出來.分區表有64個位元組,占據其所在扇區的[441-509]位元組.要判定是不是分區表,就看其後緊鄰的兩個位元組(也即[510-511])是不是 "55AA",若是,則為分區表.

二、分區表的結構

分區表由4項組成,每項16個位元組.共4×16 = 64個位元組.每項描述一個分區的基本資訊.每個位元組的含義如下::

分區表項含義

位元組 含義
Activeflag.活動标志.若為0x80H,則表示該分區為活動分區.若為0x00H,則表示該分區為非活動分區.
1,2,3 該分區的起始磁頭号,扇區号,柱面号磁頭号 -- 1位元組, 扇區号 -- 2位元組低6位,柱面号 -- 2位元組高2位 + 3位元組
4

分區檔案系統标志:

分區未用: 0x00H.

擴充分區: 0x05H, 0x0FH.

FAT16分區: 0x06H.

FAT32分區: 0x0BH, 0x1BH, 0x0CH, 0x1CH.

NTFS檔案系統: 0x07H.

5,6,7 該分區的結束磁頭号,扇區号,柱面号,含義同上.
8,9,10,11 邏輯起始扇區号。表示分區起點之前已用了的扇區數.
12,13,14,15 該分區所占用的扇區數.

分區表項有幾個位元組比較重要,下面分别闡述之:

1、(1,2,3)位元組  

磁頭号由(1)位元組8位表示,其範圍為(0 -- 28 - 1),也即(0 磁頭-- 254磁頭)。  

扇區号由(2)位元組低6位表示,其範圍為(0 -- 26 - 1),由于扇區号從1開始,是以其範圍是(1扇區-- 63扇區)。  

柱面号由(2)位元組高2位 + (3)位元組,共10位表示,其範圍為(0 --2 10 - 1),也即(0 柱面-- 1023柱面)。當柱面号超過1023時,這10位依然表示成1023,需要注意。(5,6,7)位元組含義同上。

2、(8, 9, 10, 11)位元組      

如果是主分區表,則這4 個位元組表示該分區起始邏輯扇區号與邏輯0扇區(0柱面,0磁頭,1扇區)之差。如果非主分區表,則這4 個位元組要麼表示該分區起始邏輯扇區号與擴充分區起始邏輯扇區号之差,要麼為63。詳細情況在後面有所闡述。    

注意:

1、扇區上的位元組是按左邊低位,右邊高位的順序排列的。是以在取值時,需要把位元組再反一下,讓高位位元組在左邊,低位位元組在右邊,這一點在讀取邏輯起始扇區号和分區大小時需要注意。舉個例子:第一項的邏輯起始扇區為(3F 00 00 00),轉換為十進制前要先反一下位元組順序,為(00 00 00 3F)然後在轉換為十進制,即63 .同理分區大小為(3F 04 7D 00),先反為(00 7D 04 3F)再轉換為十進制,即8193087。

2、邏輯扇區号與(柱面,磁頭,扇區)的互相轉換:

令L = 邏輯扇區号,C = 柱面号,H = 磁頭号,S = 扇區号。

每道扇區數 =  63

每柱面磁頭數 = 255

每柱面扇區數 = 每道扇區數* 每柱面磁頭數= 63 × 255= 16065

柱面号下标從0開始。磁頭号[0 -- 254],扇區号[1 -- 63]。

邏輯扇區号下标也從0開始。

(柱面,磁頭,扇區)轉換成邏輯扇區号的公式為:

L = C×16065 + H ×63 + S - 1 ;

比如(1柱面,1磁頭,1扇區),其邏輯扇區号為:

L = 1×16065 + 1×63 + 1 - 1= 16128

邏輯扇區号轉換成(柱面,磁頭,扇區) 公式為:

C = L / 16065H = (L % 16065) / 63S = (L % 16065) % 63 + 1

比如邏輯扇區号 16127:

C = 16127 / 16065 = 1H = (16127 % 16065) / 63 = 0S = (16127 % 16065) % 63 + 1 = 63

即(1柱面,0磁頭,63扇區)  

3、分區表上有四項,每一項表示一個分區,是以一個分區表最多隻能表示4個分區。主分 區表上的4項用來表示主分區和擴充分區的資訊。因為擴充分區最多隻能有一個,是以硬碟 最多可以有四個主分區或者三個主分區,一個擴充分區。餘下的分區表是表示邏輯分區的。 這裡有必要闡述一點:邏輯區都是位于擴充分區裡面的,并且邏輯分區的個數沒有限制。

4、分區表所在扇區通常在(0磁頭,1扇區),而該分區的開始扇區通常位于(1磁頭,1扇區),中間隔了63 個隐藏扇區。  

三.分區表鍊的查找

 分區表鍊實際上相當于一個單向連結清單結構。第一個分區表,也即主分區表,可以有一項 描述擴充分區。而這一項就相當于指針,指向擴充分區。然後我們根據該指針來到擴充分 區起始柱面的0頭1扇區,找到第二個分區表。對于該分區表,通常情況下:第一項描述了 擴充分區中第一個分區的資訊,第二項描述下一個分區,而這第二項就相當于指向第二個分 區的指針,第三項,第四項一般均為0。我們可以根據該指針來到擴充分區中第二個分區起 始柱面的0頭1扇區,找到第三個分區表。以此類推,隻到最後一個分區表。而最後一個分 區表隻有第一項有資訊,餘下三項均為0.相當于其指針為空.是以隻要找到了一個分區表就可 以推導找出其後面所有分區表。不過該分區表前面的分區表就不好推導出來了。但令人高興 的是這個連結清單的頭節點,也即主分區表的位置是固定的位于(0柱面, 0磁頭, 1扇區)處, 我們可以很輕易的找到它,然後把剩下的所有分區表一一找到。

以筆者的硬碟為例:一個主分區(C槽), 一個擴充分區.擴充分區中有兩個邏輯分區(D盤,E盤)其分區表鍊示意圖如下:

硬碟分區表

圖一 分區表鍊示意圖

1、讀取(0柱面,0磁頭,1扇區)處C槽的主分區表:  

[80 01 01 00 0B FE 7F FD 3F 00 00 00 3F 04 7D 00 ]                                    

[00 00 41 FE 0F FE FF FF 7E 04 7D 00 1F 2C B4 00 ]

[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]    

[00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

第一項:(80)(01 01 00)(0B)(FE 7F FD )(3F 00 00 00 )(3F 04 7D 00)描述的是C槽的情況。

1.(80):表示C槽為活動分區。即系統會從C槽啟動。

2.(01 01 00):表示C槽的起始扇區為(0柱面,0磁頭,1扇區)。

3.(0B):表示C槽的檔案系統為FAT32。

4.(FE 7F FD):(FE) 16  =  (254) 10  (7F) 16  =  (0111 1111) 2  (FD) 16  =  (1111 1101) 2

磁頭号:(254) 10;

扇區号:(11 1111) 2  =  (63) 10.

柱面号:(01 1111 1101) 2  =  (509) 10

故C槽結束扇區為(509柱面,254磁頭,63扇區)。

5.(3F 00 00 00):反向,(00 00 00 3F) 16  =  (63) 10,為C槽起始邏輯扇區号與邏輯0扇區号之差。表示C槽前面已有63個扇區,這63個扇區為系統隐藏扇區。

6. (3F 04 7D 00):反向,(00 7D 04 3F) 16  =  (8193087) 10。表明C槽有8193087個扇區。即(0柱面,1磁頭,1扇區)至(509柱面,254磁頭,63扇區)共有8193087個扇區。

第二項:(00)(00 41 FE)(0F)(FE FF FF)(7E 04 7D 00)(1F 2C B4 00)描述的是擴充分區的情況。

1. (00): 表示該分區不是活動分區。

2. (00 41 FE):(00) 16  =  (0) 10  (41) 16  =  (0100 0001) 2  (FE) 16  =  (1111 1110) 2

磁頭号:(0) 10;

扇區号:(00 0001) 2  =  (1) 10.

柱面号:(01 1111 1110) 2  =  (510) 10

是以擴充分區的起始扇區為(510柱面,0磁頭,1扇區)。

3. (0F): 表示該分區為擴充分區。

4. (FE FF FF):(FE) 16  =  (254) 10  (FF) 16  =  (1111 1111) 2  (FF) 16  =  (1111 1111) 2;

柱面号:(11 1111 1111) 2  =  (1023) 10

但這是不準确的,因為當柱面号的真實值超過1023時,表示柱面号的10位也依然是1023。

5. (7E 04 7D 00):反向,(00 7D 04 7E) 16  =  (8193150) 10. 表示擴充分區的起始扇區号為8193150,即(510 柱面,0磁頭,1扇區)。這是真實準确的,我一般都用這一項來定位分區起點。

6. (1F 2C B4 00):反向, (00 B4 2C 1F) 16  =  (11807775) 10. 表示擴充分區共有11807775個扇區。通過上面得到的起點和分區的大小,可以推導出擴充分區的結束位置:8193150 + 11807775 = 20000925号扇區,即(1244 柱面,254磁頭,63扇區)。

2、查找D盤分區表

根據上面的資訊,第二個分區表,也即D盤分區表在(510柱面,0磁頭,1扇區)處。讀取該扇區,得到分區表如下:

[00 01 41 FE 0B FE FF 7B 3F 00 00 00 BF A3 5D 00 ]                                    

[00 00 C1 7C 05 FE FF FF FE A3 5D 00 21 88 56 00 ]

第一項:(00)(01 41 FE)(0B)(FE FF 7B)(3F 00 00 00 )(BF A3 5D 00)  描述的是D盤的情況。

1.(00):表示D盤不是活動分區。

2.(01 41 FE):  (01) 16  =  (1) 10  (41) 16  =  (0100 0001) 2  (FE) 16  =  (1111 1110) 2.

磁頭号:(1) 10;

柱面号:(01 1111 1110) 2  =  (510) 10;

故D盤開始扇區為(510柱面,1磁頭,1扇區)。

3.(0B):表示D盤的檔案系統為FAT32。

4.(FE FF 7B):(FE) 16  =  (254) 10 。 (FF) 16  =  (1111 1111) 2  (7B) 16  =  (0111 1011) 2.

柱面号:(11 0111 1011) 2  =  (891) 10

故D盤結束扇區為(891柱面,254磁頭,63扇區)。

5.(3F 00 00 00):反向,(00 00 00 3F)16  =  (63)10,為D盤起始邏輯扇區号(510柱面,1磁頭,1扇區)與擴充分區起始邏輯扇區号(510柱面,0磁頭,1扇區)之差。表示D盤前面已有63個扇區,這63個扇區為系統隐藏扇區。

6. (BF A3 5D 00):反向,(00 5D A3 BF) 16  =  (6136767) 10。表明D盤有6136767個扇區。通過上面得到的起點和分區的大小,可以推導出D盤的結束位置:8193150 + 63 + 6136767 = 14329980号扇區。即(891柱面,254磁頭,63扇區)。與上面的正好吻合。

第二項:(00)(00 C1 7C)(05)(FE FF FF)(FE A3 5D 00)(21 88 56 00)描述的是E盤的情況。

1. (00): 表示E盤不是活動分區。

2. (00 C1 7C):(00) 16  =  (0) 10  (C1) 16  =  (1100 0001) 2  (7C) 16  =  (0111 1100) 2

磁頭号:(0) 10

扇區号:(00 0001) 2  =  (1) 10

柱面号:(11 0111 1100) 2  =  (892) 10

是以E盤的起始扇區為(892柱面,0磁頭,1扇區)。

3. (05): 表示E盤的在擴充分區裡面。

4.(FE FF FF):(FE) 16  =  (254) 10  (FF) 16  =  (1111 1111) 2  (FF) 16  =  (1111 1111) 2

磁頭号:(254) 10

扇區号:(11 1111) 2  =  (63) 10

但這是不準确的,原因同上。

5.(FE A3 5D 00): 反向,(00 5D A3 FE) 16  =  (6136830) 10. 這一項非常重要,它定位了E盤分區表所在扇區。其值為E盤分區表所在扇區号 與擴充分區起始扇區号之差。是以,E盤分區表所在扇區号為:8193150 + 6136830 = 14329980。即(892柱面,0磁頭,1扇區)。

6.(21 88 56 00):反向,(00 56 88 21) 16  =  (5670945) 10.表示E盤共有11807775個扇區。通過上面得到的起點和分區的大小,可以推導出E盤的結束位置:14329980 + 5670945 = 20000925号扇區,即(1244 柱面,254磁頭,63扇區)。

3、查找E盤分區表

根據上面的資訊,第三個分區表,也即E盤分區表在(892柱面,0磁頭,1扇區)處。讀取該扇區,得到分區表如下:

[00 01 C1 7C 0B FE FF FF 3F 00 00 00 E2 87 56 00]

[ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]

該分區表第二項全為0,說明沒有下一個分區表了。該分區表就是分區表鍊的最後一個節點。

第一項:(00)(01 C1 7C)(0B)(FE FF FF)(3F 00 00 00 )(E2 87 56 00)該項與D盤分區表的第二項描述的都是E盤的情況,但它們在某些細節上又有所差別。

1.(00):表示E盤不是活動分區。

2.(01 C1 7C):  (01) 16  =  (1) 10  (C1) 16  =  (1100 0001) 2  (7C) 16  =  (0111 1100) 2.

磁頭号:(1) 10

故E盤起始扇區為(892柱面,1磁頭,1扇區)。

3.(0B):表示E盤的檔案系統為FAT32。

4.(FE FF FF):(FE) 16  =  (254) 10 。 (FF) 16  =  (1111 1111) 2  (FF) 16  =  (1111 1111) 2.

5.(3F 00 00 00):反向,(00 00 00 3F) 16  =  (63) 10.這一項與D盤分區表相應項有所不同.為E盤起始邏輯扇區号(892柱面,1磁頭,1扇區)與(892柱面,0磁頭,1扇區)之差。表示E盤前面已有63個扇區, 這63個扇區為系統隐藏扇區。作業系統無法對這些扇區進行讀寫,是以可以把自己的秘密資訊寫在這裡.

6. (E2 87 56 00): 反向,(00 56 87 E2) 16  =  (5670882) 10。表明E盤有5670882個扇區。而D盤分區表相應項為5670945. 5670945 - 5670882 = 63.正好等于63個隐藏扇區.這是因為D盤分區表描述的是(892柱面,0磁頭,1扇區) 到 (1244 柱面,254磁頭,63扇區) 之間的扇區數。而E盤分區表描述的是(892柱面, 1磁頭,1扇區) 到 (1244 柱面,254磁頭,63扇區) 之間的扇區數。

四.結束語

    至此,我們已經打通了整個分區表鍊.以後在某個鍊節點資料受損時,也可以根據上下節點的資訊而手工定位并修複之。

修複工具可采用可讀寫磁盤的Winhex.

繼續閱讀