GUID Partition Table を読む
GPT(GUID Partition Table)のパーティションエントリを読むコードを書きました。
GPTの構成はざっくりと以下のとおり。 (詳細はWikiを参照のこと。)
- LBA0は事故防止のため従来のMBR。
- LBA1はパーティションテーブルヘッダー。ディスクのGUIDやヘッダー自身の位置、チェックサム、セカンダリGPTの位置を持っている。
- LBA2 - LBA33はパーティションエントリ。各パーティションの位置やタイプを持っている。また1つのLBAにつき4つのエントリが書き込まれている。したがって最大128エントリ。
- ディスク末尾にはセカンダリGPTがバックアップとして書き込まれている。プライマリGPTのチェックサムが不正だった場合に使用される。
今回はMBRやパーティションテーブルヘッダーの解析は行わず、パーティンションエントリに対象を絞りました。パーティションエントリのサイズは128 bytesで先頭からの構成は以下のとおり。
- 16 bytes : パーティションタイプを示すGUID
- 16 bytes : パーティションのIDとなるGUID
- 8 bytes : 先頭のLBA、リトルエンディアン
- 8 bytes : 最後のLBA、リトルエンディアン
- 8 bytes : 属性フラグ
- 72 bytes : パーティション名、UTF-16LE
パーティションエントリのタイプを示すGUIDの一覧は下記のページを参考にしました。 日本語版のWikiには欠落しているものがいくつかありました。
GUIDは 00000000-0000-0000-0000-000000000000 という形式ですが、最初の3つの項目はリトルエンディアンで書き込まれているため注意が必要です。
先頭/最後のLBAからディスク上の位置やサイズが把握できます。
属性フラグとパーティション名は解析しませんでした。
出力結果は以下。
お目当ての FreeBSD BOOT の位置がわかりました。