структура USN_RECORD_V3 (winioctl.h)
Содержит сведения для записи журнала изменений версии 3.0 журнала обновления (USN). Запись версии 2.0 определяется структурой USN_RECORD_V2 (также называемой USN_RECORD структурой).
Синтаксис
typedef struct {
DWORD RecordLength;
WORD MajorVersion;
WORD MinorVersion;
FILE_ID_128 FileReferenceNumber;
FILE_ID_128 ParentFileReferenceNumber;
USN Usn;
LARGE_INTEGER TimeStamp;
DWORD Reason;
DWORD SourceInfo;
DWORD SecurityId;
DWORD FileAttributes;
WORD FileNameLength;
WORD FileNameOffset;
WCHAR FileName[1];
} USN_RECORD_V3, *PUSN_RECORD_V3;
Члены
RecordLength
Общая длина записи в байтах.
Так как USN_RECORD_V3 является переменным размером, элемент RecordLength следует использовать при вычислении адреса следующей записи в выходном буфере, например буфера, возвращаемого из операций функции DeviceIoControl , работающих с USN_RECORD_V3.
Размер любой записи журнала изменений в байтах не может превышать размер структуры USN_RECORD_V3 , а символы MaximumComponentLength минус 1 (для символа, объявленного в структуре) раз больше размера широкого символа. Значение Параметра MaximumComponentLength можно определить путем вызова
Функция GetVolumeInformation. В C размер записи можно определить с помощью следующего примера кода.
C++ |
---|
MaximumChangeJournalRecordSize = QuadAlign( (MaximumComponentLength - 1) * sizeof(WCHAR) + sizeof(USN_RECORD_V3) ); |
MajorVersion
Основной номер версии программного обеспечения журнала изменений для этой записи.
Например, если программное обеспечение журнала изменений имеет версию 3.0, основной номер версии — 3.
Значение | Значение |
---|---|
|
Структура является USN_RECORD_V2 структурой, и остальная часть структуры должна быть проанализирована с помощью этого макета. |
|
Структура является USN_RECORD_V3 структурой, и остальная часть структуры должна быть проанализирована с помощью этого макета. |
|
Структура является [USN_RECORD_V4 структура](ns-winioctl-usn_record_v4.md), а остальная часть структуры должна быть проанализирована с помощью этого макета. |
MinorVersion
Дополнительный номер версии программного обеспечения журнала изменений для этой записи. Например, если программное обеспечение журнала изменений — версия 3.0, дополнительный номер версии равен нулю.
FileReferenceNumber
128-разрядный порядковый номер файла или каталога, для которых изменяется запись.
Это произвольно присваиваемое значение, которое связывает запись журнала с файлом.
ParentFileReferenceNumber
128-разрядный порядковый номер каталога, в котором находится файл или каталог, связанный с этой записью.
Это произвольно присваиваемое значение, которое связывает запись журнала с родительским каталогом.
Usn
UsN этой записи.
TimeStamp
Стандартная метка времени в формате UTC (FILETIME) этой записи в 64-разрядном формате.
Reason
Флаги, определяющие причины изменений, накопленных в записи журнала этого файла или каталога с момента открытия файла или каталога.
При закрытии файла или каталога создается окончательная запись USN с установленным флагом USN_REASON_CLOSE . Следующее изменение (например, после следующей операции открытия или удаления) запускает новую запись с новым набором флагов причины.
Операция переименования или перемещения создает две записи USN: одна из них записывает старый родительский каталог для элемента, а другая — новый родительский.
В следующей таблице указаны возможные флаги.
SourceInfo
Дополнительные сведения об источнике изменения, заданные FSCTL_MARK_HANDLE операции DeviceIoControl .
Когда поток записывает новую запись USN, флаги исходной информации в предыдущей записи продолжают присутствовать только в том случае, если поток также устанавливает эти флаги. Таким образом, структура исходной информации позволяет приложениям фильтровать записи USN, которые задаются только известным источником, например антивирусным фильтром.
Можно задать одно из двух следующих значений.
SecurityId
Уникальный идентификатор безопасности, назначенный файлу или каталогу, связанному с этой записью.
FileAttributes
Атрибуты файла или каталога, связанных с этой записью, возвращаемые функцией GetFileAttributes . Атрибуты потоков, связанных с файлом или каталогом, исключаются.
FileNameLength
Длина имени файла или каталога, связанного с этой записью, в байтах. Элемент FileName содержит это имя. Используйте этот элемент для определения длины имени файла, а не в зависимости от конечного значения "\0", чтобы разделять имя файла в FileName.
FileNameOffset
Смещение элемента FileName от начала структуры.
FileName[1]
Имя файла или каталога, связанного с этой записью, в формате Юникода. Это имя файла или каталога имеет переменную длину.
При работе с FileName не следует рассчитывать на имя файла, содержащее конечный разделитель "\0", а вместо этого определите длину имени файла с помощью FileNameLength.
Не выполняйте арифметические указатели времени компиляции с помощью FileName. Вместо этого выполните необходимые вычисления во время выполнения, используя значение члена FileNameOffset . Это поможет сделать код совместимым с любыми будущими версиями USN_RECORD_V3.
Комментарии
В выходных буферах, возвращаемых операциями DeviceIoControl , которые работают с USN_RECORD_V3, все записи выравниваются по 64-разрядным границам с начала буфера.
Если отслеживание диапазона включено, NTFS переключается на создание только USN_RECORD_V3 записей в качестве выходных данных.
Чтобы обеспечить восходящую совместимость в клиентах журналов изменений, корпорация Майкрософт предоставляет основной и дополнительный номера версий программного обеспечения журнала изменений в структуре USN_RECORD_V3 . Код должен изучить эти значения, определить собственную совместимость с программным обеспечением журнала изменений и при необходимости корректно обрабатывать любые несовместимости.
Изменение дополнительного номера версии указывает на то, что существующие элементы структуры USN_RECORD_V3 по-прежнему действительны, но между предпоследним элементом и последним элементом, который является строкой переменной длины, могут быть добавлены новые элементы.
Для корректной обработки такого изменения код не должен выполнять арифметическую арифметику указателя времени компиляции, которая зависит от расположения последнего элемента. Например, это делает код sizeof(USN_RECORD)
C ненадежным. Вместо этого следует использовать вычисления во время выполнения с помощью элемента RecordLength .
Увеличение основного номера версий программного обеспечения журнала изменений указывает на то, что структура USN_RECORD_V3 , возможно, претерпела серьезные изменения и что текущее определение может быть ненадежным. Если код обнаруживает изменение в основном номере версии программного обеспечения журнала изменений, он не должен работать с журналом изменений.
Дополнительные сведения см. в статье Создание, изменение и удаление Журнал изменений.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8 [только классические приложения] |
Минимальная версия сервера | Windows Server 2012 [только классические приложения] |
Верхняя часть | winioctl.h (включая Windows.h) |