16 32 参数值 OEM 定义
具体结构如下:
#define OEM_FLASH_PARAMETER_GUID 0A0C7E46-3399-4021-90C8-FA6D389C4BA2
struct
{
GUID OemParameterType; //Value is OEM_FLASH_PARAMETER_GUID
UINT32 EraseBlockSize; //Erase block size in bytes
UNIT32 PageSize;
UNIT32 NumberOfSpareBlocks;
UNIT32 tRandomAccess; //Random Access Time in nanoseconds
UNIT32 tProgram; //Program time in nanoseconds
UNIT32 tReadCycle; //Serial read circle time in nanoseconds
UNIT32 tWriteCycle; //Write Cycle time in nanoseconds
UCHAR Reserved[4];
}
FlashParameters;
UNIT32 BootChecksum(constunsignedchardata[], intbytes)
{
UINT32 checksum = 0;
for (inti = 0; i < bytes; i++)
{
if (i == 106 || i == 107 || i == 112)
continue;
checksum = (checksum<< 31) | (checksum>> 1) + data[i];
}
returnchecksum;
}
2.2.1 文件分配表 (FAT)
文件分配表可能有1个或2个FAT组成,它定义在 NumberOfFats 项中,
ActiveFat 单元在引导扇区的 VolumeFlags 中,已确定 FAT是否活动。
第一个簇是 cluster 2开始,像 FAT32 一样, 每个 FatEntry代表一个簇。
在 exFAT 中 ,FAT 表不用于追踪是否分配,用Allocation Bitmap来替代它,
FAT用来维护碎片文件簇的交叉链,假如文件没有碎片,FAT表则不需要更新。
一个 Directory Entry 扩展流将被用于确定FAT交叉链是否有效,假如不需要则为空
偏移量 大小 目标 注释
================================================================
0 4 FatEntry[0] 媒体类型(0xFFFFFFF8)
4 4 FatEntry[1] 0xFFFFFFFF
8 4 FatEntry[2] 第一个簇
.............
(ClusterCount + 1) * 4 4 FatEntry[ClusterCount +1] 最后一个簇
(ClusterCount + 2) * 4 剩余扇区 剩余空间
FatEntry 内容如下:
•0x00000002 – ClusterCount +1 (max 0xFFFFFFF6) – next cluster in the chain
•0xFFFFFFF7 – bad cluster
•0xFFFFFFF8 – media descriptor
•0xFFFFFFFF – end of file (EOF mark)
•Root Directory
•Files
•Directories
•Bitmap Allocation Table
•UP-Case Table
2.2.2 目录结构
exFAT 使用树状结构来描述文件和目录之间的关系。根目录树定义目录在 RootDirectoryCluster 之中。
子目录单向连接到它,(.)和(..)目录指向自己本身和父目录这像 FAT16/FAT32一样。
每个 directory 包括一系列的目录条目,目录条目的优先等级如下:
•Primary Directory Entries
1.Critical Primary Entries
2.Benign Primary Entries
•Secondary Directory Entries
1.Critical Primary Entries
2.Benign Primary Entries
Critical entries 是必须项,benign entries是可选的,Primary directory entries对应文件系统中的条目,
Secondary directory entries 是 primary directory entry 数据扩展和关联。
一组 primary/secondary entries 组成 directory entry 设置文件或目录,
设置第一个 directory entry 为 primary directory entry,所有子条目必须是 Secondary directory entries 。
每个目录项都是从通用目录项中派生出来的,目录项的大小为 32个字节:
Generic Directory Entry Template
偏移量 大小 目标 注释
===============================================================
0 1 条目类型
bit size Description Comments
-------------------------------------------------------------
0~4 5 code
5 1 Importance 0 – Critical entry, 1 – Benign entry
6 1 Category 0 – Primary entry, 1 – Secondary entry
7 1 In use status 0 – Not in use, 1 – In use
1 19 自定义
20 4 第一簇 0 – 没有使用 2..ClusterCount+1 – cluster index
24 8 数据长度 单位字节
条目类型值如下:
•0x00 – End Of Directory marker. All other fields in directory entry are invalid.
All subsequent directory entries are also End Of Directory markers
•0x01-0x7F (InUse = 0). All other fields in this entry are not defined
•0x81-0xFF (InUse = 1). Regular record with all fields defined.
Generic Primary Directory Entry Template
偏移量 大小 目标 注释
===============================================================
0 1 条目类型
1 1 secondary entries 计数 主目录项的次项的数目 0~255
2 2 SetChecksum 所有 directory entries 的校验和除了此项
参考 EntrySetCheckSum ().
4 2 通用主项标志
bit size Description Comments
-------------------------------------------------------------------------------------
0 1 AllocationPossible 0-not possible
(FirstCluster and DataLength 没定义)
1-possible
1 1 NoFatChain 0-FAT cluster chain is valid
1-FAT cluster chain is not used (contiguous data)
2 14 CustomDefined
6 14 自定义
20 4 第一簇
24 8 数据长度
所有 critical primary directory 位于根目录中(除了文件目录条目)
Benign primary directory 为可选项,假如一个 benign primary entry 不正确,所有目录条目将被忽略。
Generic Secondary Directory Entry Template
偏移量 大小 目标 注释
===============================================================
0 1 条目类型
1 1 通用次项标志
bit size Description Comments
-------------------------------------------------------------------------------------
0 1 AllocationPossible
1 1 NoFatChain
2 14 CustomDefined
2 18 自定义
20 4 第一簇
24 8 数据长度
Defined Directory Entries
EntryType Primary Critical Code Directory Entry
===============================================================
0x81 • • 1 Allocation Bitmap
0x82 • • 2 Up-case Table
0x83 • • 3 Volume Label
0x85 • 5 File
0xA0 • 0 Volume GUID
0xA1 • 1 TexFAT Padding
0xA2 • 2 Windows CE Access Control Table
0xC0 • 0 Stream Extension
0xC1 • 1 File Name
Allocation Bitmap Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0x81
1 1 BitmapFlags Indicates which Allocation Bitmap the given entry describes
bits size Description Comments
--------------------------------------------------------------------------------------------
0 1 Bitmapidentifier 0 – 1st bitmap, 1 -2nd bitmap
1 7 Reserved
2 18 保留字段
20 4 第一簇
24 8 数据长度
bitmaps 数目 和 Bitmap Allocation entries 数等于FATs数,例如TexFAT中2个FATs,bit0 表示哪一个bitmap和FAT。
第一个Allocation Bitmap应该被第一个FAT使用,第二个Allocation Bitmap应该被第二个FAT使用
引导扇区 ActiveFat 定义哪个为活动的 bitmap和FAT。
Bitmap 的字节大小必须在卷中的一个簇整除以8和向上进位。
Up-Case Table Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0x82
1 3 保留字段1
4 4 TableChecksum Up-case 表校验和
8 12 保留字段2
20 4 第一簇
24 8 数据长度
校验和的计算方法代码如下:
UNIT32 UpCaseTableChecksum(constunsignedchardata[], intbytes)
{
UINT32 checksum = 0;
for (inti = 0; i < bytes; i++)
checksum = (checksum<< 31) | (checksum>> 1) + data[i];
returnchecksum;
}
Volume Label Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0x83
1 1 字符数 Unicode 字符长度 (最大 11)
2 22 卷标 Unicode 字符串
24 8 保留字段
假如卷格式化后没有标识,Volume Label Directory Entry的条目类型应该设为 0x03 (不被使用)
File Directory Entry
File Directory Entry描述文件和目录内容,
It is a primary critical directory entry and must be immediately followed by 1 Stream Extension directory entry
and from 1 to 17 File Name directory entries .
Those 3-19 directory entries comprise a directory entry set describing a single file or a directory.
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0x85
1 1 SecondaryCount 必须设为 2 到 18
2 2 SetChecksum
4 2 文件属性
bits size Attribute Comments
--------------------------------------------------------------------------------------------
0 1 只读
1 1 隐藏
2 1 系统
3 1 保留1
4 1 目录
5 1 存档
6 10 保留2
6 2 保留字段1
8 4 创建时间
12 4 最后修改时间
16 4 最后访问时间
20 1 创建 10ms 增量 0 .. 199
21 1 最后修改 10ms 增量 0 .. 199
22 1 创建时区偏移量 偏移量为UTC 15分钟递增
23 1 最后修改时区偏移量 偏移量为UTC 15分钟递增
24 1 最后访问时区偏移量 偏移量为UTC 15分钟递增
25 7 保留字段2
Timestamp Format
Bits Size Description Comments
---------------------------------------------------------------------------------------------------------------------------------
0-4 5 秒(2秒计数单位) 0..29 (29 代表 58秒)
5-10 6 分 0..59
11-15 5 小时 0..23
16-20 5 天 0..31
21-24 4 月 1..12
25-31 7 年(1980年起始) 0 代表 1980
Timestamp format 秒数是2秒计数,所以需要 10ms 增量来修正 2秒时间的精度,有效值是0..199。
Timestamp 记录本地时间时,时区偏移量为15分钟递增。
Time Zone Offset Table
TimezoneOffset field TZ Offset Time Zone Comments
---------------------------------------------------------------------------------------------------------------------------------
128 (0x80) UTC Greenwich Standard Time
132 (0x84) UTC+01:00 Central Europe Time
136 (0x88) UTC+02:00 Eastern Europe Standard Time
140 (0x8C) UTC+03:00 Moscow Standard Time
144 (0x90) UTC+04:00 Arabian Standard Time
148 (0x94) UTC+05:00 WestAsiaStandardTime
152 (0x98) UTC+06:00 CentralAsiaStandardTime
156 (0x9C) UTC+07:00 NorthAsiaStandardTime
160 (0xA0) UTC+08:00 NorthAsiaEastStandardTime
164 (0xA4) UTC+09:00 TokyoStandardTime
168 (0xA8) UTC+10:00 WestPacificStandardTime
172 (0xAC) UTC+11:00 CentralPacificStandardTime
176 (0xB0) UTC+12:00 NewZealandStandardTime
180 (0xB4) UTC+13:00 TongaStandardTime
208 (0xD0) UTC-12:00 DatelineStandardTime
212 (0xD4) UTC-11:00 SamoaStandardTime
216 (0xD8) UTC-10:00 HawaiiStandardTime
220 (0xDC) UTC-09:00 AlaskaStandardTime
224 (0xE0) UTC-08:00 PacificStandardTime
228 (0xE4) UTC-07:00 MountainStandardTime
232 (0xE8) UTC-06:00 CentralStandardTime
236 (0xEC) UTC-05:00 EasternStandardTime
240 (0xF0) UTC-04:00 AtlanticStandardtime
242 (0xF2) UTC-03:00 NewfoundlandStandardTime
244 (0xF4) UTC-03:00 GreenlandStandardTime
248 (0xF8) UTC-02:00 Mid-AtlanticStandardTime
252 (0xFC) UTC-01:00 AzoresStandardTime
Volume GUID Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0xA0
1 1 SecondaryCount 必须设 0
2 2 SetChecksum
4 2 GeneralPrimaryFlags
bits Size Attribute Comments
--------------------------------------------------------------------------------------------
0 1 AllocationPossible 必须设 0
1 1 NoFatChain 必须设 0
2 14 CustomDefined
6 16 VolumeGuid 所有值都有效,除了空的
GUID{00000000-0000-0000-0000-000000000000}
22 10 保留字段
这是一个benign primary directory entry 并可能在文件系统中不存在
TexFAT Padding Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0xA1
1 31 保留字段
exFat 1.00 没有定义 TexFAT Padding Directory Entry,TexFAT Padding Directory Entry只在目录第一个簇时有效
TexFAT Padding Directory Entry不能被移动。
Windows CE Access Control Table Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0xA2
1 31 保留字段
exFat 1.00 没有定义 Windows CE Access Control Table Directory Entry。
Stream Extension Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0xC0
1 1 GeneralSecondaryFlags
bits size Description Comments
--------------------------------------------------------------------------------------------
0 1 AllocationPossible 必须设 1
1 1 NoFatChain
2 14 CustomDefined
2 1 保留字段1
3 1 NameLength 子文件目录项中的 Unicode 名字的长度
4 2 NameHash 大写文件名的 Hash 值
6 2 保留字段2
8 8 有效数据长度 必须设为0到数据长度之间
16 4 保留字段3
20 4 第一簇
24 8 数据长度 目录最大 256 M
Stream Extension directory entry 必须跟在 File directory entry 设置项后,
它有可能只有1个Stream Extension directory entry
如果 NoFatChain 标志设置,所有的簇是连续的。
NameHash 字段用于文件名的快速比较和优化大写文件名,
NameHash 验证对不匹配,但是匹配哈希值,不能保证平等 offile 名称。
如果名称的哈希值匹配,必须执行后续的完整名称比较。
NameHash 算法代码如下:
// fileName points to up-cased file name
UNIT16 NameHash(WCHAR *file Name, intnameLength)
{
UNIT16 hash = 0;
unsignedchar *data = ( unsignedchar*) fileName;
for ( inti = 0; i> 1) + data[i];
returnhash;
}
ValidDataLength 确定多少实际的数据写入到文件中。实施须更新此字段,如在写入数据。
有效的数据长度超出数据未定义和实施须返回零。
File Name Directory Entry
偏移量 大小 目标 注释
===============================================================
0 1 条目类型 0xC1
1 1 GeneralSecondaryFlags
bits size Description Comments
--------------------------------------------------------------------------------------------
0 1 AllocationPossible 必须设 0
1 1 NoFatChain 必须设 0
2 14 CustomDefined
2 30 文件名
File Name directory entries 必须跟在 Steam Extension directory entry 后,数目 NameLength/15 向上舍入。
文件名称条目的最大数量是 17,每个可容纳最多 15 个 Unicode 字符和最大文件名称的长度是 255。未用的部分的文件名字段必须设置为 0x0000。
Invalid File Name Characters
Character Code Character Description
===============================================================
0x0000 – 0x001F Control codes
0x0022 “ Quotation mark
0x002A ∗ Asterisk
0x002F / Forward slash
0x003A : Colon
0x003C < Less than
0x003E > Greater than
0x003F ? Question mark
0x005C \ Back slash
0x007C | Vertical bar