1

ここで説明されているものと同様の NTFS インデックスとジャーナルを読み取るプログラムを作成しました: http://ejrh.wordpress.com/2012/07/06/using-the-ntfs-journal-for-backups/
かなりうまく機能します。
通常のジャーナル イベントUSN_REASON_CLOSEに加えてUSN_REASON_FILE_CREATEUSN_REASON_FILE_DELETEなどの理由でイベントを受信して​​いUSN_REASON_HARD_LINK_CHANGEます。このイベントに応じてディレクトリ インデックスを更新できるようにしたいのですが、それに関する情報が見つかりません。唯一のドキュメントは次のとおりです。

NTFS ファイル システムのハード リンクが、ファイルまたはディレクトリに対して追加または削除されます。POSIX ハード リンクと同様に、NTFS ファイル システム ハード リンクは、同じファイルまたはディレクトリを参照するいくつかのディレクトリ エントリの 1 つです。

これは何を意味するのでしょうか?ハードリンクはどこで作成されましたか? それとも削除されましたか?何が起こったのかについての詳細情報を得るにはどうすればよいですか?

4

2 に答える 2

1

これが古いことは知っていますが、関連する問題を調査しているときにこれに出くわしました。私が見つけたものは次のとおりです。ハードリンクは、USN を読むときに複雑な要素です。作成されたハードリンクを介して行われた変更によって、単一のファイル参照番号への変更を説明するジャーナル エントリを取得できます。一般に、元の質問に対して、ハードリンクは、単一のファイルにアクセスできる代替ディレクトリ エントリです。したがって、ファイルのすべての特性が各リンクで共有されます (名前と親ファイルの参照番号を除く)。技術的には、どのエントリがオリジナルでどれがリンクかはわかりません。

微妙な違いが存在し、(DeviceIOControl と Fsctl_Enum_Usn_Data を使用して) マスター ファイル テーブルにクエリを実行すると明らかになります。クエリは、存在するリンクの数に関係なく、代表的なファイルを 1 つだけ返します。NtQueryInformationFile を使用してリンクを照会し、FILE_HARD_LINK_INFORMATION を照会できます。MFT クエリによって返されたエントリをメイン エントリ、NtQueryInformationFile から返されたアイテムをリンクと考えています。他にはほとんどありません。

ハードリンクの 1 つが移動または名前変更されると、問題が発生することに注意してください。この場合、名前変更または移動のジャーナル エントリには、影響を受けるリンクのファイル名と親ファイルの参照番号が反映されます。要約の「クローズ時」レコードのみを要求すると、問題が発生します。このような場合、USN_REASON_RENAME_OLD_NAME レコードが表示されることはありません...その USN エントリは関連付けられた REASON_CLOSE を取得しないためです。このヒントがないと、どのリンクの名前または場所が変更されたかを簡単に判断できません。Read_Usn_Journal_Data_V0 で ReadOnlyOnClose を 0 に設定して usn を読み取る必要があります。これはかなりおしゃべりなクエリですが、これがないと、変更を特定のリンクまたは別のリンクに正確に関連付けることができません。

于 2014-12-23T21:41:18.910 に答える
0

USN の場合と同様に、適切に機能させるには試行錯誤が必要になると思います。これらの観察/推測が役立つことを願っています:

ファイルへの最後のハード リンクが削除されると、そのファイルは削除されます。そのため、最後のハード リンクが削除されている場合は、USN_REASON_HARD_LINK_CHANGE ではなく USN_REASON_FILE_DELETE が表示されます。各参照番号は、ハードリンクではなく、ファイル(またはディレクトリですが、NTFSはディレクトリへの複数のハードリンクをサポートしていません)を参照していると思います。そのため、少なくともイベントが記録された直後は、ファイル参照番号は引き続き有効であり、ファイルの別の名前を指している必要があります。

ファイルがまだ存在する場合は、参照番号でFindFirstFileNameW検索し、友人と使用して現在のリンクを見つけることができます。これを問題のイベント レコードと関連するその後のイベントと比較すると、十分な情報が得られます。ファイル システムの以前の状態に関する十分な情報がない場合、削除されたハード リンクを特定できない場合があります。それがあなたにとって重要かどうかはわかりません。

ファイルが存在しなくなった場合でも、ファイルが削除された USN レコードによって識別できるはずです。繰り返しになりますが、関連するすべてのイベントを考慮に入れ、以前の状態に関する十分な情報があれば、順序ではないにしても、起こったことのほとんどを再構築できるはずです。

これよりもうまくいく可能性があります。イベント レコードのファイル名および/または ParentFileReference 番号は、ファイルへの任意のリンクではなく、作成または削除されたハード リンクを参照する可能性があります。この場合、特定のイベントが作成または削除であったかどうかを除いて、一連のイベントに関するすべての関連情報が得られます。これは、ファイルの現在の状態を調べて逆方向に作業することで解決できるはずです。記録。

追加情報が含まれている可能性のある近くの変更レコードを既に探していると思いますか? たとえば、ハード リンクが作成されたときに USN_REASON_RENAME_NEW_NAME レコードが生成されたり、ハード リンクが削除されたときに USN_REASON_RENAME_OLD_NAME レコードが生成されたりしませんか? または、USN_REASON_HARD_LINK_CHANGE レコードを対にして、1 つはファイル用、もう 1 つは影響を受けるファイルへのハード リンクを含むディレクトリ用ですか? (希望的観測だと思いますが、見て損はありません!)

テスト目的で、コマンドを使用してハード リンクを作成できますmklink

于 2013-09-11T04:29:43.087 に答える