バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのファイル上シミュレーションの話。
ディスクイメージを読み解く。
今回はルートディレクトリエントリの位置特定。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ルートディレクトリエントリの位置特定

今回はルートディレクトリエントリを見るんだっけ?

そうだね。
ただ、どこにルートディレクトリエントリが配置されているのか特定する必要がある。

BPB(BIOS Parameter Block)みたいに、
「ここのセクタにあります!」
って感じじゃないの?

そうだねー。
そういう直接的な指定ではないなー。

でも、特定はできるってことはやり方があるってことだよね?

当然。
じゃないとどういうファイルがあって、内部の実データがどこにあるのかわからん。
ルートディレクトリエントリの位置特定に必要なパラメータ

まずは、必要なパラメータを列挙してみよう。
- MBRのPT_System
- これでBPB(BIOS Parameter Block)の位置が特定。
- 今回は63セクタ目
- BPB
- BPB_RsvdSecCnt
- BPBの後ろから始まる予約領域のセクタ数
- 今回は65セクタ
- BPB_FATSz32
- FATの数。
- 今回は1個
- BPB_NumFATs
- FAT1個あたりのセクタ数
- 今回は0x400=1024セクタ
- BPB_RsvdSecCnt
- ルートディレクトリエントリ
- BPBと予約領域とFAT領域の直後に配置

と、いうことは、
BPBと予約領域とFAT領域が分かれば、結果として
ルートディレクトリエントリが分かるってことか!

そういうことだねー。
ルートディレクトリエントリの位置特定のため領域を並べてみる。

ざっと領域を並べてみよう。
- MBR:0セクタ目
- BPB:63セクタ目
- 予約領域:64セクタから65セクタ分→64~127セクタ
- FAT領域:128セクタ目から1024セクタ分→ 128~1151セクタ
- ルートディレクトリエントリ:1152セクタ目から

ほーう?

絵で詰み上げて見るとこんな感じになるな。


あー。なるほど。
こういう積みあがり方をしていたのか!

というわけで、ルートディレクトリエントリの位置がわかったところで
次回はそこの内容を見ていこう。
まとめ

まとめだよ。
- ルートディレクトリエントリを直接特定できるパラメータはない。
- 以下パラメータが必要。
- PT_System、BPB_RsvdSecCnt、BPB_FATSz32、BPB_NumFATs。
- MBR、BPB、予約領域、FAT領域を積み上げていくとルートディレクトリエントリの位置が分かる。
バックナンバーはこちら。
コメント