exFAT 檔案系統規格

1 簡介

exFAT 檔案系統是 FAT 系列檔案系統中 FAT32 的後續任務。 此規格描述 exFAT 檔案系統,並提供實作 exFAT 檔案系統所需的所有資訊。

1.1 設計目標

exFAT 檔案系統有三個中央設計目標, (請參閱下列) 清單。

  1. 保留 FAT 型檔案系統的簡單性。

    FAT 型檔案系統的兩個優點是其相對簡單且容易實作。 在其前置任務中,實作者應該發現 exFAT 相對簡單且容易實作。

  2. 啟用非常大的檔案和存放裝置。

    exFAT 檔案系統會使用 64 位來描述檔案大小,進而啟用相依于非常大型檔案的應用程式。 exFAT 檔案系統也允許叢集大到 32 MB,有效地啟用非常大型的存放裝置。

  3. 納入擴充性以供未來創新之用。

    exFAT 檔案系統將擴充性併入其設計中,讓檔案系統能夠跟上儲存和使用量變更的步調。

1.2 特定術語

在此規格的內容中,某些詞彙 (請參閱 表 1) 具有 exFAT 檔案系統設計和實作的特定意義。

表 1 具有非常特定意義的詞彙定義

字詞 定義
此規格會使用「應」一詞來描述必要行為。
應該 此規格會使用「應該」一詞來描述強烈建議的行為,但不會強制。
五月 此規格會使用「可能」一詞來描述選擇性的行為。
強制性 此詞彙描述實作應修改的欄位或結構,且應解譯為此規格所描述。
選擇性 此詞彙描述實作可能或可能不支援的欄位或結構。 如果實作支援指定的選擇性欄位或結構,它應該修改 ,而且應該將此規格解譯為欄位或結構。
未定義 此詞彙描述實作視需要修改的欄位或結構內容 (亦即,在設定周圍欄位或結構) 時清除為零,且不得解譯為保留任何特定意義。
保留

此詞彙描述實作的欄位或結構內容:

  1. 應初始化為零,且不應用於任何用途

  2. 不應該解譯,但計算總和檢查碼時除外

  3. 應該在修改周圍欄位或結構的作業之間保留

1.3 常見縮略字的全文檢索

此規格在個人電腦產業中使用縮寫 (請參閱 表 2) 。

表 2 常見縮略字的全文檢索

縮略字 全文檢索
ASCII 美國資訊交換的標準程式碼
BIOS 基本輸入輸出系統
CPU 中央處理單位
exFAT 可延伸檔案配置資料表
FAT 檔案配置資料表
FAT12 檔案配置資料表,12 位叢集索引
FAT16 檔案配置資料表,16 位叢集索引
FAT32 檔案配置資料表,32 位叢集索引
GPT GUID 磁碟分割表格
GUID 全域唯一識別碼 (請參閱 第 10.1 節)
INT 中斷
MBR 主開機記錄
texFAT 交易安全 exFAT
UTC 國際標準時間

1.4 預設欄位和結構限定詞

此規格中的欄位和結構具有下列限定詞 (除非另有規格附注,否則請參閱下列) 清單。

  1. 未簽署

  2. 使用十進位標記法來描述未注明的值;此規格會使用後置修正字母 「h」 來表示十六進位數位,並以大括弧括住 GUID

  3. 格式為小到大

  4. 不需要字串的 Null 終止字元

1.5 Windows CE 和 TexFAT

TexFAT 是 exFAT 的延伸模組,可在基底檔案系統之上新增交易安全操作語意。 Windows CE會使用 TexFAT。 TexFAT 需要使用兩個 FAT 和配置點陣圖,才能在交易中使用。 它也會定義數個額外的結構,包括填補描述元和安全性描述元。

2 磁片區結構

磁片區是儲存和擷取使用者資料所需的所有檔案系統結構和資料空間集合。 所有 exFAT 磁片區都包含四個區域 (請參閱 表 3) 。

表 3 磁片區結構

子領域名稱

Offset

(磁區)

大小

(磁區)

註解
主要開機區域
主要開機磁區 0 1 此子領域是必要專案, 第 3.1 節 會定義其內容。
主要擴充開機磁區 1 8 此子領域是必要專案,第 3.2 節) 會定義其內容。
主要 OEM 參數 9 1 此子領域是必要專案, 第 3.3 節 會定義其內容。
主要保留 10 1 此子領域是必要專案,且其內容是保留的。
主要開機總和檢查碼 11 1 此子領域是必要專案, 第 3.4 節 會定義其內容。
備份開機區域
備份開機磁區 12 1 此子領域是必要專案, 第 3.1 節 會定義其內容。
備份擴充開機磁區 13 8 此子領域是必要專案, 第 3.2 節 會定義其內容。
備份 OEM 參數 21 1 此子領域是必要專案, 第 3.3 節 會定義其內容。
備份保留 22 1 此子領域是必要專案,且其內容是保留的。
備份開機總和檢查碼 23 1 此子領域是必要專案, 第 3.4 節 會定義其內容。
FAT 區域
FAT 對齊方式 24 FatOffset – 24

此子領域是必要專案,如果有任何內容,則為未定義。

注意:主要和備份開機磁區都包含 FatOffset 欄位。

第一個 FAT FatOffset FatLength

此子領域是必要專案, 第 4.1 節 會定義其內容。

注意:主要和備份開機磁區都包含 FatOffset 和 FatLength 欄位。

第二個 FAT FatOffset + FatLength FatLength * (NumberOfFats – 1)

此子領域是必要專案,而 第 4.1 節 會定義其內容,如果有的話。

注意:主要和備份開機磁區都包含 FatOffset、FatLength 和 NumberOfFats 欄位。 NumberOfFats 欄位只能保留值 1 和 2。

資料區域
叢集堆積對齊 FatOffset + FatLength * NumberOfFats ClusterHeapOffset – (FatOffset + FatLength * NumberOfFats)

此子領域是必要專案,如果有任何內容,則為未定義。

注意:主要和備份開機磁區都包含 FatOffset、FatLength、NumberOfFats 和 ClusterHeapOffset 欄位。 NumberOfFats 欄位的有效值為 1 和 2。

叢集堆積 ClusterHeapOffset ClusterCount * 2個磁區PerClusterShift

此子領域是必要專案, 第 5.1 節 會定義其內容。

注意:主要和備份開機磁區都包含 ClusterHeapOffset、ClusterCount 和 SectorsPerClusterShift 欄位。

多餘的空間 ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift VolumeLength – (ClusterHeapOffset + ClusterCount * 2SectorsPerClusterShift)

此子領域是必要專案,如果有任何內容,則為未定義。

注意:主要和備份開機磁區都包含 ClusterHeapOffset、ClusterCount、PartitionPerClusterShift 和 VolumeLength 欄位。

3 個主要和備份開機區域

主要開機區域提供所有必要的開機帶式指示、識別資訊和檔案系統參數,讓實作能夠執行下列動作:

  1. 從 exFAT 磁片區將電腦系統開機。

  2. 將磁片區上的檔案系統識別為 exFAT。

  3. 探索 exFAT 檔案系統結構的位置。

備份開機區域是主要開機區域的備份。 當主要開機區域處於不一致的狀態時,它有助於復原 exFAT 磁片區。 除了在不頻繁的情況下,例如更新開機帶式指示,實作不應該修改備份開機區域的內容。

3.1 主要和備份開機磁區子領域

主要開機磁區包含從 exFAT 磁片區開機帶和基本 exFAT 參數的程式碼,描述磁片區結構 (請參閱 表 4) 。 BIOS、MBR 或其他開機帶代理程式可能會檢查此磁區,並可載入並執行該磁區中包含的任何開機帶指示。

備份開機磁區是主要開機磁區的備份,且結構相同, (請參閱 表 4) 。 備份開機磁區可能會協助復原作業;不過,實作應該將 VolumeFlags 和 PercentInUse 欄位的內容視為過時。

在使用主要或備份開機磁區的內容之前,實作應驗證其各自的開機總和檢查碼,並確保其所有欄位都位於其有效值範圍內,以驗證其內容。

雖然初始格式作業會初始化主要和備份開機磁區的內容,但實作可能會更新這些磁區 (,並視需要更新各自的開機總和檢查碼) 。 不過,實作可能會更新 VolumeFlags 或 PercentInUse 欄位,而不更新各自的開機總和檢查碼, (總和檢查碼特別排除這兩個欄位) 。

表 4 主要和備份開機磁區結構

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
JumpBoot 0 3 此欄位為必要欄位, 而第 3.1.1 節 會定義其內容。
FileSystemName 3 8 此欄位是必要欄位,而 第 3.1.2 節 會定義其內容。
MustBeZero 11 53 此欄位是必要欄位, 而 Section 3.1.3 會定義其內容。
PartitionOffset 64 8 此欄位是必要欄位, 而 Section 3.1.4 會定義其內容。
VolumeLength 72 8 此欄位是必要欄位, 而 Section 3.1.5 會定義其內容。
FatOffset 80 4 此欄位是必要欄位, 而 Section 3.1.6 會定義其內容。
FatLength 84 4 此欄位是必要欄位, 而 Section 3.1.7 會定義其內容。
ClusterHeapOffset 88 4 此欄位是必要欄位, 而 Section 3.1.8 會定義其內容。
ClusterCount 92 4 此欄位是必要欄位, 而 Section 3.1.9 會定義其內容。
FirstClusterOfRootDirectory 96 4 此欄位是必要欄位, 而第 3.1.10 節 會定義其內容。
VolumeSerialNumber 100 4 此欄位是必要欄位, 而 Section 3.1.11 會定義其內容。
FileSystemRevision 104 2 此欄位是必要欄位, 而 Section 3.1.12 會定義其內容。
VolumeFlags 106 2 此欄位為必要欄位, 而第 3.1.13 節 會定義其內容。
BytesPerSectorShift 108 1 此欄位是必要欄位, 而第 3.1.14 節 會定義其內容。
SectorsPerClusterShift 109 1 此欄位是必要欄位, 而 Section 3.1.15 會定義其內容。
NumberOfFats 110 1 此欄位是必要欄位, 而第 3.1.16 節 會定義其內容。
DriveSelect 111 1 此欄位是必要欄位, 而第 3.1.17 節 會定義其內容。
PercentInUse 112 1 此欄位是必要欄位, 而 Section 3.1.18 會定義其內容。
保留 113 7 此欄位是必要欄位,且其內容是保留的。
BootCode 120 390 此欄位是必要欄位, 而第 3.1.19 節 會定義其內容。
BootSignature 510 2 此欄位是必要欄位, 而第 3.1.20 節 會定義其內容。
ExcessSpace 512 2BytesPerSectorShift – 512

此欄位是必要欄位,如果有任何未定義,則為其內容。

注意:主要和備份開機磁區都包含 BytesPerSectorShift 欄位。

3.1.1 JumpBoot 欄位

JumpBoot 欄位應包含個人電腦中常見 CPU 的跳躍指示,當執行時,CPU 會「跳躍」,以在 BootCode 欄位中執行開機帶式指示。

此欄位的有效值會依低序位元組到高階位元組的順序 (,) EBh 76h 90h。

3.1.2 FileSystemName 欄位

FileSystemName 欄位應包含磁片區上的檔案系統名稱。

此欄位的有效值為 ASCII 字元「EXFAT」,其中包含三個尾端空白字元。

3.1.3 MustBeZero 欄位

MustBeZero 欄位應該直接與已封裝 BIOS 參數區塊在 FAT12/16/32 磁片區取用的位元組範圍對應。

此欄位的有效值為 0,有助於防止 FAT12/16/32 實作誤掛接 exFAT 磁片區。

3.1.4 PartitionOffset 欄位

PartitionOffset 欄位應該描述裝載指定 exFAT 磁片區之分割區的媒體相對磁區位移。 此欄位可協助在個人電腦上使用擴充 INT 13h 從磁片區開機帶。

此欄位的所有可能值都是有效的;不過,值 0 表示實作應該忽略此欄位。

3.1.5 VolumeLength 欄位

VolumeLength 欄位應該描述磁區中指定 exFAT 磁片區的大小。

此欄位的有效值範圍應該是:

  • 至少2 20/ 2BytesPerSectorShift,以確保最小磁片區不超過 1MB

  • 最多 264- 1,此欄位可以描述的最大值。

    不過,如果 [過多空間] 子領域的大小為 0,則此欄位的最大值為 ClusterHeapOffset + (232- 11) * 2SectorsPerClusterShift

3.1.6 FatOffset 欄位

FatOffset 欄位應該描述 First FAT 的磁片區相對磁區位移。 此欄位可讓實作讓 First FAT 與基礎儲存媒體的特性保持一致。

此欄位的有效值範圍應該是:

  • 至少 24 個,這代表主要開機和備份開機區域耗用的磁區

  • 大部分的 ClusterHeapOffset - (FatLength * NumberOfFats) ,這代表叢集堆積取用的磁區

3.1.7 FatLength 欄位

FatLength 欄位應該描述每個 FAT 資料表的長度, (磁片區最多可包含兩個 FAT) 。

此欄位的有效值範圍應該是:

  • 至少 (ClusterCount + 2) * 22/ 2BytesPerSectorShift四捨五入到最接近的整數,以確保每個 FAT 有足夠的空間來描述叢集堆積中的所有叢集

  • 最多 (ClusterHeapOffset - FatOffset) / NumberOfFats 舍入到最接近的整數,以確保 FAT 存在於叢集堆積之前

此欄位可能包含超出其下限 (的值,如上所述,) 啟用第二個 FAT,如果存在,也符合基礎儲存媒體的特性。 超出 FAT 本身所需之空間的內容,如果有的話,則為未定義。

3.1.8 ClusterHeapOffset 欄位

[ClusterHeapOffset] 欄位應該描述叢集堆積的磁片區相對磁區位移。 此欄位可讓實作將叢集堆積對齊基礎儲存媒體的特性。

此欄位的有效值範圍應該是:

  • 至少 FatOffset + FatLength * NumberOfFats,以考慮上述所有區域耗用的磁區

  • 最多 2個 32- 1 或 VolumeLength - (ClusterCount * 2個 SectorsPerClusterShift) ,每一個計算都較少

3.1.9 ClusterCount 欄位

[ClusterCount] 欄位應描述叢集堆積包含的叢集數目。

此欄位的有效值應小於下列其中一項:

  • (VolumeLength - ClusterHeapOffset) / 2SectorsPerClusterShift舍入到最接近的整數,這完全符合叢集堆積開頭與磁片區結尾之間的叢集數目

  • 232- 11,這是 FAT 可以描述的叢集數目上限

ClusterCount 欄位的值會決定 FAT 的大小下限。 若要避免極大型的 FAT,實作可以透過 [磁區][PerClusterShift] 欄位 (增加叢集大小,來控制叢集堆積中的叢集數目) 。 此規格建議叢集堆積中不超過2 個 24- 2 個叢集。 不過,實作應該能夠處理叢集堆積中最多 2個 32- 11 個叢集的磁片區。

3.1.10 FirstClusterOfRootDirectory 欄位

FirstClusterOfRootDirectory 欄位應包含根目錄第一個叢集的叢集索引。 實作應該在配置點陣圖和 Up-case Table 取用叢集之後,將根目錄的第一個叢集放在第一個非錯誤的叢集中。

此欄位的有效值範圍應該是:

  • 至少 2,叢集堆積中第一個叢集的索引

  • 最多 ClusterCount + 1,叢集堆積中最後一個叢集的索引

3.1.11 VolumeSerialNumber 欄位

VolumeSerialNumber 欄位應包含唯一的序號。 這可協助實作區分不同的 exFAT 磁片區。 實作應該藉由結合格式化 exFAT 磁片區的日期和時間來產生序號。 結合日期和時間形成序號的機制是實作特定的。

此欄位的所有可能值都是有效的。

3.1.12 FileSystemRevision 欄位

FileSystemRevision 欄位應該描述指定磁片區上 exFAT 結構的主要和次要修訂編號。

高序位元組是主要修訂編號,而低序位元組則是次要修訂編號。 例如,如果高序位元組包含值 01h,而低序位元組包含值 05h,則 FileSystemRevision 欄位會描述修訂編號 1.05。 同樣地,如果高序位元組包含 0Ah 值,而低序位元組包含值 0Fh,則 FileSystemRevision 欄位會描述修訂編號 10.15。

此欄位的有效值範圍應該是:

  • 至少 0 個用於低序位元組,而高序位元組則為 1

  • 低序位元組最多 99 個,高序位元組最多 99 個

此規格描述的 exFAT 修訂編號為 1.00。 此規格的實作應該掛接任何具有主要修訂編號 1 的 exFAT 磁片區,且不得以任何其他主要修訂編號掛接任何 exFAT 磁片區。 實作應接受次要修訂編號,不得執行作業,或建立指定次要修訂編號對應規格中未描述的任何檔案系統結構。

3.1.13 VolumeFlags 欄位

VolumeFlags 欄位應包含旗標,指出 exFAT 磁片區上各種檔案系統結構的狀態, (請參閱 表 5) 。

當計算其各自的主要開機或備份開機區域總和檢查碼時,實作不應包含此欄位。 參考備份開機磁區時,實作應將此欄位視為過時。

表 5 VolumeFlags 欄位結構

欄位名稱

Offset

(位)

大小

(位)

註解
ActiveFat 0 1 此欄位是必要欄位,第 3.1.13.1 節 會定義其內容。
VolumeDirty 1 1 此欄位是必要欄位,而 Section 3.1.13.2 會定義其內容。
MediaFailure 2 1 此欄位是必要欄位,第 3.1.13.3 節 會定義其內容。
ClearToZero 3 1 此欄位是必要欄位,而 Section 3.1.13.4 會定義其內容。
保留 4 12 此欄位為必要欄位,並保留其內容。
3.1.13.1 ActiveFat 欄位

ActiveFat 欄位應描述哪些 FAT 和配置點陣圖為作用中 (,而實作應使用) ,如下所示:

  • 0,這表示第一個 FAT 和第一個配置點陣圖作用中

  • 1,這表示第二個 FAT 和第二個配置點陣圖作用中,而且只有在 NumberOfFats 欄位包含值 2 時才可能

實作應將非作用中的 FAT 和配置點陣圖視為過時。 只有 TexFAT 感知實作才能切換作用中的 FAT 和配置點陣圖 (請參閱 第 7.1 節) 。

3.1.13.2 VolumeDirty 欄位

VolumeDirty 欄位應該描述磁片區是否已變更,如下所示:

  • 0,這表示磁片區可能處於一致狀態

  • 1,這表示磁片區可能處於不一致的狀態

實作應該會在遇到無法解析的檔案系統中繼資料不一致時,將此欄位的值設定為 1。 如果掛接磁片區時,此欄位的值是 1,則只有解析檔案系統中繼資料不一致的實作可能會將此欄位的值清除為 0。 這類實作只有在確保檔案系統處於一致狀態之後,才會將此欄位的值清除為 0。

如果掛接磁片區時,此欄位的值為 0,實作應該將此欄位設定為 1,再更新檔案系統中繼資料,並在之後將此欄位清除為 0,類似于 第 8.1 節中所述的建議寫入順序。

3.1.13.3 MediaFailure 欄位

MediaFailure 欄位應該描述實作是否已探索到媒體失敗,如下所示:

  • 0,這表示裝載媒體未回報失敗,或 FAT 中已記錄任何已知失敗為「不正確的」叢集

  • 1,這表示裝載媒體 (回報失敗,也就是讀取或寫入作業失敗)

當下列情況時,實作應該將此欄位設定為 1:

  1. 裝載媒體無法嘗試存取磁片區中的任何區域

  2. 實作已耗盡存取重試演算法,如果有的話

如果掛接磁片區時,此欄位的值是 1,實作會掃描整個磁片區中的媒體失敗,並將所有失敗記錄為 FAT (中的「不良」叢集,否則) 可能會清除此欄位的值為 0。

3.1.13.4 ClearToZero 欄位

ClearToZero 欄位在此規格中沒有顯著意義。

此欄位的有效值為:

  • 0,沒有任何特定意義

  • 1,這表示實作應該先將此欄位清除為 0,再修改任何檔案系統結構、目錄或檔案

3.1.14 BytesPerSectorShift 欄位

BytesPerSectorShift 欄位應該描述每個磁區以記錄2 表示的位元組數 (N) ,其中 N 是每個磁區的位元組數目。 例如,針對每個磁區 512 個位元組,此欄位的值是 9。

此欄位的有效值範圍應該是:

  • 至少 9 個 (磁區大小為 512 個位元組) ,這是 exFAT 磁片區可能最小的磁區

  • ) 最多 12 個 (磁區大小為 4096 個位元組,這是個人電腦上常見 CPU 的記憶體頁面大小

3.1.15 磁區PerClusterShift 欄位

[SectorsPerClusterShift] 欄位應該描述每個叢集以記錄 2 表示的磁區2 (N) ,其中 N 是每個叢集的磁區數目。 例如,針對每個叢集 8 個磁區,此欄位的值是 3。

此欄位的有效值範圍應該是:

  • 每個叢集至少 0 (1 個磁區) ,這是可能的最小叢集

  • 最多 25 - BytesPerSectorShift,其評估為 32MB 的叢集大小

3.1.16 NumberOfFats 欄位

NumberOfFats 欄位應該描述磁片區所包含的 FAT 數目和配置點陣圖。

此欄位的有效值範圍應該是:

  • 1,表示磁片區只包含第一個 FAT 和第一個配置點陣圖

  • 2,表示磁片區包含第一個 FAT、第二個 FAT、第一個配置點陣圖,以及第二個配置點陣圖;此值僅適用于 TexFAT 磁片區

3.1.17 磁片磁碟機選取欄位

DriveSelect 欄位應包含擴充的 INT 13h 磁片磁碟機號碼,這可協助在個人電腦上使用擴充 INT 13h 從此磁片區開機帶。

此欄位的所有可能值都是有效的。 先前 FAT 型檔案系統中的類似欄位經常包含值 80h。

3.1.18 PercentInUse 欄位

PercentInUse 欄位應該描述已配置之叢集堆積中的叢集百分比。

此欄位的有效值範圍應該是:

  • 介於 0 到 100 之間,這是叢集堆積中配置叢集的百分比,舍入到最接近的整數

  • 完全 FFh,表示叢集堆積中已配置的叢集百分比無法使用

實作應變更此欄位的值,以反映叢集堆積中叢集配置變更,或將它變更為 FFh。

當計算其各自的主要開機或備份開機區域總和檢查碼時,實作不應包含此欄位。 參考備份開機磁區時,實作應將此欄位視為過時。

3.1.19 BootCode 欄位

BootCode 欄位應包含開機帶式指示。 實作可能會將此欄位填入開機帶式電腦系統所需的 CPU 指示。 未提供開機帶式指示的實作,應該將此欄位中的每個位元組初始化為 F4h, (個人電腦中常見的 CPU 停止指令,) 作為其格式作業的一部分。

3.1.20 BootSignature 欄位

BootSignature 欄位應該描述指定磁區的意圖是否為開機磁區。

此欄位的有效值為 AA55h。 此欄位中的任何其他值會使其各自的開機磁區失效。 實作應該先確認此欄位的內容,再根據其個別開機磁區中的其他任何欄位而定。

3.2 主要和備份擴充開機磁區子領域

主要擴充開機磁區的每個磁區都有相同的結構;不過,每個磁區可能會保留不同的開機帶指示, (請參閱表格 6) 。 開機帶式代理程式,例如主要開機磁區中的開機帶指示、替代 BIOS 實作或內嵌系統的韌體,可能會載入這些磁區並執行其包含的指示。

備份擴充開機磁區是主要擴充開機磁區的備份,而且具有相同的結構 (請參閱 表 6) 。

在執行主要或備份擴充開機磁區的指示之前,實作應該確認其內容,方法是確保每個磁區的 ExtendedBootSignature 欄位都包含其指定的值。

雖然初始格式作業會初始化主要和備份擴充開機磁區的內容,但實作可能會更新這些磁區 (,並視需要更新各自的開機總和檢查碼) 。

表 6 擴充開機磁區結構

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
ExtendedBootCode 0 2BytesPerSectorShift – 4

此欄位是必要欄位, 而第 3.2.1 節 會定義其內容。

注意:主要和備份開機磁區都包含 BytesPerSectorShift 欄位。

ExtendedBootSignature 2BytesPerSectorShift – 4 4

此欄位是必要欄位, 而第 3.2.2 節 會定義其內容。

注意:主要和備份開機磁區都包含 BytesPerSectorShift 欄位。

3.2.1 ExtendedBootCode 欄位

ExtendedBootCode 欄位應包含開機帶式指示。 實作可能會將此欄位填入開機帶式電腦系統所需的 CPU 指示。 未提供開機帶指示的實作,應該將此欄位中的每個位元組初始化為 00h,作為其格式作業的一部分。

3.2.2 ExtendedBootSignature 欄位

ExtendedBootSignature 欄位應該描述指定磁區的意圖是否為擴充開機磁區。

此欄位的有效值為 AA550000h。 此欄位中的任何其他值會使其各自的主要或備份擴充開機磁區失效。 實作應該先確認此欄位的內容,再根據其各自的擴充開機磁區中的其他任何欄位而定。

3.3 主要和備份 OEM 參數子領域

主要 OEM 參數子領域包含十個可能包含製造商特定資訊的參數結構, (請參閱 表 7) 。 每個十個參數結構衍生自泛型參數範本, (請參閱 第 3.3.2 節) 。 製造商可以從泛型參數範本衍生自己的自訂參數結構。 此規格本身會定義兩個參數結構:Null 參數 (請參閱 第 3.3.3 節) 和 Flash 參數 (請參閱 第 3.3.4 節) 。

備份 OEM 參數是主要 OEM 參數的備份,且結構相同, (請參閱 表 7) 。

在使用主要或備份 OEM 參數的內容之前,實作應該驗證其各自的開機總和檢查碼來驗證其內容。

製造商應該以自己的自訂參數結構填入 Main 和 Backup OEM 參數,如果有的話,以及任何其他參數結構。 後續的格式作業應保留 Main 和 Backup OEM 參數的內容。

實作可能會視需要更新主要和備份 OEM 參數 (,而且也應該更新各自的開機總和檢查碼) 。

表 7 OEM 參數結構

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
Parameters[0] 0 48 此欄位是必要欄位, 而 Section 3.3.1 會定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

Parameters[9] 432 48 此欄位是必要欄位, 而 Section 3.3.1 會定義其內容。
保留 480 2BytesPerSectorShift – 480

此欄位是必要欄位,且其內容是保留的。

注意:主要和備份開機磁區都包含 BytesPerSectorShift 欄位。

3.3.1 參數[0] ...Parameters[9]

此陣列中的每個 Parameters 欄位都包含參數結構,其衍生自泛型參數範本 (請參閱 第 3.3.2 節) 。 任何未使用的參數欄位都應該描述為包含 Null 參數結構 (請參閱 第 3.3.3 節) 。

3.3.2 泛型參數範本

泛型參數範本提供參數結構的基底定義, (請參閱 表 8) 。 所有參數結構都衍生自此範本。 此泛型參數範本的支援是必要的。

表 8 泛型參數範本

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
ParametersGuid 0 16 此欄位是必要欄位, 而 Section 3.3.2.1 會定義其內容。
CustomDefined 16 32 此欄位是必要的,而且衍生自此範本的結構會定義其內容。
3.3.2.1 ParametersGuid 欄位

ParametersGuid 欄位應該描述 GUID,以決定指定參數結構的其餘部分配置。

此欄位的所有可能值都是有效的;不過,製造商應該使用 GUID 產生工具,例如GuidGen.exe,從此範本衍生自訂參數結構時選取 GUID。

3.3.3 Null 參數

Null 參數結構衍生自泛型參數範本 (請參閱 第 3.3.2 節) ,而且應該描述未使用的參數欄位 (請參閱 表 9) 。 建立或更新 OEM 參數結構時,實作應該以 Null 參數結構填入未使用的 Parameters 欄位。 此外,建立或更新 OEM 參數結構時,實作應該合併陣列結尾的 Null 參數結構,藉此將所有其他 Parameters 結構保留在 OEM 參數結構的開頭。

Null 參數結構的支援是必要的。

表 9 Null 參數結構

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
ParametersGuid 0 16 此欄位是必要欄位, 而 Section 3.3.3.1 會定義其內容。
保留 16 32 此欄位是必要欄位,且其內容是保留的。
3.3.3.1 ParametersGuid 欄位

ParametersGuid 欄位應符合泛型參數範本所提供的定義, (請參閱 第 3.3.2.1 節) 。

此欄位的有效值為 GUID 標記法 {00000000-0000-0000-0000-000000000000} 。

3.3.4 Flash 參數

Flash 參數結構衍生自泛型參數範本, (請參閱 第 3.3.2 節) ,並包含快閃媒體的參數 (請參閱 表 10) 。 以快閃為基礎的存放裝置製造商可能會填入參數欄位 (最好是參數[0] 欄位) 這個參數結構。 實作可能會使用 Flash 參數結構中的資訊,在讀取/寫入期間優化存取作業,以及對齊檔案系統結構永久格式化媒體。

Flash 參數結構的支援是選擇性的。

表 10 Flash 參數結構

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
ParametersGuid 0 16 此欄位是必要欄位, 而 Section 3.3.4.1 會定義其內容。
EraseBlockSize 16 4 此欄位是必要欄位,而 第 3.3.4.2 節 會定義其內容。
PageSize 20 4 此欄位是必要欄位, 而 Section 3.3.4.3 會定義其內容。
SpareSectors 24 4 此欄位是必要欄位, 而第 3.3.4.4 節 會定義其內容。
RandomAccessTime 28 4 此欄位是必要欄位, 而 Section 3.3.4.5 會定義其內容。
程式設計時間 32 4 此欄位是必要欄位, 而 Section 3.3.4.6 會定義其內容。
ReadCycle 36 4 此欄位是必要欄位, 而第 3.3.4.7 節 會定義其內容。
WriteCycle 40 4 此欄位是必要欄位, 第 3.3.4.8 節 會定義其內容。
保留 44 4 此欄位是必要欄位,且其內容是保留的。

除了 ParametersGuid 欄位之外,所有 Flash Parameters 欄位的所有可能值都是有效的。 不過,值 0 表示欄位實際上沒有意義 (實作應該忽略指定的欄位) 。

3.3.4.1 ParametersGuid 欄位

ParametersGuid 欄位應符合泛型參數範本中提供的定義, (請參閱 第 3.3.2.1 節) 。

此欄位的有效值為 {0A0C7E46-3399-4021-90C8-FA6D389C4BA2}。

3.3.4.2 EraseBlockSize 欄位

EraseBlockSize 欄位應該描述快閃媒體清除區塊的大小,以位元組為單位。

3.3.4.3 PageSize 欄位

PageSize 欄位應該描述快閃媒體頁面的大小,以位元組為單位。

3.3.4.4 SpareSectors 欄位

[SpareSectors] 欄位應該描述快閃媒體可用於其內部疏留作業的磁區數目。

3.3.4.5 RandomAccessTime 欄位

RandomAccessTime 欄位應以奈秒描述快閃媒體的平均隨機存取時間。

3.3.4.6 程式設計時間欄位

[程式設計時間] 欄位應以奈秒描述快閃媒體的平均程式設計時間。

3.3.4.7 ReadCycle 欄位

ReadCycle 欄位應該描述快閃媒體的平均讀取週期時間,以奈秒為單位。

3.3.4.8 WriteCycle 欄位

WriteCycle 欄位應該以 nanoseconds 描述平均寫入週期時間。

3.4 主要和備份開機總和檢查碼子領域

主要和備份開機總和檢查碼各包含其個別開機區域中所有其他子領域內容的四位元組總和檢查碼重複模式。 總和檢查碼計算不得在其各自的開機磁區中包含 VolumeFlags 和 PercentInUse 欄位 (請參閱 圖 1) 。 四位元組總和檢查碼的重複模式會從子領域的開頭到結尾填滿其各自的開機總和檢查碼子領域。

在主要或備份開機區域中使用任何其他子領域的內容之前,實作應該驗證其各自的開機總和檢查碼來驗證其內容。

雖然初始格式作業會以重複總和檢查碼模式填入 Main 和 Backup Boot Checksum,但實作應更新這些磁區,因為其個別開機區域中其他磁區的內容會變更。

圖 1 開機總和檢查碼計算

UInt32 BootChecksum
(
    UCHAR  * Sectors,        // points to an in-memory copy of the 11 sectors
    USHORT   BytesPerSector
)
{
    UInt32 NumberOfBytes = (UInt32)BytesPerSector * 11;
    UInt32 Checksum = 0;
    UInt32 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 106) || (Index == 107) || (Index == 112))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Sectors[Index];
    }

    return Checksum;
}

4 個檔案配置資料表區域

檔案配置資料表 (FAT) 區域最多可能包含兩個 FAT,一個位於 First FAT 子領域中,另一個位於第二個 FAT 子領域中。 NumberOfFats 欄位描述此區域包含的 FAT 數目。 NumberOfFats 欄位的有效值為 1 和 2。 因此,First FAT 子領域一律包含 FAT。 如果 NumberOfFats 欄位是兩個,則第二個 FAT 子領域也會包含 FAT。

VolumeFlags 欄位的 ActiveFat 欄位描述哪些 FAT 為作用中。 只有主要開機磁區中的 VolumeFlags 欄位是最新的。 實作應將非作用中的 FAT 視為過時。 使用非使用中的 FAT 並在 FAT 之間切換是特定實作。

4.1 第一個和第二個 FAT 子領域

FAT 應該描述叢集堆積中的叢集鏈結 (請參閱 表 11) 。 叢集鏈結是一系列的叢集,可提供空間來記錄檔案、目錄和其他檔案系統結構的內容。 FAT 代表叢集鏈結為叢集索引的單一連結清單。 除了前兩個專案之外,FAT 中的每個專案都只代表一個叢集。

表 11 檔案配置資料表結構

欄位名稱

Offset

(位元組)

大小

) (位元組

註解
FatEntry[0] 0 4 此欄位是必要欄位, 而第 4.1.1 節 會定義其內容。
FatEntry[1] 4 4 此欄位是必要欄位, 而第 4.1.2 節 會定義其內容。
FatEntry[2] 8 4 此欄位是必要欄位, 而 Section 4.1.3 會定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

FatEntry[ClusterCount+1] (ClusterCount + 1) * 4 4

此欄位是必要欄位, 而 Section 4.1.3 會定義其內容。

ClusterCount + 1 不能超過 FFFFFFF6h。

注意:主要和備份開機磁區都包含 [ClusterCount] 欄位。

ExcessSpace (ClusterCount + 2) * 4 (FatLength * 2BytesPerSectorShift) – ( (ClusterCount + 2) * 4)

此欄位是必要欄位,如果有任何未定義,則為其內容。

注意:主要和備份開機磁區都包含 ClusterCount、FatLength 和 BytesPerSectorShift 欄位。

4.1.1 FatEntry[0] 欄位

FatEntry[0] 欄位應該描述第一個位元組中的媒體類型, (最低順序位元組) ,而且應該在其餘三個位元組中包含 FFh。

媒體類型 (第一個位元組) 應該是 F8h。

4.1.2 FatEntry[1] 欄位

FatEntry[1] 欄位只會因為歷史優先順序而存在,而且不會描述任何感興趣的專案。

此欄位的有效值為 FFFFFFFFh。 實作應將此欄位初始化為其指定的值,不應將此欄位用於任何用途。 實作不應該解譯此欄位,而且應該在修改周圍欄位的作業之間保留其內容。

4.1.3 FatEntry[2] ...FatEntry[ClusterCount+1] 欄位

此陣列中的每個 FatEntry 欄位都應該代表叢集堆積中的叢集。 FatEntry[2] 代表叢集堆積中的第一個叢集,而 FatEntry[ClusterCount+1] 代表叢集堆積中的最後一個叢集。

這些欄位的有效值範圍應該是:

  • 介於 2 和 ClusterCount + 1 之間,內含地指向指定叢集鏈結中的下一個 FatEntry;指定的 FatEntry 不得指向指定叢集鏈結中之前的任何 FatEntry

  • 完全 FFFFFFF7h,它會將指定的 FatEntry 對應叢集標示為「不良」

  • 完全 FFFFFFFFh,它會將指定的 FatEntry 對應叢集標示為叢集鏈結的最後一個叢集;這是任何指定叢集鏈結最後一個 FatEntry 的唯一有效值

5 個數據區域

資料區包含叢集堆積,可提供檔案系統結構、目錄和檔案的受控空間。

5.1 叢集堆積子領域

叢集堆積的結構非常簡單, (請參閱 表 12) ;每個連續的磁區系列都會描述一個叢集,因為 SectorsPerClusterShift 欄位會定義。 重要的是,叢集堆積的第一個叢集有索引 2,其會直接對應至 FatEntry[2] 的索引。

在 exFAT 磁片區中,配置點陣圖 (請參閱 第 7.1.5 節) 維護所有叢集的配置狀態記錄。 這與 exFAT 的前置任務 (FAT12、FAT16 和 FAT32) 有顯著差異,其中 FAT 會維護叢集堆積中所有叢集的配置狀態記錄。

表 12 叢集堆積結構

欄位名稱

Offset

(磁區)

大小

(磁區)

註解
Cluster[2] ClusterHeapOffset 2磁區PerClusterShift

此欄位是必要欄位, 而第 5.1.1 節 會定義其內容。

注意:主要和備份開機磁區都包含 ClusterHeapOffset 和 SectorsPerClusterShift 欄位。

.

.

.

.

.

.

.

.

.

.

.

.

Cluster[ClusterCount+1] ClusterHeapOffset + (ClusterCount – 1) * 2個 SectorsPerClusterShift 2磁區PerClusterShift

此欄位是必要欄位, 而第 5.1.1 節 會定義其內容。

注意:主要和備份開機磁區都包含 ClusterCount、ClusterHeapOffset 和 SectorsPerClusterShift 欄位。

5.1.1 叢集[2] ...Cluster[ClusterCount+1] 欄位

此陣列中的每個 [叢集] 欄位都是一系列連續磁區,其大小是由 [磁區][PerClusterShift] 欄位所定義。

6 目錄結構

exFAT 檔案系統會使用目錄樹狀結構方法來管理存在於叢集堆積中的檔案系統結構和檔案。 目錄在目錄樹狀結構中的父系和子系之間具有一對多關聯性。

FirstClusterOfRootDirectory 欄位所參考的目錄是目錄樹狀目錄的根目錄。 所有其他目錄都會以單向連結的方式從根目錄遞減。

每個目錄都包含一系列目錄專案, (請參閱 表 13) 。

一或多個目錄專案結合成描述感興趣的目錄專案集,例如檔案系統結構、子目錄或檔案。

表 13 目錄結構

欄位名稱

Offset

(位元組)

大小

(位元組)

註解
DirectoryEntry[0] 0 32 此欄位是必要欄位, 而第 6.1 節 會定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

DirectoryEntry[N–1] (N – 1) * 32 32

此欄位是必要欄位, 而第 6.1 節 會定義其內容。

N,DirectoryEntry 欄位的數目是包含指定目錄的叢集鏈結大小,以位元組為單位,除以 DirectoryEntry 欄位的大小,32 個位元組。

6.1 DirectoryEntry[0] ...DirectoryEntry[N--1]

此陣列中的每個 DirectoryEntry 欄位都衍生自 Generic DirectoryEntry 範本, (請參閱 第 6.2 節) 。

6.2 Generic DirectoryEntry 範本

Generic DirectoryEntry 範本提供目錄專案的基底定義, (請參閱 表 14) 。 所有目錄專案結構都衍生自此範本,而且只有 Microsoft 定義的目錄專案結構有效, (exFAT 沒有製造商定義目錄專案結構的布建,但第7.8 節和第 7.9 節) 除外。 解譯 Generic DirectoryEntry 範本的能力是必要的。

表 14 Generic DirectoryEntry 範本

欄位名稱

Offset

(位元組)

大小

(位元組)

註解
EntryType 0 1 此欄位是必要欄位, 而 Section 6.2.1 會定義其內容。
CustomDefined 1 19 此欄位是必要欄位,衍生自此範本的結構可能會定義其內容。
FirstCluster 20 4 此欄位是必要欄位, 而 Section 6.2.2 會定義其內容。
DataLength 24 8 此欄位是必要欄位, 而第 6.2.3 節 會定義其內容。

6.2.1 EntryType 欄位

EntryType 欄位有三種使用模式,欄位的值定義 (請參閱下列清單) 。

  • 00h,這是目錄結束記號,適用下列條件:

    • 指定 DirectoryEntry 中的所有其他欄位實際上都會保留

    • 指定目錄中的所有後續目錄專案也是目錄結束記號

    • 目錄結束記號只有在目錄專案集之外才有效

    • 實作可能會視需要覆寫目錄結束記號

  • 介於 01h 和 7Fh 之間,這是未使用的目錄專案標記,且適用下列條件:

    • 指定 DirectoryEntry 中的所有其他欄位實際上都未定義

    • 未使用的目錄專案只有在目錄專案集之外才有效

    • 實作可能會視需要覆寫未使用的目錄專案

    • 這個值範圍會對應至 InUse 欄位 (請參閱包含值 0 的第 6.2.1.4 節)

  • 在 81h 和 FFh 之間,這是一般目錄專案,且適用下列條件:

    • EntryType 欄位的內容 (請參閱 表格 15) 判斷 DirectoryEntry 結構其餘部分的配置

    • 這個值範圍,且只有這個值範圍在目錄專案集內有效

    • 這個值範圍會直接對應至 InUse 欄位 (請參閱包含值 1 的第 6.2.1.4 節)

若要防止修改 InUse 欄位 (請參閱 第 6.2.1.4 節) 錯誤地產生目錄結束記號,值 80h 無效。

表 15 泛型 EntryType 欄位結構

欄位名稱

Offset

(位)

大小

(位)

註解
TypeCode 0 5 此欄位是必要欄位, 而第 6.2.1.1 節 會定義其內容。
TypeImportance 5 1 此欄位是必要欄位, 第 6.2.1.2 節會定義其內容。
TypeCategory 6 1 此欄位是必要欄位, 而 Section 6.2.1.3 會定義其內容。
InUse 7 1 此欄位是必要欄位, 而 Section 6.2.1.4 會定義其內容。
6.2.1.1 TypeCode 欄位

TypeCode 欄位部分描述指定目錄專案的特定類型。 此欄位加上 TypeImportance 和 TypeCategory 欄位, (請參閱 第 6.2.1.2 節和 第 6.2.1.3 節,分別) 唯一識別指定目錄專案的型別。

除非 TypeImportance 和 TypeCategory 欄位都包含值 0,否則此欄位的所有可能值都是有效的;在此情況下,這個欄位的值 0 無效。

6.2.1.2 TypeImportance 欄位

TypeImportance 欄位應該描述指定目錄專案的重要性。

此欄位的有效值應該是:

6.2.1.3 TypeCategory 欄位

TypeCategory 欄位應該描述指定目錄專案的類別。

此欄位的有效值應該是:

  • 0,這表示指定的目錄專案是主要 (請參閱 第 6.3 節)

  • 1,這表示指定的目錄專案是次要 (請參閱 第 6.4 節)

6.2.1.4 InUse 欄位

[InUse] 欄位應該描述指定的目錄專案是否使用中。

此欄位的有效值應該是:

  • 0,這表示指定的目錄專案不在使用中;這表示指定的結構實際上是未使用的目錄專案

  • 1,這表示指定的目錄專案正在使用中;這表示指定的結構是一般目錄專案

6.2.2 FirstCluster 欄位

FirstCluster 欄位應包含與指定目錄專案相關聯之叢集堆積中配置之第一個叢集的索引。

此欄位的有效值範圍應該是:

  • 完全為 0,這表示沒有叢集配置存在

  • 介於 2 和 ClusterCount + 1 之間,這是有效叢集索引的範圍

如果叢集配置與衍生結構不相容,則衍生自此範本的結構可能會重新定義 FirstCluster 和 DataLength 欄位。

6.2.3 DataLength 欄位

DataLength 欄位描述相關聯叢集配置包含的資料大小,以位元組為單位。

此欄位的有效值範圍為:

  • 至少 0;如果 FirstCluster 欄位包含值 0,則此欄位的唯一有效值為 0

  • 最多 ClusterCount * 2個磁區PerClusterShift* 2BytesPerSectorShift

如果衍生自此範本的結構無法針對衍生結構,則衍生自此範本的結構可能會重新定義 FirstCluster 和 DataLength 欄位。

6.3 泛型主要目錄Entry 範本

目錄專案集中的第一個目錄專案應該是主要目錄專案。 目錄專案集中的所有後續目錄專案都應該是次要目錄專案, (請參閱 第 6.4 節) 。

解譯泛型主要目錄Entry 範本的能力是必要的。

所有主要目錄專案結構都衍生自泛型主要目錄Entry 範本 (請參閱 資料表 16) ,其衍生自 Generic DirectoryEntry 範本 (請參閱 第 6.2 節) 。

表 16 一般主要目錄Entry 範本

欄位名稱

Offset

(位元組)

大小

(位元組)

註解
EntryType 0 1 此欄位是必要欄位, 而 Section 6.3.1 會定義其內容。
SecondaryCount 1 1 此欄位是必要欄位, 而第 6.3.2 節 會定義其內容。
SetChecksum 2 2 此欄位是必要欄位, 而 Section 6.3.3 會定義其內容。
GeneralPrimaryFlags 4 2 此欄位是必要欄位, 而 Section 6.3.4 會定義其內容。
CustomDefined 6 14 此欄位是必要欄位,衍生自此範本的結構會定義其內容。
FirstCluster 20 4 此欄位是必要欄位, 而第 6.3.5 節 會定義其內容。
DataLength 24 8 此欄位是必要欄位,而 Section 6.3.6 會定義其內容。

6.3.1 EntryType 欄位

EntryType 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1 節) 。

6.3.1.1 TypeCode 欄位

TypeCode 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.1 節) 。

6.3.1.2 TypeImportance 欄位

TypeImportance 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.2 節) 。

6.3.1.2.1 重要主要目錄專案

重要主要目錄專案包含適當管理 exFAT 磁片區的關鍵資訊。 只有根目錄包含 (檔案目錄專案的重要主要目錄專案是例外狀況,請參閱 第 7.4 節) 。

重要主要目錄專案的定義會與主要 exFAT 修訂編號相互關聯。 實作應該支援所有重要的主要目錄專案,而且只能記錄此規格定義的重要主要目錄專案結構。

6.3.1.2.2 良性主要目錄專案

良性主要目錄專案包含其他資訊,這可能有助於管理 exFAT 磁片區。 任何目錄都可能包含良性的主要目錄專案。

良性主要目錄專案的定義會與次要 exFAT 修訂編號相互關聯。 支援此規格或任何後續規格的任何良性主要目錄專案,定義是選擇性的。 無法辨識的良性主要目錄專案會將整個目錄專案集轉譯為無法辨識的 (,超出適用目錄專案範本的定義) 。

6.3.1.3 TypeCategory 欄位

TypeCategory 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.3 節) 。

針對此範本,此欄位的有效值應為 0。

6.3.1.4 InUse 欄位

InUse 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.4 節) 。

6.3.2 SecondaryCount 欄位

SecondaryCount 欄位應該描述緊接在指定主要目錄專案後面的次要目錄專案數目。 這些次要目錄專案以及指定的主要目錄專案組成目錄專案集。

此欄位的有效值範圍應該是:

  • 至少 0,這表示此主要目錄專案是目錄專案集中的唯一專案

  • 最多 255 個,這表示接下來的 255 個目錄專案和這個主要目錄專案組成目錄專案集

衍生自此範本的重要主要目錄專案結構可能會重新定義 SecondaryCount 和 SetChecksum 欄位。

6.3.3 SetChecksum 欄位

SetChecksum 欄位應包含指定目錄專案集中所有目錄專案的總和檢查碼。 不過,總和檢查碼會排除此欄位, (請參閱 圖 2) 。 實作應該先驗證此欄位的內容,再使用指定目錄專案集中的任何其他目錄專案。

衍生自此範本的重要主要目錄專案結構可能會重新定義 SecondaryCount 和 SetChecksum 欄位。

圖 2 EntrySetChecksum 計算

UInt16 EntrySetChecksum
(
    UCHAR * Entries,       // points to an in-memory copy of the directory entry set
    UCHAR   SecondaryCount
)
{
    UInt16 NumberOfBytes = ((UInt16)SecondaryCount + 1) * 32;
    UInt16 Checksum = 0;
    UInt16 Index;

    for (Index = 0; Index < NumberOfBytes; Index++)
    {
        if ((Index == 2) || (Index == 3))
        {
            continue;
        }
        Checksum = ((Checksum&1) ? 0x8000 : 0) + (Checksum>>1) +  (UInt16)Entries[Index];
    }
    return Checksum;
}

6.3.4 GeneralPrimaryFlags 欄位

GeneralPrimaryFlags 欄位包含旗標, (請參閱 表 17) 。

衍生自此範本的重要主要目錄專案結構可能會重新定義此欄位。

表 17 泛型一般PrimaryFlags 欄位結構

欄位名稱

Offset

(位)

大小

(位)

註解
可能的配置 0 1 此欄位是必要欄位, 而 Section 6.3.4.1 會定義其內容。
NoFatChain 1 1 此欄位是必要欄位, 而第 6.3.4.2 節 會定義其內容。
CustomDefined 2 14 此欄位是必要欄位,衍生自此範本的結構可能會定義此欄位。
6.3.4.1 配置可能欄位

[可能配置] 欄位應該描述特定目錄專案是否可以在叢集堆積中配置。

此欄位的有效值應該是:

  • 0,這表示無法建立叢集的相關配置,而且 FirstCluster 和 DataLength 欄位實際上是未定義的 (結構,衍生自此範本的結構可能會重新定義這些欄位)

  • 1,這表示叢集的關聯配置可能,且 FirstCluster 和 DataLength 欄位已定義

6.3.4.2 NoFatChain 欄位

NoFatChain 欄位應該指出作用中的 FAT 是否描述指定的配置叢集鏈結。

此欄位的有效值應該是:

  • 0,這表示配置叢集鏈結的對應 FAT 專案有效,且實作應解譯它們;如果 [配置可能] 欄位包含值 0,或 [配置可能] 欄位包含值 1,而 FirstCluster 欄位包含值 0,則此欄位的唯一有效值為 0

  • 1,這表示相關聯的配置是一個連續的叢集系列;叢集的對應 FAT 專案無效,且實作不得加以解譯;實作可能會使用下列方程式來計算相關聯的配置大小:DataLength / (2個 SectorsPerClusterShift* 2BytesPerSectorShift) 四捨五入為最接近的整數

如果衍生自此範本的重要主要目錄專案結構會重新定義 GeneralPrimaryFlags 欄位,則任何相關聯配置叢集鏈結的對應 FAT 專案都是有效的。

6.3.5 FirstCluster 欄位

FirstCluster 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.2 節) 。

如果 NoFatChain 位為 1,FirstCluster 必須指向叢集堆積中的有效叢集。

衍生自此範本的重要主要目錄專案結構可能會重新定義 FirstCluster 和 DataLength 欄位。 衍生自此範本的其他結構,只有在 AllocationPossible 欄位包含值 0 時,才會重新定義 FirstCluster 和 DataLength 欄位。

6.3.6 DataLength 欄位

DataLength 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.3 節) 。

如果 NoFatChain 位為 1,DataLength 不得為零。 如果 FirstCluster 欄位為零,則 DataLength 也必須是零。

衍生自此範本的重要主要目錄專案結構可能會重新定義 FirstCluster 和 DataLength 欄位。 衍生自此範本的其他結構,只有在 AllocationPossible 欄位包含值 0 時,才會重新定義 FirstCluster 和 DataLength 欄位。

6.4 泛型次要目錄Entry 範本

次要目錄專案的集中用途是提供有關目錄專案集的其他資訊。 解譯泛型次要目錄Entry 範本的能力是必要的。

重要和良性次要目錄專案的定義會與次要 exFAT 修訂編號相互關聯。 支援此規格或後續規格的任何重要或良性次要目錄專案,定義是選擇性的。

所有次要目錄專案結構都衍生自泛型次要目錄Entry 範本 (請參閱 表 18) ,其衍生自 Generic DirectoryEntry 範本 (請參閱 第 6.2 節) 。

表 18 泛型次要目錄Entry 範本

欄位名稱

Offset

(位元組)

大小

(位元組)

註解
EntryType 0 1 此欄位是必要欄位,而 Section 6.4.1 會定義其內容。
GeneralSecondaryFlags 1 1 此欄位是必要欄位, 而 Section 6.4.2 會定義其內容。
CustomDefined 2 18 此欄位是必要欄位,衍生自此範本的結構會定義其內容。
FirstCluster 20 4 此欄位是必要欄位, 而 Section 6.4.3 會定義其內容。
DataLength 24 8 此欄位是必要欄位, 而 Section 6.4.4 會定義其內容。

6.4.1 EntryType 欄位

EntryType 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1 節)

6.4.1.1 TypeCode 欄位

TypeCode 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.1 節) 。

6.4.1.2 TypeImportance 欄位

TypeImportance 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.2 節) 。

6.4.1.2.1 重要次要目錄專案

重要次要目錄專案包含其包含目錄專案集之適當管理的關鍵資訊。 雖然支援任何特定的重要次要目錄專案是選擇性的,但無法辨識的重要目錄專案專案會將整個目錄專案集轉譯為無法辨識的 (,而超出適用目錄專案範本的定義) 。

不過,如果目錄專案集包含至少一個無法辨識實作的重要次要目錄專案,則實作最多應該解譯目錄專案集中目錄專案的範本,而不是與目錄專案集中任何目錄專案相關聯的資料, (檔案目錄專案是例外狀況。 請參閱 第 7.4 節) 。

6.4.1.2.2 良性次要目錄專案

良性次要目錄專案包含可用來管理其包含目錄專案集的其他資訊。 支援任何特定的良性次要目錄專案是選擇性的。 無法辨識的良性次要目錄專案不會將整個目錄專案集轉譯為無法辨識。

實作可能會忽略無法辨識的任何良性次要專案。

6.4.1.3 TypeCategory 欄位

TypeCategory 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.3 節) 。

針對此範本,此欄位的有效值為 1。

6.4.1.4 inUse 欄位

InUse 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.1.4 節) 。

6.4.2 GeneralSecondaryFlags 欄位

GeneralSecondaryFlags 欄位包含旗標 (請參閱 表 19) 。

表 19 一般一般SecondaryFlags 欄位結構

欄位名稱

Offset

(位)

大小

(位)

註解
可能的配置 0 1 此欄位是必要欄位,而 Section 6.4.2.1 會定義其內容。
NoFatChain 1 1 此欄位為必要欄位,第 6.4.2.2 節 會定義其內容。
CustomDefined 2 6 此欄位是必要欄位,而且衍生自此範本的結構可能會定義此欄位。
6.4.2.1 配置可能欄位

[可能配置] 欄位應具有與泛型主要目錄Entry 範本中相同名稱欄位的定義, (請參閱 第 6.3.4.1 節) 。

6.4.2.2 NoFatChain 欄位

NoFatChain 欄位應具有與泛型主要目錄Entry 範本中相同名稱欄位的定義, (請參閱 第 6.3.4.2 節) 。

6.4.3 FirstCluster 欄位

FirstCluster 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.2 節) 。

如果 NoFatChain 位為 1,則 FirstCluster 必須指向叢集堆積中的有效叢集。

6.4.4 DataLength 欄位

DataLength 欄位應符合 Generic DirectoryEntry 範本中提供的定義, (請參閱 第 6.2.3 節) 。

如果 NoFatChain 位為 1,則 DataLength 不得為零。 如果 FirstCluster 欄位為零,則 DataLength 也必須是零。

7 目錄專案定義

exFAT 檔案系統的修訂 1.00 會定義下列目錄專案:

7.1 配置點陣圖目錄專案

在 exFAT 檔案系統中,FAT 不會描述叢集的配置狀態;而是配置點陣圖。 配置點陣圖存在於叢集堆積 (請參閱 第 7.1.5 節) ,並在根目錄中有對應的主要目錄專案, (請參閱 表 20) 。

NumberOfFats 欄位會決定根目錄中有效配置點陣圖目錄專案的數目。 如果 NumberOfFats 欄位包含值 1,則配置點陣圖目錄專案的唯一有效數目是 1。 此外,只有一個配置點陣圖目錄專案描述第一個配置點陣圖 (請參閱 第 7.1.2.1 節) 時才有效。 如果 NumberOfFats 欄位包含值 2,則配置點陣圖目錄專案的唯一有效數目是 2。 此外,只有在其中一個描述第一個配置點陣圖,而另一個描述第二個配置點陣圖時,這兩個配置點陣圖目錄專案才有效。

表 20 配置點陣圖目錄實體結構

欄位名稱

Offset

(位元組)

大小

(位元組)

註解
EntryType 0 1 此欄位是必要欄位,而 Section 7.1.1 會定義其內容。
BitmapFlags 1 1 此欄位是必要欄位,而 Section 7.1.2 會定義其內容。
保留 2 18 此欄位為必要欄位,並保留其內容。
FirstCluster 20 4 此欄位是必要欄位,第 7.1.3 節 會定義其內容。
DataLength 24 8 此欄位是必要欄位,第 7.1.4 節 會定義其內容。

7.1.1 EntryType 欄位

EntryType 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1 節) 。

7.1.1.1 TypeCode 欄位

TypeCode 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.1 節) 。

對於 [配置點陣圖] 目錄專案,此欄位的有效值為 1。

7.1.1.2 TypeImportance 欄位

TypeImportance 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.2 節) 。

對於配置點陣圖目錄專案,此欄位的有效值為 0。

7.1.1.3 TypeCategory 欄位

TypeCategory 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.3 節) 。

7.1.1.4 InUse 欄位

InUse 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.4 節) 。

7.1.2 BitmapFlags 欄位

BitmapFlags 欄位包含旗標 (請參閱 表格 21) 。

表 21 BitmapFlags 欄位結構

欄位名稱

Offset

(位)

大小

(位)

註解
BitmapIdentifier 0 1 此欄位是必要欄位, 而第 7.1.2.1 節 會定義其內容。
保留 1 7 此欄位是必要欄位,且其內容是保留的。
7.1.2.1 BitmapIdentifier 欄位

BitmapIdentifier 欄位應指出指定目錄專案所描述的配置點陣圖。 實作應該使用第一個配置點陣圖搭配第一個 FAT,而且應該使用第二個配置點陣圖搭配第二個 FAT。 ActiveFat 欄位描述哪些 FAT 和配置點陣圖為作用中。

此欄位的有效值應該是:

  • 0,這表示指定的目錄專案描述第一個配置點陣圖

  • 1,這表示指定的目錄專案描述第二個配置點陣圖,而且只有在 NumberOfFats 包含值 2 時才可行

7.1.3 FirstCluster 欄位

FirstCluster 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.5 節) 。

此欄位包含叢集鏈結第一個叢集的索引,如 FAT 所描述,其裝載配置點陣圖。

7.1.4 DataLength 欄位

DataCluster 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.6 節) 。

7.1.5 配置點陣圖

配置點陣圖會記錄叢集堆積中的叢集配置狀態。 配置點陣圖中的每個位都指出其對應的叢集是否可供配置。

配置點陣圖代表從最低到最高索引的叢集 (請參閱 表 22) 。 基於歷史原因,第一個叢集具有索引 2。 注意:點陣圖中的第一個位是第一個位元組的最低順序位。

表 22 配置點陣圖結構

欄位名稱

Offset

(位)

大小

(位)

註解
BitmapEntry[2] 0 1 此欄位是必要欄位,第 7.1.5.1 節會定義其內容。

.

.

.

.

.

.

.

.

.

.

.

.

BitmapEntry[ClusterCount+1] ClusterCount - 1 1

此欄位是必要欄位, 而第 7.1.5.1 節 會定義其內容。

注意:主要和備份開機磁區都包含 [ClusterCount] 欄位。

保留 ClusterCount (DataLength * 8) – ClusterCount

此欄位是必要欄位,如果有任何內容,則會保留其內容。

注意:主要和備份開機磁區都包含 [ClusterCount] 欄位。

7.1.5.1 BitmapEntry[2] ...BitmapEntry[ClusterCount+1] 欄位

此陣列中的每個 BitmapEntry 欄位都代表叢集堆積中的叢集。 BitmapEntry[2] 代表叢集堆積中的第一個叢集,而 BitmapEntry[ClusterCount+1] 代表叢集堆積中的最後一個叢集。

這些欄位的有效值應該是:

  • 0,描述對應叢集可供配置

  • 1,其中將對應的叢集描述為無法配置 (叢集配置可能已經取用對應的叢集,或作用中的 FAT 可能會將對應的叢集描述為不正確的)

7.2 Up-case Table Directory Entry

Up-case Table 會定義從小寫到大寫字元的轉換。 這很重要,因為檔案名目錄專案 (請參閱使用 Unicode 字元的第 7.7 節) ,以及不區分大小寫且保留大小寫的 exFAT 檔案系統。 叢集堆積中有 Up-case Table (請參閱 第 7.2.5 節) ,並在根目錄中有對應的重要主要目錄專案, (請參閱 表格 23) 。 Up-case Table 目錄專案的有效數目為 1。

由於 Up-case Table 與檔案名之間的關聯性,實作不應該修改 Up-case Table,但格式作業的結果除外。

表 23 Up-case Table DirectoryEntry 結構

欄位名稱

Offset

(位元組)

大小

(位元組)

註解
EntryType 0 1 此欄位是必要欄位, 而第 7.2.1 節 會定義其內容。
Reserved1 1 3 此欄位是必要欄位,且其內容是保留的。
TableChecksum 4 4 此欄位是必要欄位, 而第 7.2.2 節 會定義其內容。
Reserved2 8 12 此欄位是必要欄位,且其內容是保留的。
FirstCluster 20 4 此欄位是必要欄位,第 7.2.3 節 會定義其內容。
DataLength 24 8 此欄位是必要欄位,第 7.2.4 節 會定義其內容。

7.2.1 EntryType 欄位

EntryType 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1 節) 。

7.2.1.1 TypeCode 欄位

TypeCode 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.1 節) 。

針對 Up-case Table 目錄專案,此欄位的有效值為 2。

7.2.1.2 TypeImportance 欄位

TypeImportance 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.2 節) 。

針對 Up-case Table 目錄專案,此欄位的有效值為 0。

7.2.1.3 TypeCategory 欄位

TypeCategory 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.3 節) 。

7.2.1.4 InUse 欄位

InUse 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.1.4 節) 。

7.2.2 TableChecksum 欄位

TableChecksum 欄位包含 Up-case Table (總和檢查碼,FirstCluster 和 DataLength 欄位會描述) 。 實作應該先確認此欄位的內容在使用 Up-case Table 之前有效。

圖 3 TableChecksum 計算

UInt32 TableChecksum
(
    UCHAR  * Table,    // points to an in-memory copy of the up-case table
    UInt64   DataLength
)
{
    UInt32 Checksum = 0;
    UInt64 Index;

    for (Index = 0; Index < DataLength; Index++)
    {
        Checksum = ((Checksum&1) ? 0x80000000 : 0) + (Checksum>>1) + (UInt32)Table[Index];
    }

    return Checksum;
}

7.2.3 FirstCluster 欄位

FirstCluster 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.5 節) 。

此欄位包含叢集鏈結之第一個叢集的索引,如 FAT 所述,其裝載 Up-case Table。

7.2.4 DataLength 欄位

DataCluster 欄位應符合泛型主要目錄Entry 範本中提供的定義, (請參閱 第 6.3.6 節) 。

7.2.5 Up-case 資料表

Up-case 資料表是一系列的 Unicode 字元對應。 字元對應是由 2 位元組欄位所組成,其上寫資料表中的欄位索引代表要向上大小寫的 Unicode 字元,以及代表上寫 Unicode 字元的 2 位元組欄位。

前 128 個 Unicode 字元具有強制對應 (請參閱 表 24) 。 具有前 128 個 Unicode 字元之任何其他字元對應的 Up-case 資料表無效。

僅支援必要對應範圍字元的實作可能會忽略其餘 up-case 資料表的對應。 這類實作只能在透過 [檔案名] 目錄專案建立或重新命名 (檔案時,使用來自強制對應範圍的字元,請參閱 第 7.7 節) 。 將現有檔案名調整大小寫時,這類實作不得從非強制對應範圍向上寫字元,但應該將它們保留在產生的大小寫檔案名中, (這是部分向上大小寫) 。 比較檔案名時,這類實作應該將與比較中名稱不同的檔案名,只將非強制對應範圍的 Unicode 字元視為相等。 雖然這類檔案名可能相等,但這類實作無法確保完全大小寫的檔案名不會與比較下的名稱衝突。

表 24 必要前 128 個向上案例資料表專案

資料表索引 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7
0000h 0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h
0008h 0008h 0009h 000Ah 000Bh 000Ch 000Dh 000Eh 000Fh
0010h 0010h 0011h 0012h 0013h 0014h 0015h 0016h 0017h
0018h 0018h 0019h 001Ah 001Bh 001Ch 001Dh 001Eh 001Fh
0020h 0020h 0021h 0022h 0023h 0024h 0025h 0026h 0027h
0028h 0028h 0029h 002Ah 002Bh 002Ch 002Dh 002Eh 002Fh
0030h 0030h 0031h 0032h 0033h 0034h 0035h 0036h 0037h
0038h 0038h 0039h 003Ah 003Bh 003Ch 003Dh 003Eh 003Fh
0040h 0040h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0048h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0050h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0058h 0058h 0059h 005Ah 005Bh 005Ch 005Dh 005Eh 005Fh
0060h 0060h 0041h 0042h 0043h 0044h 0045h 0046h 0047h
0068h 0048h 0049h 004Ah 004Bh 004Ch 004Dh 004Eh 004Fh
0070h 0050h 0051h 0052h 0053h 0054h 0055h 0056h 0057h
0078h 0058h 0059h 005Ah 007Bh 007Ch 007Dh 007Eh 007Fh

(注意:具有非身分識別向上案例對應的專案會以粗體)

格式化磁片區時,實作可能會使用識別對應壓縮來產生壓縮格式的上寫資料表,因為大部分的 Unicode 字元空間沒有大小寫 (的概念,這表示「小寫」和「大寫」字元相等) 。 實作會藉由使用 FFFFh 值來表示一系列識別對應,後面接著識別對應數目,以壓縮向上案例資料表。

例如,實作可能代表前 100 個 (64h) 字元對應,其中包含壓縮大小寫資料表的下列八個專案:

FFFFh、0061h、0041h、0042h、0043h

前兩個專案表示前 97 個 (61h) 字元, (從 0000h 到 0060h) 具有識別對應。 後續字元 0061h 到 0063h,分別對應至字元 0041h 到 0043h。

在格式化磁片區時,提供壓縮大小寫資料表的能力是選擇性的。 不過,解譯未壓縮和壓縮大小寫資料表的能力是必要的。 TableChecksum 欄位的值一律符合磁片區上的上寫資料表存在方式,可能是壓縮或未壓縮的格式。

格式化磁片區時,實作應該以壓縮格式記錄建議的案例資料表, (請參閱 表格 25) ,其中 TableChecksum 欄位的值是 E619D30Dh。

如果實作定義自己的大小寫資料表,可能是壓縮或未壓縮,則該資料表應涵蓋從字元碼 0000h 到 FFFFh 內含) 的完整 Unicode 字元範圍 (。