破損メモリカードの復元(その3)

その2でFATの切り出しまで完了。

(2b)ディレクトリ情報の切り出し

FAT領域の次、ルートディレクトリはセクタ251〜282になる。
切り出してみると...どうみても壊れている。


FATも一部データが破損していたようだが、エクスプローラ上で文字化けしている第1の原因はこのルートディレクトリの破損のようだ。仕方ないのでルートディレクトリはあきらめる。


FATファイルシステムの場合は、サブディレクトリもルートディレクトリと同じ構成になっているが、ルートディレクトリと違って第1エントリには必ず「.」(自ディレクトリ)が、第2エントリには必ず「..」(親ディレクトリ)が登録されている。


なおディレクトリエントリは次のような構成になっている。1エントリは32バイトから構成されている。



オフセット

内容

00h〜07h

ファイル名(8文字)

08h〜0Ah

拡張子(3文字)

0Bh

属性

bit0...リードオンリー
bit1...隠しファイル
bit2...システムファイル
bit3...ボリュームID
bit4...ディレクト
bit5...アーカイブファイル

0Ch

reserved

0Dh

ファイル作成時刻(ミリ秒)

0Eh〜0Fh

ファイル作成時刻(時分秒)

10h〜11h

ファイル作成日付

12h〜13h

最終アクセス日

14h〜15h

開始クラスタ番号(上位)
FAT12,FAT16では常に0

16h〜17h

最終更新時刻

18h〜19h

最終更新日付

1Ah〜1Bh

開始クラスタ番号(下位)

1Ch〜1Fh

ファイルサイズ


ディレクトリを抜き出すために "2E 20 20 20 20 20 20 20 20 20 20" というバイナリ列で全セクタを検索する。これはサブディレクトリの第1エントリに必ず存在する(はず)の自ディレクトリ "." を表す。

C:\temp\070526復元\070526.000 : 00004000
C:\temp\070526復元\070526.000 : 00008000
C:\temp\070526復元\070526.000 : 0000C000
C:\temp\070526復元\070526.000 : 00010000
C:\temp\070526復元\070526.003 : 00388000
C:\temp\070526復元\070526.003 : 00390000
C:\temp\070526復元\070526.003 : 00394000
C:\temp\070526復元\070526.078 : 00354000
C:\temp\070526復元\070526.078 : 00360000
C:\temp\070526復元\070526.081 : 001F4000
C:\temp\070526復元\070526.081 : 00200000
C:\temp\070526復元\070526.081 : 00204000
12件見つかりました

これらは全てクラスタ境界(4000h単位)にあるので、全部サブディレクトリと推測される。クラスタ境界に無いものが見つかった場合は、関係ないデータの可能性が高いので基本的には無視する。


一つ一つ、ディレクトリデータとして切り出していく。
「.」「..」のエントリにも、開始クラスタ番号が格納されている。
「.」は自ディレクトリなので、今参照しているデータ自体のクラスタ番号を表しているはずである。もしクラスタ番号が一致しない場合は、参照しているディレクトリは、すでに削除された等、無効の可能性がある(それでも復元には役立つこともある)。
「..」は親ディレクトリのクラスタ番号を表しているので、この情報から親ディレクトリを知り、ディレクトリツリーを復元することができる。


C:\temp\070526復元\070526.000 : 00004000
クラスタ#0002h…0*256+00004000h/4000h+1)


. -D---- 0002
.. -D---- 0000
__AVP AD---- 0005


C:\temp\070526復元\070526.000 : 00008000
クラスタ#0003h…0*256+00008000h/4000h+2)


. -D---- 0003
.. -D---- 0000
?OL001 AD---- 0005
ファイル名の先頭1バイトが E5h の場合は、削除されたファイル/ディレクトリを示す。この場合は MOL001 というディレクトリが削除されたと推測される。


C:\temp\070526復元\070526.000 : 0000C000
クラスタ#0004h…0*256+0000C000h/4000h+2)


. -D---- 0004
.. -D---- 0003


C:\temp\070526復元\070526.000 : 00010000
クラスタ#0005h…0*256+00010000h/4000h+2)


. -D---- 0005
.. -D---- 0002
MARKLIST.ZDT A----- 03E1 00000008


C:\temp\070526復元\070526.003 : 00388000
クラスタ#03E3h…3*256+00388000h/4000h+1)


. -D---- 03E3
.. -D---- 0000
ORDER.NJB A----- 03E4 00000011
TRANSMRK.NJB ------ 4ED2 000012F8


C:\temp\070526復元\070526.003 : 00390000
クラスタ#03E5h…3*256+00390000h/4000h+1)


. -D---- 03E5
.. -D---- 0000
100NIKON -D---- 03E6


C:\temp\070526復元\070526.003 : 00394000
クラスタ#03E6h…3*256+00394000h/4000h+1)


. -D---- 03E6
.. -D---- 03E5
DSCN0584.JPG A----- 03E7 00215112
DSCN0585.JPG A----- 046E 00226AFC
DSCN0586.JPG A----- 04F9 00237CCF
DSCN0587.JPG A----- 0588 00234809
DSCN0588.JPG A----- 0671 00219675
DSCN0589.JPG A----- 069F 0021D938
DSCN0590.JPG A----- 0728 0020DFFF
DSCN0591.JPG A----- 07AD 0022B909
DSCN0592.JPG A----- 0839 0022F45B
DSCN0593.JPG A----- 08C6 002590C7
DSCN0594.JPG A----- 095E 00220218
DSCN0595.JPG A----- 09E8 00208D98
DSCN0596.JPG A----- 0A6C 00222611
DSCN0597.JPG A----- 0AF6 0022486F
DSCN0598.JPG A----- 0B81 00224320
DSCN0599.JPG A----- 0C0C 0025A45F
DSCN0600.JPG A----- 0CA4 00232C6E
DSCN0601.JPG A----- 0D32 0020A81C
DSCN0602.JPG A----- 0DB6 00236D4A
DSCN0603.JPG A----- 0E45 002568FC
DSCN0604.JPG A----- 0EDC 00238E0B
DSCN0605.JPG A----- 0F6C 00229580
DSCN0606.JPG A----- 0FF8 00234E28
DSCN0607.JPG A----- 1087 002244B9
DSCN0608.JPG A----- 1112 002299AD
DSCN0609.JPG A----- 119E 0021DF3D
DSCN0610.JPG A----- 1226 001FE99E
DSCN0611.JPG A----- 12A7 0018711F
DSCN0612.JPG A----- 1309 00157CEC
DSCN0613.JPG A----- 135F 00177BC7
DSCN0614.JPG A----- 13BE 0022CC19
DSCN0615.JPG A----- 144B 002396D4
DSCN0616.JPG A----- 14DB 0022F17D
DSCN0617.JPG A----- 1568 00205665
DSCN0618.JPG A----- 15EB 001EA9C6
DSCN0619.JPG A----- 1667 002262BE
DSCN0620.JPG A----- 16F2 0021449B
DSCN0621.JPG A----- 1779 002284B9
DSCN0622.JPG A----- 1805 0023E44A
DSCN0623.JPG A----- 1896 002314E3
DSCN0624.JPG A----- 1924 0023DB98
DSCN0625.JPG A----- 19B5 0022F9BC
DSCN0626.JPG A----- 1A42 0020E8A8
DSCN0627.MOV A----- 1AC7 017A01F6
DSCN0628.JPG A----- 20B1 0024D677
DSCN0629.JPG A----- 2146 0022439A
DSCN0630.JPG A----- 21D1 0022B4DC
DSCN0631.JPG A----- 225D 0021A5E6
DSCN0632.JPG A----- 22E5 00250788
DSCN0633.JPG A----- 237B 002243DA
DSCN0634.JPG A----- 2406 00235962
DSCN0635.JPG A----- 2495 0023995E
DSCN0636.JPG A----- 2525 00232A21
DSCN0637.JPG A----- 25B3 0023ED40
DSCN0638.JPG A----- 2644 00224339
DSCN0639.JPG A----- 26CF 001FD498
DSCN0640.JPG A----- 2750 00228337
DSCN0641.JPG A----- 27DC 001C594F
DSCN0642.JPG A----- 284F 0023F471
DSCN0643.JPG A----- 28E0 00215B4C
DSCN0644.MOV A----- 2967 00E6E13A
DSCN0645.MOV A----- 2D04 01AF105E
DSCN0646.MOV A----- 33C2 03A0149E
DSCN0647.MOV A----- 4244 0323621A
DSCN0648.MOV A----- 4ED3 00AAB63A


C:\temp\070526復元\070526.078 : 00354000
クラスタ#4ED6h…78*256+00354000h/4000h+1)


. -D---- 517E
.. -D---- 0000
ORDER.NJB A----- 5180 00000011
クラスタ番号が一致しない。


C:\temp\070526復元\070526.078 : 00360000
クラスタ#4ED9h…78*256+00360000h/4000h+1)


. -D---- 5181
.. -D---- 0000
100NIKON -D---- 5182
クラスタ番号が一致しない。


C:\temp\070526復元\070526.081 : 001F4000
クラスタ#517Eh…81*256+001F4000h/4000h+1)


. -D---- 517E
.. -D---- 0000
ORDER.NJB A----- 5180 00000011
TRANSMRK.NJB ------ 53F2 00000308


C:\temp\070526復元\070526.081 : 00200000
クラスタ#5181h…81*256+00200000h/4000h+1)


. -D---- 5181
.. -D---- 0000
100NIKON -D---- 5182


C:\temp\070526復元\070526.081 : 00204000
クラスタ#5182h…81*256+00204000h/4000h+1)


. -D---- 5182
.. -D---- 5181
DSCN0648.JPG A----- 5183 002674B8
DSCN0649.JPG A----- 521D 00268071
DSCN0650.JPG A----- 52B8 0027153A
DSCN0651.JPG A----- 5355 00273AB5


これらの情報からディレクトリツリーを復元する。

ルート
 +[0003] ???
   +[0004] ?OL001
 +[0002] ???
   +[0005] __AVP
 +[03E3] ???
 +[03E5] ???
   +[03E6] 100NIKON
 +[517E] ???
 +[8181] ???
   +[5182] 100NIKON

クラスタ#4ED6と#4ED9のサブディレクトリはクラスタ番号が一致しないため異常な状態と思われる。内容が似ているorまったく同じクラスタが存在するので、更新前のサブディレクトリ(削除済み)の可能性がある。
クラスタ#3-#4は、削除ディレクトリを含むので以前別の用途で使って削除したディレクトリと思われる。


ルートディレクトリが生きている場合はちゃんとルートディレクトリ直下のディレクトリ名もわかる。今回はルートディレクトリが残っていないので、正常なSDカードの情報を元にルートディレクトリ直下のディレクトリ名を推測する。

ルート

 +[0002] ???
   +[0005] __AVP
 +[03E3] MISC
 +[03E5] DCIM
   +[03E6] 100NIKON
 +[517E] MISC
 +[8181] DCIM
   +[5182] 100NIKON

クラスタ#2,#5も、以前別の用途で使って削除したサブディレクトリと思われる。正常なS10のSDカードには存在しない。
MISC、DCIM-100NIKONがダブっている。おそらく最初のものが破損してアクセスできなくなったために2つ目のものが作られたと考えられる。
また、1つめの100NIKON内にある(はずの)DSCN0648.MOVと2つ目の100NIKON内にある(はずの)DSCN0648.JPGは、ファイル名部分がダブっているため、DSCN0648.MOVに書込みを行っている最中または直後にカードデータの破損が発生した可能性がある。(デジカメのF/Wがファイル名のカウントアップに失敗している)


つづく!