枚举所有可用的更改日志记录

时间:2013-04-07 10:41:50

标签: winapi file-io ntfs watch deviceiocontrol

我在枚举更改日记记录时遇到问题。

//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秒然后返回全部(0或更多) BytesToWaitFor范围内的可用记录。但是,出于某种原因,我正在观察完全不同的行为:DeviceIoControl FSCTL_READ_USN_JOURNAL和其他列出的参数可能需要几分钟 - 直到文件系统中发生了一些新的更改。 为什么READ_USN_JOURNAL_DATA.Timeout不会限制FSCTL_READ_USN_JOURNAL请求的持续时间?

1 个答案:

答案 0 :(得分:2)

它的行为完全符合它的行为,具体而言:

  

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

请参阅MSDN, section Timeout