Расширенные атрибуты ядра
Начиная с Windows 8 NTFS поддерживает расширенные атрибуты ядра (EAS ядра). Проверка подписи изображения является дорогостоящей операцией. Хранение сведений о том, был ли изменен ранее проверенный двоичный файл, уменьшает количество экземпляров, в которых образ должен пройти полную проверку подписи. Использование EAs ядра по этой причине повышает производительность проверки подписи файла изображения.
EAs с префиксом $Kernel
имени можно изменить только в режиме ядра. Любой EA, начинающийся с этой строки, считается ядром EA. Перед получением необходимого номера последовательности обновления (USN) рекомендуется сначала выполнить FSCTL_WRITE_USN_CLOSE_RECORD для фиксации всех ожидающих обновлений журнала USN в файле, который, возможно, произошел ранее. В противном случае значение FileUSN может измениться вскоре после настройки Ядра EA.
Рекомендуется, чтобы ядро EA содержало по крайней мере следующие сведения:
USN UsnJournalID
- Поле UsnJournalID — это ИДЕНТИФИКАТОР GUID, определяющий текущее воплощение файла журнала USN. Журнал USN можно удалить и создать из пользовательского режима на том. Каждый раз при создании журнала USN создается новый GUID UsnJournalID . С помощью этого поля можно определить, был ли период времени, когда журнал USN отключен и может пересмотреть.
- Это значение можно получить с помощью FSCTL_QUERY_USN_JOURNAL.
- Поле UsnJournalID — это ИДЕНТИФИКАТОР GUID, определяющий текущее воплощение файла журнала USN. Журнал USN можно удалить и создать из пользовательского режима на том. Каждый раз при создании журнала USN создается новый GUID UsnJournalID . С помощью этого поля можно определить, был ли период времени, когда журнал USN отключен и может пересмотреть.
USN FileUSN
- Значение FileUSN содержит идентификатор USN последнего изменения, которое было сделано в файл и отслеживается внутри записи главной таблицы файлов (MFT) для данного файла.
- При удалении журнала USN fileUSN сбрасывается до нуля.
- Значение FileUSN содержит идентификатор USN последнего изменения, которое было сделано в файл и отслеживается внутри записи главной таблицы файлов (MFT) для данного файла.
Эти сведения, а также любые другие данные, которые могут потребоваться для использования, затем задаются в файле в качестве ядра EA.
Настройка расширенного атрибута ядра
Чтобы задать ядро EA, он должен начинаться с префикса "$Kernel."
, за которым следует допустимая строка имени EA. Попытка задать Ядро EA из пользовательского режима автоматически игнорируется. Запрос возвращает STATUS_SUCCESS , но фактические изменения EA не вносятся. Вызов API, например ZwSetEaFile или FltSetEaFile, для задания ядра EA из режима ядра недостаточно, так как SMB поддерживает настройку EAs в сети и эти запросы выдаются из режима ядра на сервере.
Чтобы задать ядро EA, вызывающий объект также должен задать значение IRP_MN_KERNEL_CALL в поле MinorFunction пакета запросов IRP (пакет запроса ввода-вывода). Так как единственным способом задать это поле является создание пользовательского IRP, подпрограмма FsRtlSetKernelEaFile экспортируется из пакета FsRtl в качестве функции поддержки для настройки ядра EA.
Начиная с Windows 10 версии 1803, пользовательские EAs и ядра EAs можно перемешить. Установка ядра EA не создает запись USN_REASON_EA_CHANGE в журнал USN. Система создает USN_REASON_EA_CHANGE при установке пользовательских EAs.
Запрос расширенного атрибута
Запрос eAs в файле из пользовательского режима возвращает как обычные, так и EAS ядра. Они возвращаются в пользовательский режим, чтобы свести к минимуму все проблемы совместимости приложений. Обычные операции ZwQueryEaFile и FltQueryEaFile возвращают как обычные, так и ядра EAs из режима пользователя и ядра.
Если доступно только FileObject , использование FsRtlQueryKernelEaFile может быть удобнее использовать для запроса EAs ядра из режима ядра.
Запрос сведений журнала порядкового номера обновления
Для операции FSCTL_QUERY_USN_JOURNAL требуется SE_MANAGE_VOLUME_PRIVILEGE даже в режиме ядра, если значение IRP_MN_KERNEL_CALL не было задано в поле MinorFunction IRP. Подпрограмма FsRtlKernelFsControlFile была экспортирована из пакета FsRtl в ядре, чтобы легко разрешить компонентам режима ядра выдавать этот запрос USN.
ПРИМЕЧАНИЕ . Начиная с Windows 10 версии 1703 и более поздних версий эта операция больше не требует SE_MANAGE_VOLUME_PRIVILEGE.
Автоматическое удаление расширенных атрибутов ядра
Просто пересканирование файла, так как идентификатор USN измененного файла может быть дорогостоящим, так как существует множество доброкачественных причин, по которым обновление USN может быть размещено в файле. Чтобы упростить это, в NTFS добавлена функция автоматического удаления компонентов ядра EAs.
Так как в этом сценарии может потребоваться удалить не все EA ядра, используется расширенное имя префикса EA. Если ядро EA начинается с: "$Kernel.Purge."
если в журнал USN записываются какие-либо из следующих причин USN, NTFS удаляет все EAs ядра, существующие в этом файле, соответствующего заданному синтаксису именования:
- USN_REASON_DATA_OVERWRITE
- USN_REASON_DATA_EXTEND
- USN_REASON_DATA_TRUNCATION
- USN_REASON_REPARSE_POINT_CHANGE
Это удаление EAs ядра успешно выполнено даже в ситуациях с низкой памятью.
Замечания
Компоненты пользовательского режима не могут изменить параметры ядра EAs. EAs ядра могут существовать в том же файле, что и обычный EA.
См. также
FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile