ザビタン開発日記
2009 | 01
2008 | 01 | 02 | 06 | 12
2007 | 10 | 11 | 12
11月 11 (日曜日) 2007
10:53
過ちは青春さ! 人生の肥やしさ!
 
(でも肥やしあげすぎると根っこが腐っちゃうんだよね・・・orz)

えー! そんなわけでありまして! 再び正しい知識で再検証!

  1. ルートディレクトリからファイル名を探し、ファイルを探す
  2. ファイルが見つかったら、例の2バイトを読むことでファイル開始位置が解る
  3. この値は 論理セクタ位置 = データ領域開始位置 - 2 + ファイル開始位置 なんて式で論理セクタに変換できる
  4. 末尾の4バイトを読む。これはサイズを表しているので、これが1セクタ以下ならファイルは一個のセクタに収まっているので終了。
  5. すこしでも大きい場合、多セクタにつながっているのでFAT領域を読んで追いかける
  6. FAT領域は3バイトで2つを作っている(圧縮?)
  7. 先ほどの開始位置と照らし合わせる。それによって次につながっている論理セクタの位置がわかる
  8. この値がFF8〜FF9になれば、そこでファイルは終了

さて、じゃ、FAT領域の解読。例の表に当てはめると・・・

ウチのFAT(論理セクタ1)の状態

FAT番号 00 01 02 03 04 05 06 07
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x00000200 F0 FF FF 03 40 00 05 60 00 07 80 00
FAT番号 08 09 0A 0B 0C 0D 0E 0F
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x0000020D 09 A0 00 0B C0 00 0D E0 00 0F 00 01
FAT番号 10 11 12 13 14 15 16 17
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x0000021A 11 20 01 13 40 01 15 60 01 17 80 01
FAT番号 18 19 1A 1B 1C 1D 1E 1F
┌──┐ ┌──┐ ┌──┐ ┌──┐
0x00000227 19 A0 01 1B C0 01 1D E0 01 1F 00 02

こういうふうになるわけか。そうするとこんな式でいいのかな?

if ( 開始ナンバー % 2 ==0 ) //偶数奇数で分ける
{
FAT頭 = 開始ナンバー * 3 / 2 + 0x00000200;
FAT尻 = FAT頭 + 2;
//ここで例に並べ替えを行い、二つの数値を取り出す//
次FAT = 1番目の値
}
else
{
FAT頭 = (開始ナンバー - 1) * 3 / 2 + 0x00000200 ;
FAT尻 = FAT頭 + 2;
//ここで例に並べ替えを行い、二つの数値を取り出す//
次FAT = 2番目の値
}

・・・この式で行くと、例のeuc.txtのファイル開始ナンバー(0x00AB)の情報が書いてあるFAT番地は・・・・2FF !?

FAT番号 AA AB
┌──┐
0x000002FF FF FF FF

こうなるはず! 2番目の数字を取り出すと・・・FFF !?
つまりファイルはこれで終了!!!
むむむ!? これでほんとにいいのかなぁ。(先のポカがあるから心配だ・・・
 
30日を過ぎたBlogにはコメントできません。

Referer  (1)
(1) 2 3 4 5 6 7 8 9 10 » 

PopnupBlog V3 Denali created by Bluemoon inc.