2

Windows が休止状態になる準備をしているときにラップトップを落とした結果、ハード ドライブでヘッド クラッシュが発生しました。(次回は自由落下センサーを備えたハードドライブやラップトップを入手するように教えてくれます。) とにかく、SpinRiteを実行してデータを回復しようとすると、ディスク上のすべてのスペアセクターがすべて使用されてしまいます。これまでの回復可能なセクター。SpinRite は現在も進行中ですが、使用するスペア セクタがなくなるため、すべての不良セクタがどこにあるかを教えてもらう以外は、無駄な作業になると思います。

いずれにせよ、ハード ドライブからデータを回収するためのアプリケーションを作成する予定です。過去の最適化への取り組みから、FSCTL_GET_RETRIEVAL_POINTERS を使用して、特定のファイルの論理クラスター番号を把握できることを知っています。

その実際のクラスターのセクターを読み取るにはどうすればよいですか? ディスク、ファイル、およびボリュームのデバイス制御コードの MSDN のリストを掘り下げてみましたが、実際のクラスター データに到達する方法として思い浮かんだものは何もありませんでした。

その低レベルでわざわざ読もうとする必要さえありませんか?代わりに SetFilePointer() および ReadFile() 呼び出しを実行して、適切なクラスター サイズのオフセットをファイルに取得し、クラスター サイズのチャンクを読み取る必要がありますか?

読み取ろうとしているファイルに不良セクタがある場合、NTFS はファイル全体を不良としてマークし、今後そのファイルにアクセスできなくなりますか? その場合、NTFS にファイルを不良または無効としてマークしないようにするにはどうすればよいですか? (HD には再マッピングするスペア セクタがなくなっていることに注意してください。)

*nix の知識を振り払って、 /dev/ から読み取る方法を理解する必要がありますか?

更新: 私は自分の質問に対する答えを見つけました。:-) 解決策は、ファイル ハンドルではなくボリューム ハンドルで SetFilePointer() と ReadFile() を実行することです。

4

1 に答える 1

2

私は自分の質問に対する答えを見つけました。:-)解決策は、ファイルハンドルではなく、ボリュームハンドルでSetFilePointer()とReadFile()を実行することです。

于 2010-03-01T06:58:29.003 に答える