2013-04-07 64 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