Может ли USN Journal файловой системы NTFS быть больше заявленного размера?
Привет коллеги программисты.
Я пытаюсь сбросить содержимое USN Journal раздела NTFS с помощью функций WinIoCtl. У меня есть структура *USN_JOURNAL_DATA*, которая говорит мне, что она имеет максимальный размер 512 МБ. Я сравнил это с тем, что fsutil говорит об этом, и это та же ценность.
Теперь я должен прочитать каждую запись в структуре *USN_RECORD*. Я делаю это в цикле for, который начинается с 0 и достигает максимального размера журнала с шагом 4096 (размер кластера). Я читаю каждые 4096 байтов в буфере одинакового размера и считываю из него все структуры USN_RECORD.
Все идет отлично, имена файлов правильные, отметки времени, причины, все, кроме того, что мне не хватает некоторых последних записей. Я создаю новый файл на разделе, я пишу что-то в нем, а затем я удаляю файл. Я снова запускаю приложение, и запись не появляется. Я считаю, что запись появляется только в том случае, если я продолжаю читать за пределами максимального размера журнала. Как это может быть?
В данный момент я читаю с начала данных журнала до максимального размера + дельту распределения (оба значения хранятся в структуре *USN_JOURNAL_DATA*), которую я не считаю верной, и у меня возникают проблемы с поиском информация, связанная с этим.
Может кто-нибудь, пожалуйста, объясните это? Есть ли в журнале USN буфер, похожий на то, как работает MFT (имеется в виду, что его размер уменьшается вдвое, когда для других файлов требуется место на диске)?
Что я делаю неправильно?
1 ответ
Это ожидаемое поведение, как задокументировано:
MaximumSize
Целевой максимальный размер журнала изменений в байтах. Журнал изменений может вырасти больше этого значения, но затем усекается на следующей контрольной точке файловой системы NTFS до значения меньше этого значения.
Вместо того, чтобы пытаться заранее определить размер, зацикливайтесь, пока не дойдете до конца данных.
Если вы используете FSCTL_ENUM_USN_DATA
контрольный код, вы достигли конца данных, когда код ошибки из DeviceIoControl
является ERROR_HANDLE_EOF
,
Если вы используете FSCTL_READ_USN_JOURNAL
управляющего кода, вы достигли конца данных, когда следующий USN, возвращаемый драйвером (DWORDLONG в начале буфера вывода), является запрашиваемым USN (значение StartUsn
во входном буфере). Вам нужно будет установить входной параметр BytesToWaitFor
в ноль, иначе драйвер будет ждать, пока указанное количество новых данных будет добавлено в журнал.