1

プログラマーの皆さん、こんにちは。

WinIoCtl関数を使用して、 NTFSパーティションのUSNジャーナルの内容をダンプしようとしています。* USN_JOURNAL_DATA *構造体があり、最大サイズが512MBであることを示しています。私はそれをfsutilがそれについて言わなければならないことと比較しました、そしてそれは同じ値です。

次に、各エントリを*USN_RECORD*構造体に読み込む必要があります。これは、0から始まり、ジャーナルの最大サイズ(4096(クラスターサイズ)単位)に達するforループで行います。同じサイズのバッファ内の各4096バイトを読み取り、そこからすべてのUSN_RECORD構造体を読み取りました。

最近のレコードが欠落しているように見えることを除いて、すべてが順調に進んでおり、ファイル名も正しく、タイムスタンプも、理由もすべてです。パーティションに新しいファイルを作成し、そこに何かを書き込んでから、ファイルを削除します。アプリを再度実行しましたが、レコードが表示されません。ジャーナルの最大サイズを超えて読み続けた場合にのみ、レコードが表示されることがわかりました。どうしてそれができるのでしょうか?

現時点では、ジャーナルのデータの先頭から最大サイズ+割り当てデルタ(どちらも* USN_JOURNAL_DATA *構造に格納されている値)まで読んでいますが、これは正しいとは思わず、徹底的に見つけるのに苦労しています。これに関連する情報。

誰かがこれを説明できますか?USNジャーナルの周りにMFTの動作と同様のバッファがありますか(他のファイルにディスクスペースが必要な場合はサイズが半分になることを意味します)?

私は何が間違っているのですか?

4

1 に答える 1

3

文書化されているように、これは予想される動作です。

最大サイズ

変更ジャーナルの目標最大サイズ (バイト単位)。変更ジャーナルはこの値よりも大きくなる可能性がありますが、次の NTFS ファイル システム チェックポイントで切り捨てられ、この値未満になります。

サイズを事前に決定しようとする代わりに、データの最後に到達するまでループします。

制御コードを使用しているFSCTL_ENUM_USN_DATA場合、からのエラー コードが の場合、データの終わりに達していDeviceIoControlますERROR_HANDLE_EOF

制御コードを使用している場合はFSCTL_READ_USN_JOURNAL、ドライバーによって返される次の USN (出力バッファーの先頭にある DWORDLONG) が要求した USN (StartUsn入力バッファー内の の値) であるときに、データの最後に達しています。入力パラメーターをゼロに設定する必要がありBytesToWaitForます。そうしないと、ドライバーは指定された量の新しいデータがジャーナルに追加されるまで待機します。

于 2013-02-26T21:47:08.680 に答える