共用方式為


核心擴充屬性

從 Windows 8 開始,NTFS 支援核心擴充屬性(核心 EAS)。 確認映像的簽章是昂貴的作業。 儲存先前驗證的二進位檔是否已變更的相關信息,可減少映像必須進行完整簽章檢查的實例數目。 基於這個理由使用核心 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 來擷取此值。
  • USN FileUSN

    • FileUSN 值包含上次對檔案進行變更的 USN 識別碼,並會在指定檔案的主檔案數據表 (MFT) 記錄內追蹤。
      • 刪除 USN 日誌時, FileUSN 會重設為零。

此資訊連同任何其他特定使用量可能需要的信息,接著會在檔案上設定為核心 EA。

設定核心擴充屬性

若要設定核心 EA,其開頭必須是前置詞 "$Kernel." ,後面接著有效的 EA 名稱字串。 從使用者模式設定核心EA的嘗試會以無訊息方式忽略。 要求會 傳回STATUS_SUCCESS ,但不會進行實際的EA修改。 呼叫 ZwSetEaFile 或 FltSetEaFileAPI 以從核心模式設定核心 EA 是不夠的,因為 SMB 支援跨網路設定 EA,而且這些要求是從伺服器上的核心模式發出。

若要設定核心 EA,呼叫端也必須在 IRP (I/O 要求封包) 的 MinorFunction 字段中設定 IRP_MN_KERNEL_CALL 值。 由於設定此欄位的唯一方式是產生自定義 IRP,因此例程 FsRtlSetKernelEaFile 已從 FsRtl 套件匯出為支援函式,以設定核心 EA。

從 Windows 10 版本 1803 開始,使用者 EA 和核心 EA 可以混合。 將核心EA設定不會產生USN_REASON_EA_CHANGE記錄至USN日誌。 系統會在設定任何使用者 EA 時產生USN_REASON_EA_CHANGE。

查詢擴充屬性

從使用者模式查詢檔案上的EA會傳回一般和核心EA。 他們會回到使用者模式,以將任何應用程式相容性問題降到最低。 一般的 ZwQueryEaFile 和 FltQueryEaFile 作業會從使用者和核心模式傳回一般和核心 EA。

當只有 FileObject 可用時,使用 FsRtlQueryKernelEaFile 可能更方便用來從核心模式查詢核心 EA。

查詢更新序號日誌資訊

除非 IRP 的 MinorFunction 欄位中設定了IRP_MN_KERNEL_CALL值,否則FSCTL_QUERY_USN_JOURNAL作業仍需要SE_MANAGE_VOLUME_PRIVILEGE。 例程 FsRtlKernelFsControlFile 已從核心中的 FsRtl 套件導出,以輕鬆地允許核心模式元件發出此 USN 要求。

注意 從 Windows 10 版本 1703 和更新版本開始,這項作業不再需要SE_MANAGE_VOLUME_PRIVILEGE。

自動刪除核心擴充屬性

只要重新掃描檔案,因為檔案變更的USN標識符可能很昂貴,因為USN更新可能會張貼到檔案有許多良性原因。 為了簡化此作業,已將核心EAS功能的自動刪除新增至NTFS。

因為在此案例中,並非所有核心 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。

備註

使用者模式元件無法竄改核心 EAS。 核心 EA 可以存在於與一般 EA 相同的檔案中。

另請參閱

FltQueryEaFile
FltSetEaFile
FSCTL_QUERY_USN_JOURNAL
FsRtlQueryKernelEaFileFsRtlSetKernelEaFile
ZwQueryEaFile
ZwSetEaFile