PC-98 HDD

PC-98 の HDD を読む

パーティションテーブルの構造

パーティションテーブルの構造は、FreeBSD のカーネルソースに構造体の定義があるので参考にする。(FreeBSD は PC-98 対応版が 2008 年頃までリリースされていたため、PC-98 用のコードが残っている。)

/sys/sys/diskpc98.h より:

struct pc98_partition {

unsigned char dp_mid;

unsigned char dp_sid;

unsigned char dp_dum1;

unsigned char dp_dum2;

unsigned char dp_ipl_sct;

unsigned char dp_ipl_head;

unsigned short dp_ipl_cyl;

unsigned char dp_ssect; /* starting sector */

unsigned char dp_shd; /* starting head */

unsigned short dp_scyl; /* starting cylinder */

unsigned char dp_esect; /* end sector */

unsigned char dp_ehd; /* end head */

unsigned short dp_ecyl; /* end cylinder */

unsigned char dp_name[16];

};

HDD イメージをダンプすると、以下のように 512 バイト目からパーティションテーブルが始まっていることが確認できる。

00000200 a0 a1 00 00 00 00 01 00 00 00 01 00 00 00 a2 03 |................|

00000210 57 69 6e 64 6f 77 73 20 33 2e 31 20 20 20 20 20 |Windows 3.1 |

00000220 a1 a1 00 00 00 00 a3 03 00 00 a3 03 00 00 7b 06 |..............{.|

00000230 4d 53 2d 44 4f 53 20 36 2e 32 30 20 20 20 20 20 |MS-DOS 6.20 |

00000240 a0 a1 00 00 00 00 7c 06 00 00 7c 06 00 00 34 1a |......|...|...4.|

00000250 57 69 6e 64 6f 77 73 20 39 35 20 20 20 20 20 20 |Windows 95 |

00000260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|

この場合パーティションは以下の 3 つある:

    • "Windows 3.1" : 開始 C:H:S = 0x0001:0x00:0x00 終了 C:H:S = 0x03a2:0x00:0x00

    • "MS-DOS 6.20" : 開始 C:H:S = 0x03a3:0x00:0x00 終了 C:H:S = 0x067b:0x00:0x00

    • "Windows 95" : 開始 C:H:S = 0x067c:0x00:0x00 終了 C:H:S = 0x1a34:0x00:0x00

ヘッド数とセクタ数の推定

この HDD のパーティションはすべて FAT16 フォーマットであることが事前に分かっていたため、HDD イメージをダンプしていくと、FAT16 パーティションらしきものが見つかる。

0004ec00 eb 4c 90 49 43 4d 20 35 2e 30 30 00 02 10 01 00 |.L.ICM 5.00.....|

0004ec10 02 00 0c 00 00 f8 90 00 7e 00 05 00 76 02 00 00 |........~...v...|

0004ec20 ac f0 08 00 80 00 29 9b 25 3b 51 4d 53 2d 57 69 |......).%;QMS-Wi|

0004ec30 6e 64 6f 77 73 00 46 41 54 31 36 20 20 20 76 02 |ndows.FAT16 v.|

ヘッド数とセクタ数の積は 0x4ec00/512=630 となる。これによりヘッド数 63、セクタ数 10 と推定できるが、この HDD のパーティションはすべてヘッド番号 0、セクタ番号 0 から始まっているため、データ位置を見つけるだけであれば、ヘッド数とセクタ数の積が分かれば良い。

パーティションのマウント (FreeBSD)

FreeBSD は PC-98 のパーティションを解釈することができるため、HDD イメージファイルを以下のような方法によりマウントすることができる。

    1. kldload geom_part_pc98

    2. mdconfig -a -t vnode -f filename.img -x 10 -y 63

    3. mount -t msdosfs /dev/md0 /mnt

HDD を直接接続しても、ジオメトリがあっていれば、geom_part_pc98 によりパーティションの認識に成功するはずである。

パーティションのマウント (Linux)

Linux は PC-98 のパーティションを認識しないため、オフセットを自分で計算して指定することによりマウントできる。例えば、上の例で 2 番目のパーティションをマウントする場合:

    1. 2 番目のパーティションの開始位置を求める。 0x03a3 * 0x4ec00 = 300303360

    2. mount -o loop,offset=300303360,codepage=932,iocharset=euc-jp,nocase -r filename.img /mnt