USN Journal of the NTFS文件系统能否大于声明的大小?

时间:2013-02-26 12:11:22

标签: windows ntfs journaling usn

Hello其他程序员。

我正在尝试使用 WinIoCtl 函数转储USN Journal of NTFS 分区的内容。我有* USN_JOURNAL_DATA *结构,告诉我它的最大大小为512 MB。我已将其与 fsutil 所说的相提并论,并且它的价值相同。

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

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

目前我正在阅读期刊数据的开头到最大尺寸 + 分配增量(两者都是存储在* USN_JOURNAL_DATA *结构中的值)我不相信这是正确的,我很难找到与此相关的全面信息。

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

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是预期的行为,as documented

  

MAXIMUMSIZE

     

更改日志的目标最大大小(以字节为单位)。 更改日志可能会大于此值,但会在下一个NTFS文件系统检查点将其截断为小于此值。

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

如果您使用的是FSCTL_ENUM_USN_DATA控制代码,则当DeviceIoControl的错误代码为ERROR_HANDLE_EOF时,您已到达数据的末尾。

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