核心擴充屬性
從 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 來擷取此值。
- UsnJournalID 字段是 GUID,可識別 USN 日誌檔案目前的化身。 可以刪除 USN 日誌,並從每個磁碟區的使用者模式建立。 每次建立 USN 日誌時,都會產生新的 UsnJournalID GUID。 使用此欄位,您可以判斷是否有一段時間的 USN 紀錄已停用,而且可以重新驗證。
USN FileUSN
- FileUSN 值包含上次對檔案進行變更的 USN 識別碼,並會在指定檔案的主檔案數據表 (MFT) 記錄內追蹤。
- 刪除 USN 日誌時, FileUSN 會重設為零。
- FileUSN 值包含上次對檔案進行變更的 USN 識別碼,並會在指定檔案的主檔案數據表 (MFT) 記錄內追蹤。
此資訊連同任何其他特定使用量可能需要的信息,接著會在檔案上設定為核心 EA。
設定核心擴充屬性
若要設定核心 EA,其開頭必須是前置詞 "$Kernel."
,後面接著有效的 EA 名稱字串。 從使用者模式設定核心EA的嘗試會以無訊息方式忽略。 要求會 傳回STATUS_SUCCESS ,但不會進行實際的EA修改。 呼叫 ZwSetEaFile 或 FltSetEaFile 等 API 以從核心模式設定核心 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