從 Windows 8 開始,NTFS 支援核心擴充屬性 (核心 EA) 。 驗證映像的簽章是一項昂貴的作業。 儲存先前驗證的二進位檔是否已變更的相關資訊,可減少影像必須進行完整簽章檢查的實例數目。 因此,使用核心 EA 可提升映像檔簽章驗證的效能。
名稱前置詞 $Kernel 的 EA 只能從核心模式修改。 任何以此字串開頭的 EA 都會被視為核心 EA。 在獲取必要的更新序列號 (USN) 之前,您應先發送 FSCTL_WRITE_USN_CLOSE_RECORD,以提交檔案上擱置的任何 USN 日誌更新。 否則, FileUSN 值可能會在設定核心 EA 之後不久變更。
核心 EA 至少應包含下列資訊:
USN UsnJournalID
-
UsnJournalID 欄位是 GUID,可識別 USN 日誌檔案的目前化身。 USN 日誌可以在每個磁碟區中從使用者模式刪除與建立。 每次建立 USN 日誌時,都會產生新的 UsnJournalID GUID。 使用此欄位,您可以判斷是否有一段時間停用 USN 日誌,並可以重新驗證。
- 可以使用 FSCTL_QUERY_USN_JOURNAL擷取此值。
-
UsnJournalID 欄位是 GUID,可識別 USN 日誌檔案的目前化身。 USN 日誌可以在每個磁碟區中從使用者模式刪除與建立。 每次建立 USN 日誌時,都會產生新的 UsnJournalID GUID。 使用此欄位,您可以判斷是否有一段時間停用 USN 日誌,並可以重新驗證。
USN 檔案USN
-
FileUSN 值包含對檔案所做的最後一次變更的 USN 標識碼,並在指定檔案的主檔案資料表 (MFT) 記錄內追蹤。
- 刪除 USN 日誌時, FileUSN 會重設為零。
-
FileUSN 值包含對檔案所做的最後一次變更的 USN 標識碼,並在指定檔案的主檔案資料表 (MFT) 記錄內追蹤。
然後,此資訊以及給定使用方式可能需要的任何其他資訊都會在檔案上設定為核心 EA。
設定核心延伸屬性
為了設定 Kernel EA,它必須以前置詞 "$Kernel." 開頭,後面接著有效的 EA 名稱字串。
從使用者模式嘗試設定核心 EA 會被默默忽略。 要求會傳回 STATUS_SUCCESS ,但不會進行實際的 EA 修改。
呼叫 ZwSetEaFile 或 FltSetEaFile 之類的 API 來從核心模式設定核心 EA 是不夠的,因為 SMB 允許透過網路設定 EA。 當設定 EA 的請求透過 SMB 傳來時,它會從處理 SMB 請求的伺服器上的核心模式下發出。 網路請求可能會不當地在本機設定核心擴展屬性。
若要設定核心 EA,呼叫端也必須在 IRP 的 MinorFunction 欄位中設定 IRP_MN_KERNEL_CALL 值 (I/O 要求封包) 。 由於設定此欄位的唯一方式是產生自定義 IRP,因此常式 FsRtlSetKernelEaFile 是設定核心 EA 的支援函式。
從 Windows 10 版本 1803 開始,使用者 EA 和核心 EA 可以混合使用。 設定核心 EA 不會產生 USN 日誌的 USN_REASON_EA_CHANGE 記錄。 當設置任何用戶 EA 時,系統確實會產生USN_REASON_EA_CHANGE。
查詢擴充屬性
從使用者模式查詢檔案上的 EA 會傳回一般和核心 EA。 它們會返回使用者模式,以將任何應用程式相容性問題降到最低。 一般 ZwQueryEaFile 和 FltQueryEaFile 操作會在使用者和核心模式下回傳一般和核心 EA。
當只有 FileObject 可用時,使用 FsRtlQueryKernelEaFile 可能會更方便地從核心模式查詢核心 EA。
查詢更新序號日記帳資訊
即使從核心模式發出,FSCTL_QUERY_USN_JOURNAL 操作也需要SE_MANAGE_VOLUME_PRIVILEGE,除非在 IRP 的 MinorFunction 欄位中已設置IRP_MN_KERNEL_CALL 值。 常式 FsRtlKernelFsControlFile 可輕鬆地讓核心模式元件發出此 USN 要求。
注意 從 Windows 10 版本 1703 和更新版本開始,此作業不再需要SE_MANAGE_VOLUME_PRIVILEGE。
自動刪除核心擴充屬性
因為檔案變更的 USN 標識碼而簡單地重新掃描檔案可能會很昂貴,因為 USN 更新可能會張貼至檔案的良性原因有很多。 為了避免不必要的重新掃描,NTFS 中添加了自動刪除內核 EA 的功能。
因為在此案例中,並非所有核心 (Kernel) 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