fteのMFTタブではNTFS内の$MFTファイルを参照して各ファイル/フォルダのタイムスタンプをパースします。
MFTエントリ
NTFSの先頭には$Bootファイルがあり、1クラスタのセクタ数や$MFTファイルの開始位置などの情報が格納されています。$MFTファイルは固定サイズのエントリで構成されており、原則1エントリで1つのファイル、フォルダ(以降オブジェクトと表現)のメタデータを管理します。
各エントリの先頭は必ずシグネチャ"FILE"ではじまるヘッダ領域があり、その中にリンク数、フラグ(ファイル/フォルダ/未使用)、IDなどの情報が含まれます。ヘッダの後は属性情報で構成されており、様々な属性によって構造は様々です。
通常のオブジェクトに相当するエントリは、必ず$STANDARD_INFORMATION属性($SI)と$FILE_NAME属性($FN)を持っています。オブジェクトによっては1つのエントリで2つ以上の$FNを持ちます。これはDOS名前空間に収まらない(名前が8文字を超える、拡張子が3文字を超える、記号を含む、など)場合や、そのオブジェクトに対するハードリンクが作成された場合です。
$SI, $FNのタイムスタンプ
$SIと$FNのどちらの属性も、上図に示すように4種類のタイムスタンプを保持しています。Windowsでは通常$SI内のタイムスタンプが参照、更新等の管理対象であり、$FNのタイムスタンプの定義については不明です。
また、Windows Vista以上ではデフォルトで「最終アクセス日時(atime)は更新しない」というレジストリ値(NtfsDisableLastAccessUpdate)が有効になっているため、atimeは本来の意味合いとは異なるタイムスタンプとなります。
NtfsDisableLastAccessUpdate
http://technet.microsoft.com/ja-jp/library/cc758569(v=ws.10).aspx
以下の表はWindows 7で$SI/$FNのタイムスタンプの挙動を調べた結果です。
タイムスタンプの更新タイミング(Windows 7)
$SI crtime | $SI mtime | $SI ctime | $SI atime | $FN crtime | $FN mtime | $FN ctime | $FN atime | |
---|---|---|---|---|---|---|---|---|
作成 | x | x | x | x | x | x | x | x |
参照 | x1 | |||||||
更新 | x | x | x1 | x3 | x1 | x1 | x1 | |
ドライブ内移動 | x | x2 | x2 | x2 | x2 | |||
ドライブ間移動 | x1 | x1 | x | x | x | x | x | |
コピー | x | x | x | x | x | x | x | |
削除 |
- x - 処理時点に更新
- x1 - 特定の条件/方法によって更新
- x2 - 対応する$SIのタイムスタンプをセット
- x3 - 特定の条件/方法によって対応する$SIのタイムスタンプをセット
検証の結果、atimeは他の3種類のタイムスタンプと同じタイミングで更新されることがあり、$FNのタイムスタンプは4種類ともに同じ値で更新されることがある、一部の処理によってその時点で$SIが持っているタイムスタンプを引き継ぐ、などがわかります。
fteの処理内容
fteのMFTタブで、Drive項目にNTFSボリュームを指定して実行するかファイル/フォルダをドラッグ&ドロップすると、パースして結果を表示します。以下が実行結果の例です。
出力する項目の内容は以下の通りです。
- name - ファイル名
- fixup - シーケンス値(エントリの更新回数に相当)
- id, pid - MFT ID、 親フォルダのMFT ID
- flag - フラグ(File: ファイル, Folder: フォルダ, [D]File: 削除ファイル, [D]Folder削除フォルダ)
- nspace - ファイル名の名前空間(POSIX, DOS, Win32, Win32/DOS)
- links -リンク数
- crtime, mtime, ctime, atime - $SIのタイムスタンプ(作成、更新、エントリ更新、アクセス日時)
- crtime(FN), mtime(FN), ctime(FN), atime(FN) $FNのタイムスタンプ(作成、更新、エントリ更新、アクセス日時)
- remark - $SI, $FNの8タイムスタンプのソート(昇順)
fteはエントリ内に複数の$FNがある場合、$FNの数分だけ結果を別々に出力します。従ってfteの結果に同じIDの行が複数あることがあります。ただし例外として、エントリ内の$FNが2つでそれらがDOSとWin32、かつタイムスタンプが同値であった場合は、結果を2行出力することは冗長であるため、nspace項目を"DOS, Win32"として1行にまとめます。
remarks項目は$SI, $FNの計8つのタイムスタンプを古い順に並ベた結果を表示しています。