[?]關於INT13 & FAT16-32 & NTFS & 格式化



贊助商連結


purk
2008-12-23, 09:03 PM
記得看過磁碟分割的修復文章

對於FAT列表所做的變更

都會存放在MBR內

而MBR也引導開機

當時看到的資料是針對FAT16以及FAT32在主分割區的格式的

並沒有提到

如果屬於延伸分割區內的邏輯分割

在文章內有提到FAT型式的主分割在 FORMAT前 以及 FOTAMT後

其對應在MBR內的部分會有不同

也因此不小心FORMAT的FAT格式的磁區

可以在一些工具軟體以或DEBUG模式下

修改MBR而得到恢復

目前有2個問題

1.如果延伸分割區內只有一個邏輯分割

如何在沒有搬移資料下直接修改MBR的訊息

使得該邏輯分割變成主分割區

而內部資料完全保留

2.NTFS分割格式下 在 FORMAT前 以及 FOTAMT後

其對應在MBR內的部分有何不同

假如該分割區顯示RAW格式造成需要重新格式化

該如何變更MBR或其他相對應區域裡面的資料

而讓該磁區恢復原有已格式化且資料仍在的狀態

然後可以使用NT內建的CHKDSK檢查?

(NTFS格式有日誌功能 如果可以正確開啟索引

基本上有一定的機率可以修復)


以上

謝謝

贊助商連結


DDSC
2008-12-23, 10:54 PM
你這問題要回答,可寫一篇短文了,我只簡單的給予資料,其他的你就要自行試了

一個分割包括2個表,分割表(以下稱PT)及起動磁區(以下稱BS)
PT主要是記下你所分割大小的值這表雖只有512BYTES,但它佔一個軌(也就是63個磁區),PT中所記載的開始的地方就是BS也就是BOOT SEC.,這個是給OS用的,上面記載如下的資料:

偏移值 資料大小 說明
00H 3位元組 跳址指令(V5版為EB3C90H)。
3∼0AH 8位元組 系統名稱。
0BH以後為BPB資料:
0BH+00H 2位元組 每磁區之位元組數(內定為0200H)。
0BH+02H 位元組 每磁簇之磁區數。
0BH+03H 2位元組 由磁區0開始的保留磁區數。
0BH+05H 位元組 FAT個數(內定為02)。
0BH+06H 2位元組 根目錄登錄總數。
0BH+08H 2位元組 磁區總數(大於65535則此值為0)。
0BH+0AH 位元組 媒質指示。
0BH+0BH 2位元組 每一FAT所佔之磁區數。
0BH+0DH 2位元組 每磁軌之磁區數。
0BH+0FH 2位元組 磁頭數。
0BH+11H 4位元組 隱藏磁區數(內定為0)。
0BH+15H 4位元組 若8H=0則為磁區總數(內定為0)。
0BH+19H 位元組 實體磁碟機數。
0BH+1AH 位元組 保留。
0BH+1BH 位元組 擴充開機記錄之記名欄。
0BH+1CH 4位元組 由日期時間而得的序列號碼。
0BH+20H 11位元組 版本標記。
0BH+2BH 8位元組 保留(內存FAT型式;為FAT12或FAT16之文字)。

FAT表,32及NTFS的我沒研究
FAT16每個磁簇用2BYTE記下LINK值,所以有65536/2個磁簇記錄,而一個磁簇最多32KB,所以這就是FAT16有2GB的限制。
FAT16 有2份FAT表,這2份表就是一個磁簇表示,所以
2份FAT表 --> 磁簇0, ROOT目錄資料記錄項 -->磁簇1, 磁簇2起就是自由使用。

至於PT,貼一下古時候寫的一文,或許你可以找一下NORTON DOS版的 DISKEDIT來自行研究


寄件者:Asc Cpu
主旨:DOS磁區和物理磁區的互換問題(解答版)
新聞群組:tw.bbs.comp.language
日期:1998/11/10


DOS絕對磁區換算成物理磁軌、磁面、磁區之算法
───────────────────────

首先介紹本人HD之分割法:
HD1 = C: to P: ( 2.1GB )
HD2 = Q: ( 120MB )
第一台HD分成C:~P:磁碟,第二台沒分割。

表1~3是HD1的各個磁碟的分割表內量;要算物理磁軌、磁面、磁區所需要
知的有HD的最大每一磁面上的磁區總數值,由表1知為63;每一磁軌的磁面數
(就是磁頭數),由表1知為64,而總磁軌數要不要,則示程式寫作時決定;
再來就是要知保留磁區的值(由 RELATIVE SEC. 欄得知)。

接下來談公式:

A式:
物理磁區值=線性磁區值(註) MOD 每一磁面的磁區總數值
B式:
物理磁面值= INT(線性磁區值/每一磁面的磁區總數值) MOD 每一磁軌的磁面總數值
C式:
物理磁軌值= INT(線性磁區值/(每一磁面的磁區總數值*每一磁軌的磁面總數值))

註:因為要區分物理磁區而取名的,其如何求出的,後述。

OK:現在我要求出在C:之絕對磁區3988,位於HD的何處,則步驟如下:

1、絕對磁區+1+C:的保留磁區值=線性磁區值,為:

3988+1+63=4052

2、把1步求出的值代入上面的A、B、C三式中得:

A=4052/63=64餘20,所以 A=20
B=64/64=1餘0,所以 B=0
C=1

3、所以位在磁軌1、磁面0、磁區20的地方。(CYLI.=1,SIDE=0,SEC.=20)


表1:
DISK DRIVER= C: & D:+
---------------------------------------------------------------------------
| | | Starting Location | Ending Location |Relative |Number of |
|System|Boot|Side Cylinder Sector|Side Cylinder Sector|Sectors | Sectors |C:
|BIGDOS| Yes| 1 0 1 | 63 60 63 | 63| 245889|D:+
|EXTEND| No | 0 61 1 | 63 1021 63 | 245952| 3874752|
---------------------------------------------------------------------------


表2:
DISK DRIVER= D: & E:+
---------------------------------------------------------------------------
| | | Starting Location | Ending Location |Relative |Number of |
|System|Boot|Side Cylinder Sector|Side Cylinder Sector|Sectors | Sectors |D:
|BIGDOS| No | 1 61 1 | 63 121 63 | 63| 245889|E:+
|EXTEND| No | 0 122 1 | 63 182 63 | 245952| 245952|
---------------------------------------------------------------------------


表3:
DISK DRIVER= E: & F:+
---------------------------------------------------------------------------
| | | Starting Location | Ending Location |Relative |Number of |
|System|Boot|Side Cylinder Sector|Side Cylinder Sector|Sectors | Sectors |E:
|BIGDOS| No | 1 122 1 | 63 182 63 | 63| 245889|F:+
|EXTEND| No | 0 183 1 | 63 243 63 | 491904| 245952|
---------------------------------------------------------------------------


好,現在要求出E:中絕對磁區77988在何處:

1、由表2的E:+處得之,之前的保留區是245952,再看表3中的E:分割
表內的保留區是63,所以線性磁區值為:

77988+1+63+245952=324004

2、代入ABC三式得:

A=324004/63=5142餘58,所以 A=58
B=5142/64=80餘22,所以 B=22
C=80

則位於 CYLI.=80,SIDE=22,SEC.=58 處。

好了,說明完了,知到算法之後,你可以把整個邏輯磁碟機 BACK UP 都行了

OK,有問題或有錯的地方可以提出來........

.. THE WAY YOU DO THE THINGS YOU DO/MY GIRL .. (DARYL HALL & JOHN OATES)
--- News Gateway 0.08+
* Origin: TeaTime BBS 886-2---------- News <=> BBS Gateway (6:720/345.0)

bx2aa
2008-12-24, 02:05 AM
剛好以前一個字一個字重建 FAT32 的 Bios Parameter Block

MBR 在 Linux 分為 boot loader 446 Bytes + Disk Partition Table 4*16 Bytes + Magic(RedHat) 55AA 2 Bytes

我以前搜尋的文章裡是 MBR Sector 分為 Master Boot Recoder 446 Bytes + Disk Partition Table 4*16 Bytes + 55AA 2 Bytes 有效磁扇區標記

Format 只會更動 Disk Partition Table 裏 Partition 的 Type(Linux System ID) 一個 Bytes 但是不一定有改,也會有例外的(RedHat Fedora centos 安裝時特殊情況下會不改)有去考丙級硬體裝修某些人會遇到

Disk Partition Table 從 447 Bytes 開始 01be 偏移位置 80 代表 Active 00 代表有效 其餘為無效(要看內容怎麼寫不一定為無效)
其他位元組解釋看圖
http://www.pczone.com.tw/attachment.php?attachmentid=16849&stc=1&d=1230050666

而這個 MBR Sector 是 Load Bios Parameter Block 那個 Sector
然後會把 NTFS 的 File Allocation Table 的 Bios Partition Block 的參數讀進來後再去 Load NTLDR
http://www.pczone.com.tw/attachment.php?attachmentid=16864&stc=1&d=1230051466

NTFS File Allocation Table 記得 2000 那書裡有詳細說明.
多年前告訴過你, 我忘了書名是什麼.

我了解的是 FAT 16 32 Format 可以選把 File Allocation Table 複製到硬碟末尾.(我不知是不是真的我個人沒試過)
當要回復只要沒去動到最後面的 Sector 可以用來恢復.

要把邏輯磁碟分割區裡的 Partition 拿出來用, 只要把他的 Partition Table 16 個 Bytes 填進 MBR Sector 裏的 Disk Partition Table 就可以了.

安裝 Linux 時有個強制為 主分割 就是你說的把延伸分割裡的 Partition 拿到主分割區去.

用 Dobiash Disk Doctor v1.4 先找到 MBR Sector LBA:0
裏的 01b0 那行倒數第二個字開始 01be 那 4*16 找到 延伸分割 可能是 01ce 01de 01ee.
再計算 此分區前的 Sector 數 加上此分區Sector數 就是多少 LBA:??? 十六進位要算一下

把每個 Partition Table 都找出來, 一個一個用 ddd 去改到 MBR Sector 的 Disk Partition Table 上再用其他電腦來讀.

但是第一個動作先整個硬碟軌對軌 Copy 一份再動手.
軌對軌前也先確定 BIOS 的順序和排線都接對.

不然對錯, 把要的蓋掉就虧大了.

rushoun
2008-12-24, 03:09 AM
看到這個問題,不知怎麼的,腦袋裡就浮現出施威銘三個字,好像跟他有關係的書裡面有答案。不過..以現在的腦袋,已經忘記很多事了。很多事情,好像還是交給一些程式或是不要去碰啦!因為這些動作,不小心就會損失資料的。

DDSC
2008-12-24, 10:49 AM
我了解的是 FAT 16 32 Format 可以選把 File Allocation Table 複製到硬碟末尾.(我不知是不是真的我個人沒試過)
當要回復只要沒去動到最後面的 Sector 可以用來恢復.


UNFORMAT 只有軟碟可用,一般2HD的FD雖有80軌,但實際上可用80.5軌,有0.5軌沒用,而FD 用FAT12,佔空間不多,正好那0.5軌可拿作反格式化資料區。
但HD就不行了,不過用特殊工具應該可行。

TO,樓主是想寫磁碟救援程式?
以前有一本厚書,叫實戰HD什麼的,內有你想要的東西,不過那本好像沒談及NTFS。
反正現在HD便宜,買幾顆來玩玩更有幫助 :D

purk
2008-12-24, 02:52 PM
我不是想寫救援程式

是因為之前遇到的一堆問題

這次總加在一起一起詢問

1.之前有一顆外接的HD使用NTFS格式

可能是USB介面問題導致讀取不到

用2.5轉3.5的轉到PC上

再使用2K內建的CHKDSK檢查磁碟(說真的2K版本的比較強)

之後再讀取檢查出來的*.CHK檔案

而恢復資料




2.有使用SPFDISK及LINUX手動變換過主分割的大小 確定成功

但是使用於延伸分割內的邏輯分割 只有成功過一次

尤其是直接將邏輯分割變成主分割 就出現尚未格式化的狀態

3. 手邊有一顆HD分割區起始磁住忘記 只記得大約大小

使用還原軟體讀取 可以看的到檔案名稱 但是救援後 檔案讀取不到

推測是MTF出錯 使用R-S去掃描整顆磁碟 列出了幾個有用的分割表

但是沒有列出 起始磁住 依據R-S的建議 使用程式自動恢復該分割表

但是在XP中卻是顯示 尚未格式化的磁區 故需要知道 要變更哪幾個碼

來達到XP可以正確辨識 進而使用CHKDSK檢查NTFS內建索引MTF的錯誤

而達到修復資料的方式

謝謝

bx2aa
2008-12-24, 05:50 PM
3. 手邊有一顆HD分割區起始磁住忘記 只記得大約大小

使用還原軟體讀取 可以看的到檔案名稱 但是救援後 檔案讀取不到

推測是MTF出錯 使用R-S去掃描整顆磁碟 列出了幾個有用的分割表

但是沒有列出 起始磁住 依據R-S的建議 使用程式自動恢復該分割表

但是在XP中卻是顯示 尚未格式化的磁區 故需要知道 要變更哪幾個碼

來達到XP可以正確辨識 進而使用CHKDSK檢查NTFS內建索引MTF的錯誤

而達到修復資料的方式

謝謝
這樣也可以
把大約大小計算一下約是多少個 Sector

如果是要我告訴你怎麼做, 你自己親力親為?

請把 MBR Sector 的資料 01be-01fd 給我
若不見了請把
LBA: 63 內的 0029 開始的 4 個 Bytes 給我 或是 0020 整行給我
從這裡可以算出第一個 Partition 有多大就能跳到第二個 Partition.

然後一個一個找
我試過沒有問題, 只要更改
00 FE FF FF 07 FE FF FF XX XX XX XX 接原來的 ?? ?? ?? ??
XX XX XX XX 就是要計算出前面有多少個 Sector

把要從 延伸磁區拉到主分割去的 Partition 那個地方如圖 給我.
我就能告訴你要改為多少