У меня проблема с перечислением записей журнала изменений.Перечисление всех доступных записей журнала изменений
//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
?
Спасибо ... Я просто не понял назначение этих параметров. Дополнительную информацию можно найти здесь (http://www.microsoft.com/msj/0999/journal/journal.aspx) (Timeout и BytesToWaitFor) – akekir
Да, это хорошее введение в журналы NTFS. В любом случае, достаточно полный источник информации о журналах NTFS находится здесь: http://msdn.microsoft.com/en-us/library/aa363798.aspx –