Seagate1TB内蔵ハードドライブのNTFSファイルシステムでMFTエントリを読み取るための高レベルの方法を探しています。プラットフォームはWindows7です。
ファイル名、ブロックサイズ、LBAを取得する必要があります。
これは、これを行うためのプログラムを作成する必要があるような特殊なタスクですか?
この情報には Defrag API。を介してアクセスできます。サードパーティのデフラグツールによって公開される可能性があります。最近のWindowsシステム(8.1は動作し、7はテストされていません)では、fsutil
を使用してクエリを実行できます。
C:\>fsutilファイルqueryextents example.txt VCN:0x0クラスター:0x2 LCN:0x18f85e
ファイル内のすべてのデータストリームのall情報をダンプする別のサブコマンドもあります。
C:\>fsutil volume filelayout example.exe *********ファイル0x01390000000008dd ********* ファイル参照番号:0x01390000000008dd ファイル属性:0x00000020:アーカイブ ... ストリーム::: $ FILE_NAME 属性:0x00000000:* NONE * フラグ:0x0000000c:常駐|クラスタが割り当てられていません サイズ:80 割り当てられたサイズ:80 ストリーム::: $ DATA(メインデータストリーム) 属性:0x00000000:* NONE * フラグ:0x00000000:* NONE * サイズ:1681920 割り当てられたサイズ:1683456 エクステント:1エクステント :1:VCN:0クラスター:411 LCN:8527618
両方のコマンドの出力で、「エクステント」(クラスターの連続範囲)ごとに、「仮想クラスター番号」(ファイルの先頭からのオフセット)、エクステント内のクラスター数、および「論理クラスター番号」(論理クラスター番号)を取得します。ボリュームの先頭からのオフセット)。
注:小さなファイル MFTベースレコードに収まる 、はMFTレコードに保存(「常駐」)されますエクステントはゼロになります。これらの場合、MFT自体を掘り下げるために他の方法を使用する必要があります。 (また、場合によっては、ファイルがsparseであり、ディスクに割り当てられているのはごく一部であり、残りはnullバイトと見なされるだけです。)
クラスターはファイルシステムレベルであるため、ブロックデバイスレベルのセクターに変換する必要があります;私のシステムにはクラスターごとに8つのセクターがあります:
C:\>fsutil fsinfo ntfsinfo c: ... セクターあたりのバイト数:512 クラスターあたりのバイト数:4096 ... C:\>set/a 0x18f85e *(4096/512) 13091568 C:\>セット/ a0x18f85e * 4096 6702882816
これは、HxDなどで\\.\C:
を開き、セクター13091568(またはバイト6702882816)でファイルの先頭を見つけることができることを意味します。