web-dev-qa-db-ja.com

USBハードドライブ(NTFS、1TB)でMFTを読み取る方法は?

Seagate1TB内蔵ハードドライブのNTFSファイルシステムでMFTエントリを読み取るための高レベルの方法を探しています。プラットフォームはWindows7です。

ファイル名、ブロックサイズ、LBAを取得する必要があります。

これは、これを行うためのプログラムを作成する必要があるような特殊なタスクですか?

3
Thomas Matthews

この情報には 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)でファイルの先頭を見つけることができることを意味します。

5
user1686