FatFileSystem.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /** @file
  2. Definitions for on-disk FAT structures.
  3. Copyright (c) 2005 - 2017, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #ifndef _FATFILESYSTEM_H_
  7. #define _FATFILESYSTEM_H_
  8. #pragma pack(1)
  9. //
  10. // FAT info signature
  11. //
  12. #define FAT_INFO_SIGNATURE 0x41615252
  13. #define FAT_INFO_BEGIN_SIGNATURE 0x61417272
  14. #define FAT_INFO_END_SIGNATURE 0xAA550000
  15. //
  16. // FAT entry values
  17. //
  18. #define FAT_CLUSTER_SPECIAL_EXT (MAX_UINTN & (~0xF))
  19. #define FAT_CLUSTER_SPECIAL ((FAT_CLUSTER_SPECIAL_EXT) | 0x07)
  20. #define FAT_CLUSTER_FREE 0
  21. #define FAT_CLUSTER_RESERVED (FAT_CLUSTER_SPECIAL)
  22. #define FAT_CLUSTER_BAD (FAT_CLUSTER_SPECIAL)
  23. #define FAT_CLUSTER_LAST (-1)
  24. #define FAT_END_OF_FAT_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))
  25. #define FAT_MIN_CLUSTER 2
  26. #define FAT_MAX_FAT12_CLUSTER 0xFF5
  27. #define FAT_MAX_FAT16_CLUSTER 0xFFF5
  28. #define FAT_CLUSTER_SPECIAL_FAT12 0xFF7
  29. #define FAT_CLUSTER_SPECIAL_FAT16 0xFFF7
  30. #define FAT_CLUSTER_SPECIAL_FAT32 0x0FFFFFF7
  31. #define FAT_CLUSTER_MASK_FAT12 0xFFF
  32. #define FAT_CLUSTER_UNMASK_FAT12 0xF000
  33. #define FAT_CLUSTER_MASK_FAT32 0x0FFFFFFF
  34. #define FAT_CLUSTER_UNMASK_FAT32 0xF0000000
  35. #define FAT_POS_FAT12(a) ((a) * 3 / 2)
  36. #define FAT_POS_FAT16(a) ((a) * 2)
  37. #define FAT_POS_FAT32(a) ((a) * 4)
  38. #define FAT_ODD_CLUSTER_FAT12(a) (((a) & 1) != 0)
  39. //
  40. // FAT attribute define
  41. //
  42. #define FAT_ATTRIBUTE_READ_ONLY 0x01
  43. #define FAT_ATTRIBUTE_HIDDEN 0x02
  44. #define FAT_ATTRIBUTE_SYSTEM 0x04
  45. #define FAT_ATTRIBUTE_VOLUME_ID 0x08
  46. #define FAT_ATTRIBUTE_DIRECTORY 0x10
  47. #define FAT_ATTRIBUTE_ARCHIVE 0x20
  48. #define FAT_ATTRIBUTE_DEVICE 0x40
  49. #define FAT_ATTRIBUTE_LFN 0x0F
  50. //
  51. // Some Long File Name definitions
  52. //
  53. #define FAT_LFN_LAST 0x40 // Ordinal field
  54. #define MAX_LFN_ENTRIES 20
  55. #define LFN_CHAR1_LEN 5
  56. #define LFN_CHAR2_LEN 6
  57. #define LFN_CHAR3_LEN 2
  58. #define LFN_CHAR_TOTAL (LFN_CHAR1_LEN + LFN_CHAR2_LEN + LFN_CHAR3_LEN)
  59. #define LFN_ENTRY_NUMBER(a) (((a) + LFN_CHAR_TOTAL - 1) / LFN_CHAR_TOTAL)
  60. //
  61. // Some 8.3 File Name definitions
  62. //
  63. #define FAT_MAIN_NAME_LEN 8
  64. #define FAT_EXTEND_NAME_LEN 3
  65. #define FAT_NAME_LEN (FAT_MAIN_NAME_LEN + FAT_EXTEND_NAME_LEN)
  66. //
  67. // Some directory entry information
  68. //
  69. #define FAT_ENTRY_INFO_OFFSET 13
  70. #define DELETE_ENTRY_MARK 0xE5
  71. #define EMPTY_ENTRY_MARK 0x00
  72. //
  73. // Volume dirty Mask
  74. //
  75. #define FAT16_DIRTY_MASK 0x7fff
  76. #define FAT32_DIRTY_MASK 0xf7ffffff
  77. //
  78. // internal flag
  79. //
  80. #define FAT_CASE_MIXED 0x01
  81. #define FAT_CASE_NAME_LOWER 0x08
  82. #define FAT_CASE_EXT_LOWER 0x10
  83. typedef struct {
  84. UINT8 Ia32Jump[3];
  85. CHAR8 OemId[8];
  86. UINT16 SectorSize;
  87. UINT8 SectorsPerCluster;
  88. UINT16 ReservedSectors;
  89. UINT8 NumFats;
  90. UINT16 RootEntries; // < FAT32, root dir is fixed size
  91. UINT16 Sectors;
  92. UINT8 Media;
  93. UINT16 SectorsPerFat; // < FAT32
  94. UINT16 SectorsPerTrack; // (ignored)
  95. UINT16 Heads; // (ignored)
  96. UINT32 HiddenSectors; // (ignored)
  97. UINT32 LargeSectors; // Used if Sectors==0
  98. } FAT_BOOT_SECTOR_BASIC;
  99. typedef struct {
  100. UINT8 PhysicalDriveNumber; // (ignored)
  101. UINT8 CurrentHead; // holds boot_sector_dirty bit
  102. UINT8 Signature; // (ignored)
  103. CHAR8 Id[4];
  104. CHAR8 FatLabel[11];
  105. CHAR8 SystemId[8];
  106. } FAT_BOOT_SECTOR_EXT;
  107. typedef struct {
  108. UINT32 LargeSectorsPerFat; // FAT32
  109. UINT16 ExtendedFlags; // FAT32 (ignored)
  110. UINT16 FsVersion; // FAT32 (ignored)
  111. UINT32 RootDirFirstCluster; // FAT32
  112. UINT16 FsInfoSector; // FAT32
  113. UINT16 BackupBootSector; // FAT32
  114. UINT8 Reserved[12]; // FAT32 (ignored)
  115. UINT8 PhysicalDriveNumber; // (ignored)
  116. UINT8 CurrentHead; // holds boot_sector_dirty bit
  117. UINT8 Signature; // (ignored)
  118. CHAR8 Id[4];
  119. CHAR8 FatLabel[11];
  120. CHAR8 SystemId[8];
  121. } FAT32_BOOT_SECTOR_EXT;
  122. typedef union {
  123. FAT_BOOT_SECTOR_EXT FatBse;
  124. FAT32_BOOT_SECTOR_EXT Fat32Bse;
  125. } FAT_BSE;
  126. typedef struct {
  127. FAT_BOOT_SECTOR_BASIC FatBsb;
  128. FAT_BSE FatBse;
  129. } FAT_BOOT_SECTOR;
  130. //
  131. // FAT Info Structure
  132. //
  133. typedef struct {
  134. UINT32 ClusterCount;
  135. UINT32 NextCluster;
  136. } FAT_FREE_INFO;
  137. typedef struct {
  138. UINT32 Signature;
  139. UINT8 ExtraBootCode[480];
  140. UINT32 InfoBeginSignature;
  141. FAT_FREE_INFO FreeInfo;
  142. UINT8 Reserved[12];
  143. UINT32 InfoEndSignature;
  144. } FAT_INFO_SECTOR;
  145. //
  146. // Directory Entry
  147. //
  148. #define FAT_MAX_YEAR_FROM_1980 0x7f
  149. typedef struct {
  150. UINT16 Day : 5;
  151. UINT16 Month : 4;
  152. UINT16 Year : 7; // From 1980
  153. } FAT_DATE;
  154. typedef struct {
  155. UINT16 DoubleSecond : 5;
  156. UINT16 Minute : 6;
  157. UINT16 Hour : 5;
  158. } FAT_TIME;
  159. typedef struct {
  160. FAT_TIME Time;
  161. FAT_DATE Date;
  162. } FAT_DATE_TIME;
  163. typedef struct {
  164. CHAR8 FileName[11]; // 8.3 filename
  165. UINT8 Attributes;
  166. UINT8 CaseFlag;
  167. UINT8 CreateMillisecond; // (creation milliseconds - ignored)
  168. FAT_DATE_TIME FileCreateTime;
  169. FAT_DATE FileLastAccess;
  170. UINT16 FileClusterHigh; // >= FAT32
  171. FAT_DATE_TIME FileModificationTime;
  172. UINT16 FileCluster;
  173. UINT32 FileSize;
  174. } FAT_DIRECTORY_ENTRY;
  175. typedef struct {
  176. UINT8 Ordinal;
  177. CHAR8 Name1[10]; // (Really 5 chars, but not WCHAR aligned)
  178. UINT8 Attributes;
  179. UINT8 Type;
  180. UINT8 Checksum;
  181. CHAR16 Name2[6];
  182. UINT16 MustBeZero;
  183. CHAR16 Name3[2];
  184. } FAT_DIRECTORY_LFN;
  185. #pragma pack()
  186. #endif