内核扩展属性
从 Windows 8 开始,NTFS 支持内核扩展属性(内核 EA)。 验证映像的签名是一项高成本操作。 存储有关以前验证的二进制文件是否已更改的信息可减少映像必须进行完整签名检查的实例数。 因此,使用内核 EA 可提升映像文件签名验证的性能。
名称前缀为 $Kernel
的 EA 只能从内核模式进行修改。 任何以此字符串开头的 EA 都被认为是内核 EA。 在检索必要的更新序列号 (USN) 之前,建议先发布 FSCTL_WRITE_USN_CLOSE_RECORD,以提交可能早前发生的文件上的任何挂起的 USN 日志更新。 否则,设置内核 EA 后,FileUSN 值可能很快会更改。
建议内核 EA 至少包含以下信息:
USN UsnJournalID
- UsnJournalID 字段是一个 GUID,用于标识 USN 日志文件的当前版本。 USN 日志可以按卷从用户模式删除和创建。 每次创建 USN 日志时,都会生成一个新的 UsnJournalID GUID。 通过此字段,可以判断是否有一段时间 USN 日志被禁用,并可以重新验证。
- 可以使用 FSCTL_QUERY_USN_JOURNAL 检索此值。
- UsnJournalID 字段是一个 GUID,用于标识 USN 日志文件的当前版本。 USN 日志可以按卷从用户模式删除和创建。 每次创建 USN 日志时,都会生成一个新的 UsnJournalID GUID。 通过此字段,可以判断是否有一段时间 USN 日志被禁用,并可以重新验证。
USN FileUSN
- FileUSN 值包含对文件进行的最后一次更改的 USN ID,并在给定文件的主文件表 (MFT) 记录中进行跟踪。
- 当 USN 日志被删除时,FileUSN 将重置为零。
- FileUSN 值包含对文件进行的最后一次更改的 USN ID,并在给定文件的主文件表 (MFT) 记录中进行跟踪。
然后,将此信息以及给定用法可能需要的任何其他信息作为内核 EA 设置在文件上。
设置内核扩展属性
若要设置内核 EA,它必须以前缀 "$Kernel."
开头,后跟有效的 EA 名称字符串。 从用户模式设置内核 EA 的尝试将被自动忽略。 该请求返回 STATUS_SUCCESS,但没有进行实际的 EA 修改。 调用 API(如 ZwSetEaFile或 FltSetEaFile)从内核模式设置内核 EA 是不够的,因为 SMB 支持在网络上设置 EA,并且这些请求是从服务器上的内核模式发出的。
若要设置内核 EA,调用方还必须在 IRP(I/O 请求数据包)的 MinorFunction 字段中设置 IRP_MN_KERNEL_CALL 值。 由于设置此字段的唯一方法是生成自定义 IRP,因此例程 FsRtlSetKernelEaFile 已从 FsRtl 包中导出,作为设置内核 EA 的支持函数。
从 Windows 10 版本 1803 开始,用户 EA 和内核 EA 可以混合使用。 设置内核 EA 不会向 USN 日志生成 USN_REASON_EA_CHANGE 记录。 设置任何用户 EA 时,系统会生成 USN_REASON_EA_CHANGE。
查询扩展属性
从用户模式查询文件中的 EA 将返回正常 EA 和内核 EA。 它们将返回到用户模式,以最大程度地减少任何应用程序兼容性问题。 正常的 ZwQueryEaFile 和 FltQueryEaFile 操作从用户和内核模式返回正常和内核 EA。
如果只有 FileObject 可用,则使用 FsRtlQueryKernelEaFile 从内核模式查询内核 EA 可能更方便。
查询更新序列号日记帐信息
即使从内核模式发出,FSCTL_QUERY_USN_JOURNAL 操作也需要SE_MANAGE_VOLUME_PRIVILEGE,除非在 IRP 的 MinorFunction 字段中设置了 IRP_MN_KERNEL_CALL 值。 例程 FsRtlKernelFsControlFile 已从内核中的 FsRtl 包导出,以方便内核模式组件发出此 USN 请求。
注意 从 Windows 10 版本 1703 及更高版本开始,此操作不再需要 SE_MANAGE_VOLUME_PRIVILEGE。
自动删除内核扩展属性
仅仅因为文件的 USN ID 被更改而重新扫描文件的成本可能会很高,因为可能有许多良性原因导致 USN 更新被发布到文件中。 为了简化此操作,NTFS 中添加了内核 EA 的自动删除功能。
由于在这种情况下并不是所有的内核 EA 都想被删除,因此使用了一个扩展的 EA 前缀名称。 如果内核 EA 以 "$Kernel.Purge."
开头,那么如果以下任何 USN 原因被写入 USN 日志,NTFS 将删除该文件上符合给定命名语法的所有内核 EA:
- USN_REASON_DATA_OVERWRITE
- USN_REASON_DATA_EXTEND
- USN_REASON_DATA_TRUNCATION
- USN_REASON_REPARSE_POINT_CHANGE
即使在内存不足的情况下,内核 EA 的删除也会成功。
注解
用户模式组件不能篡改内核 EA。 内核 EA 可以与正常 EA 存在于同一文件中。
另请参阅
FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile