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

Winapi 枚举所有可用的更改日志记录,winapi,file-io,ntfs,watch,deviceiocontrol,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

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

//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\u READ\u USN\u JOURNAL
调用到达更改日志的末尾时,它必须等待
超时时间
秒,然后返回全部(0或更多)
BytesToWaitFor
范围内的可用记录。然而,由于某些原因,我观察的是完全不同的行为:
DeviceIoControl
带有
FSCTL\u READ\u USN\u JOURNAL
和其他列出的参数可能需要几分钟时间,直到文件系统中发生一些新的更改。
为什么
READ\u USN\u JOURNAL\u DATA.超时
不会限制
FSCTL\u READ\u USN\u JOURNAL
请求的持续时间?

具体来说,它的行为与其假设的行为完全一致:

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


请参见

谢谢。。。我只是误解了这些参数的用途。可以找到其他信息(Timeout和BytesToWaitFor)是的,这是对NTFS日志的很好的介绍。总之,关于NTFS期刊的全面信息来源如下: