さていよいよバイナリエディタを使っての手作業に入る。
(2a)ブートセクタ、FAT領域の切り出し
ディスクイメージの最初の1セクタ(512バイト)分は、ブートセクタと呼ばれていて、論理ディスクに関する情報が入っている。ここが壊れていると少しだけ面倒になる。
今回はここが生きていたので少し楽ができる。
ブートセクタの構造
オフセット | 内容 | 今回のデータ |
00h〜02h |
x86のジャンプ命令。 |
EB 3C 90 |
03h〜0Ah |
OEMラベル名 |
"MSDOS5.0" |
0Bh〜0Ch |
論理セクタサイズ。普通は512バイト。 |
0200h |
0Dh |
セクタ/クラスタ数 |
20h |
0Eh〜0Fh |
予約セクタ数 |
0001h |
10h |
FAT数 |
02h |
11h〜12h |
ルートディレクトリエントリ数。 |
0200h |
13h〜14h |
全セクタ数(65,536未満の場合) |
0000h |
15h |
メディアディスクリプタ |
F8h (固定ディスク) |
16h〜17h |
FATサイズ(セクタ数) |
007Dh |
18h〜19h |
セクタ/トラック数 |
003Fh |
1Ah〜1Bh |
ヘッド数 |
0010h |
1Ch〜1Fh |
隠しセクタ数 |
000000E5h |
20h〜23h |
全セクタ数(65,536以上の場合) |
000F861Bh |
24h |
物理ドライブ番号 |
80h |
25h |
Reserved |
00h |
26h |
ブートシグニチャ |
29h |
27h〜2Ah |
ボリュームシリアルID |
00000001h |
2Bh〜35h |
ボリュームラベル |
"ZAURUS" |
36h〜3Dh |
ファイルシステムタイプ |
"FAT16" |
3Eh〜1FDh |
ブートストラップコード |
|
1FEh〜1FFh |
BIOSブートシグニチャ |
AA55h |
最初の3バイトはx86のジャンプ命令だ。ブートストラップコードへのジャンプ命令が書かれている。MS-DOS時代からの名残だが、フロッピーからブートする場合、最初にブートセクタの先頭、ここに制御が移される。この3バイトは通常ブートストラップコードの先頭に相対ジャンプするコードが書かれている。([EB 3C]=JMP SHORT +3Ch、[90]=NOP)
32セクタ/クラスタなので、1クラスタ=32セクタ=16,384バイトとなる。
予約セクタ数はFATよりも前にあるセクタ数のことであり、つまりFATの開始セクタに等しい。今回は 0001h なのでブートセクタの直後からFATが始まることになる。
ルートディレクトリエントリ数からルートディレクトリのサイズが計算できる。
ルートディレクトリのサイズ=(1エントリのサイズ32バイト)×(エントリ数)
今回の場合はエントリ数 512個であるので、ルートディレクトリサイズ=16,384バイト=1クラスタ分に相当。
FAT領域のサイズは、7Dh=125セクタ=FA00hバイトである。FAT数は2(メイン+予備)なので、合計250セクタ、1F400hバイトがFAT領域となる。
全セクタ数は 000F861Bh=1,017,371セクタ。
バイト換算すると520,893,952バイト。
BIOSブートシグニチャはブートセクタの終わりを示すと同時に、ブートセクタが正常であることを示す目印。AA55hなら正常。
ここまでの情報から、ディスクイメージのレイアウトは以下のようになる。
セクタ | オフセット | 概要 |
0 | 00000000h 000001FFh |
ブートセクタ |
1〜125 | 00000200h 0000FBFFh |
FAT領域1 |
126〜250 | 0000FC00h 0001F5FFh |
FAT領域2 |
251〜282 | 0001F600h 000235FFh |
ルートディレクトリ |
283〜1017370 | 00023600h 1F0C35FFh |
データ領域 |
FAT領域1、2についてもファイルを切り出しておく。今回はFAT領域をざっと眺めてみるとFATが明らかに破損している。どっかのファイルのデータらしきものが入っているようだ。とりあえずそのままにして該当サイズ分だけ切り出す。
FATファイルシステムにおけるクラスタ番号は初心者にはわかりにくいが、0から始まっていない。そもそもデータ領域の開始セクタは283であり、セクタ/クラスタ数で割り切れない。データ領域より前の領域についてはクラスタの概念では管理されておらず、セクタ単位での管理となっている。そしてデータ領域は、クラスタ番号2から唐突に始まることになっている。(0と1は存在しないことになっている)
したがって、セクタ283がクラスタ2の先頭であり、データ領域の先頭となる。
データ領域についてはクラスタ単位のデータ管理となる。
現在のままではクラスタ数で割り切れないファイルの分割構成になっているため、簡便のためいったんデータ領域の分割ファイルを1つの統合ファイルにまとめてから、もう一度4MB単位のファイルに分割しなおす。
こうすることでクラスタで割り切れるファイル分割構成になる。
(まだ続く)