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 的工作方式(意味着当其他文件需要磁盘空间时,它的大小减半)?
我做错了什么?
答案 0 :(得分:2)
这是预期的行为,as documented:
MAXIMUMSIZE
更改日志的目标最大大小(以字节为单位)。 更改日志可能会大于此值,但会在下一个NTFS文件系统检查点将其截断为小于此值。
不是试图预先确定大小,而是循环直到到达数据的末尾。
如果您使用的是FSCTL_ENUM_USN_DATA
控制代码,则当DeviceIoControl
的错误代码为ERROR_HANDLE_EOF
时,您已到达数据的末尾。
如果您使用FSCTL_READ_USN_JOURNAL
控制代码,当驱动程序返回的下一个USN(输出缓冲区开头的DWORDLONG)是您请求的USN时,您已到达数据的末尾(输入缓冲区中StartUsn
的值)。您需要将输入参数BytesToWaitFor
设置为零,否则驱动程序将等待将指定数量的新数据添加到日志中。