パステーブルは、単純に言うと パステーブルレコードというディレクトリの情報を記した構造体をつなげて並べたものです。
一つのパステーブルレコードは一つのディレクトリに対応し、 順番に番号が割り振られます。 ルートディレクトリが 1 です。 子ディレクトリのパステーブルレコードは、親ディレクトリのパステーブルレコードの番号を持っています。
パステーブルレコードは以下の規則に従って並べられます。
1. ディレクトリ階層順。ルートから順に、親が前、子が後。
2. 同じ階層では、親ディレクトリの番号が若い方から先。
3. 親が同じならば、名前(文字コード)順。
パステーブルは、L型とM型をそれぞれ用意します。 L型では パステーブルレコードの Location of Extent と Parent Directory Number をリトルエンディアンで、 M型ではビッグエンディアンで記述します。
また、もう一つづつ予備のパステーブルを用意することも出来ます。
個々のパステーブルレコードの構造は、次のとおりです。
位置 | 大きさ | 型 | 名称 | 内容 |
0 | 1 | unsigned char | Length of Directory Identifier (LEN_DI) | ディレクトリ識別子の長さ |
1 | 1 | unsigned char | Extended Attribute Record Length | 拡張属性レコードの長さ |
2〜5 | 4 | unsigned long (L/M) | Location of Extent | ディレクトリの先頭位置 [LBN] |
6〜7 | 2 | unsigned short (L/M) | Parent Directory Number | 親ディレクトリの番号 |
8〜(8+LEN_DI-1) | LEN_FI | char[LEN_FI] | File Identifier | ディレクトリ識別子 |
8+LEN_DI | 1 | unsigned char | Padding Field | =0 全体を偶数にするため |
Extended Attribute Record Length は、無ければ 0x00 です。
ディレクトリ識別子は、ディレクトリレコードと同様に、 ルートディレクトリでは1バイトの 0x00、 それ以外の一般的なディレクトリにはd/d1文字を使用します。
ディレクトリ識別子の長さが奇数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが偶数ならば、必要ありません。