1

各位程序员好。

我正在尝试使用WinIoCtl函数转储NTFS分区的 USN 日志的内容。我有 *USN_JOURNAL_DATA* 结构,它告诉我它的最大大小为 512 MB。我已经将它与fsutil所说的进行了比较,它的价值是相同的。

现在我必须将每个条目读入 *USN_RECORD* 结构。我在一个从 0 开始的 for 循环中执行此操作,并以 4096(簇大小)为增量达到日志的最大大小。我在相同大小的缓冲区中读取每个 4096 字节,并从中读取所有 USN_RECORD 结构。

一切都很好,文件名正确,时间戳,原因,一切,除了我似乎错过了一些最近的记录。我在分区上创建了一个新文件,在其中写入了一些内容,然后删除了该文件。我再次运行该应用程序并没有出现记录。我发现只有当我继续阅读超过期刊的最大尺寸时才会出现记录。怎么可能?

目前我正在从期刊数据的开头读取到最大大小+分配增量(两者都是存储在 *USN_JOURNAL_DATA* 结构中的值),我不认为它是正确的,我很难找到彻底与此相关的信息。

有人可以解释一下吗?USN 日志周围是否有类似于MFT工作方式的缓冲区(这意味着当其他文件需要磁盘空间时,它的大小减半)?

我究竟做错了什么?

4

1 回答 1

3

这是预期的行为,如记录

最大尺寸

更改日志的目标最大大小,以字节为单位。更改日志可以增长到大于此值,但随后在下一个 NTFS 文件系统检查点被截断到小于此值。

不要试图预先确定大小,而是循环直到到达数据的末尾。

如果您正在使用控制代码,则当错误代码为时FSCTL_ENUM_USN_DATA,您已到达数据末尾。DeviceIoControlERROR_HANDLE_EOF

如果您使用FSCTL_READ_USN_JOURNAL控制代码,则当驱动程序返回的下一个 USN(输出缓冲区开头的 DWORDLONG)是您请求的 USN(StartUsn输入缓冲区中的值)时,您已到达数据末尾。您需要将输入参数BytesToWaitFor设置为零,否则驱动程序将等待指定数量的新数据添加到日志中。

于 2013-02-26T21:47:08.680 回答