プログラマーの皆さん、こんにちは。
WinIoCtl関数を使用して、 NTFSパーティションのUSNジャーナルの内容をダンプしようとしています。* USN_JOURNAL_DATA *構造体があり、最大サイズが512MBであることを示しています。私はそれをfsutilがそれについて言わなければならないことと比較しました、そしてそれは同じ値です。
次に、各エントリを*USN_RECORD*構造体に読み込む必要があります。これは、0から始まり、ジャーナルの最大サイズ(4096(クラスターサイズ)単位)に達するforループで行います。同じサイズのバッファ内の各4096バイトを読み取り、そこからすべてのUSN_RECORD構造体を読み取りました。
最近のレコードが欠落しているように見えることを除いて、すべてが順調に進んでおり、ファイル名も正しく、タイムスタンプも、理由もすべてです。パーティションに新しいファイルを作成し、そこに何かを書き込んでから、ファイルを削除します。アプリを再度実行しましたが、レコードが表示されません。ジャーナルの最大サイズを超えて読み続けた場合にのみ、レコードが表示されることがわかりました。どうしてそれができるのでしょうか?
現時点では、ジャーナルのデータの先頭から最大サイズ+割り当てデルタ(どちらも* USN_JOURNAL_DATA *構造に格納されている値)まで読んでいますが、これは正しいとは思わず、徹底的に見つけるのに苦労しています。これに関連する情報。
誰かがこれを説明できますか?USNジャーナルの周りにMFTの動作と同様のバッファがありますか(他のファイルにディスクスペースが必要な場合はサイズが半分になることを意味します)?
私は何が間違っているのですか?