Поделиться через


Расширенные атрибуты ядра

Начиная с 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 отключен и может пересмотреть.
  • USN FileUSN

    • Значение FileUSN содержит идентификатор USN последнего изменения, которое было сделано в файл и отслеживается внутри записи главной таблицы файлов (MFT) для данного файла.
      • При удалении журнала USN fileUSN сбрасывается до нуля.

Эти сведения, а также любые другие данные, которые могут потребоваться для использования, затем задаются в файле в качестве ядра 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