2013-04-07 106 views
1

我在枚举更改日记记录时遇到问题。枚举所有可用的更改日记记录

//my params  
READ_USN_JOURNAL_DATA read_journal_data; 
read_journal_data.StartUsn = ... //next USN 
read_journal_data.ReasonMask = 0xFFFFFFFF; 
read_journal_data.ReturnOnlyOnClose = FALSE; 
read_journal_data.UsnJournalID = ... //ID of current journal 
read_journal_data.BytesToWaitFor = 9000; 
read_journal_data.Timeout = 5; //5 seconds 

BOOL result = DeviceIoControl(this->volume_handle_, FSCTL_READ_USN_JOURNAL, 
     &read_journal_data, sizeof(read_journal_data), this->change_journal_data_buffer_, 
     this->change_journal_data_buffer_, &this->valid_bytes_in_buffer_, NULL); 

正如你看到的,Timeout是非零和BytesToWaitFor不为零了。 我了解到,当FSCTL_READ_USN_JOURNAL通话到达更改日志的末尾时,它必须等待Timeout秒,然后返回BytesToWaitFor范围内的所有可用记录(0或更多) 。然而,出于某种原因,我正在观察完全不同的行为:DeviceIoControlFSCTL_READ_USN_JOURNAL和其他列出的参数可能需要几分钟 - 直到文件系统中发生了一些NEW更改。 为什么READ_USN_JOURNAL_DATA.Timeout不限制FSCTL_READ_USN_JOURNAL请求的持续时间?

回答

2

它的行为完全是怎么想的行为,要具体:

在这两种情况下,追加到变化日志中的任何新数据被处理的超时时间之后。如果仍然没有要从指定组返回的记录,则重复超时期限。在此模式下,FSCTL_READ_USN_JOURNAL保持未完成,直到至少返回一条记录或取消I/O。

MSDN, section Timeout

+0

谢谢...我根本没有理解这些参数的目的。其他信息可以在这里找到(http://www.microsoft.com/msj/0999/journal/journal.aspx)(超时和BytesToWaitFor) – akekir 2013-04-07 16:18:36

+0

是的,这是对NTFS日志的很好介绍。无论如何,关于NTFS日志的信息非常全面:http://msdn.microsoft.com/en-us/library/aa363798.aspx – 2013-04-07 16:54:14