Go to the documentation of this file.
74 #define SIZEOF_DENTRY 32
77 #define ROOT_DIR_SECTORS(b) \
78 ((((b)->nr_root_entry * SIZEOF_DENTRY) + ((b)->sector_size - 1)) \
82 ((b)->size_of_fat16 ? \
83 (b)->size_of_fat16 : \
84 (b)->type.fat32.size_of_fat32)
86 #define FIRST_DATA_SECTOR(b) \
87 ((b)->reserved_sector + ((b)->nr_fat * FAT_SIZE(b)) \
88 + ROOT_DIR_SECTORS(b))
90 #define FIRST_SECTOR_OF_CLUSTER(b, N) \
91 (((N) - 2) * ((b)->sector_per_cluster) + FIRST_DATA_SECTOR(b))
93 #define TOTAL_SECTOR(b) \
94 ((b)->total_sector16 ? \
95 (b)->total_sector16 : \
98 #define NR_DATA_SECTOR(b) \
100 ((b)->reserved_sector + (b)->nr_fat * FAT_SIZE(b)) + \
103 #define COUNT_OF_CLUSTER(b) \
104 (NR_DATA_SECTOR(b) / (b)->sector_per_cluster)
106 #define IS_FAT12(b) \
107 (COUNT_OF_CLUSTER(b) < 4085)
109 #define IS_FAT16(b) \
110 (!IS_FAT12(b) && (COUNT_OF_CLUSTER(b) < 65525))
112 #define IS_FAT32(b) \
113 (COUNT_OF_CLUSTER(b) >= 65525)
119 #define COUNT_OF_VALID_MAX_CLUSTER(b) \
120 (COUNT_OF_CLUSTER(b) + 1)
122 #define FAT_OFFSET(b, N) \
123 (IS_FAT16(b) ? (N) << 1 \
124 : (IS_FAT32(b) ? (N) << 2 \
125 : (IS_FAT12(b) ? (N) + ((N)>>1) \
128 #define FAT_SECTOR_NUMBER(b, N) \
129 (FAT_OFFSET((b), (N)) / (b)->sector_size)
131 #define FAT_SECTORS(b, N) \
132 ((b)->reserved_sector + (N) * FAT_SIZE(b))
134 #define THIS_FAT_OFFSET(b, N) \
135 (FAT_SECTORS((b), (N)) * (b)->sector_size)
137 #define FAT_ENTRY_OFFSET(b, N) \
138 (FAT_OFFSET(b, (N)) % (b)->sector_size)
140 #define WORD(buf) ((unsigned short*)(buf))
141 #define DWORD(buf) ((unsigned int*)(buf))
143 #define FAT_EOF(bpb) (IS_FAT12(bpb) ? 0x0FF8 : \
144 IS_FAT16(bpb) ? 0xFFF8 : \
145 IS_FAT32(bpb) ? 0x0FFFFFF8 : 0)
147 static inline int get_cluster_entry_value(
struct bpb *
bpb,
char *table,
int cluster)
156 return *
DWORD(tmp) & 0x0FFFFFFF;
164 if (cluster & 0x0001) {
165 return *
WORD(tmp) >> 4;
167 return *
WORD(tmp) & 0x0FFF;
174 #define SET_CLUSTER_ENTRY_VALUE(b, B, N, val) \
177 *DWORD((B) + FAT_ENTRY_OFFSET(b, N)) = (val); \
178 } else if (IS_FAT32(b)) { \
179 (val) = (val) & 0x0FFFFFFF; \
180 *DWORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0xF0000000;\
181 *DWORD((B) + FAT_ENTRY_OFFSET(b, N)) |= (val); \
183 if ((N) & 0x0001) { \
184 (val) = (val) << 4; \
185 *WORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0x000F;\
187 (val) = (val) & 0x0FFF; \
188 *WORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0xF000;\
190 *WORD((B) + FAT_ENTRY_OFFSET(b, N)) |= (val); \
194 #define IS_EOF(b, v) \
195 (IS_FAT12(b) ? (v) >= 0x0FF8 \
196 : IS_FAT16(b) ? (v) >= 0xFFF8 \
197 : IS_FAT32(b) ? (v) >= 0x0FFFFFF8 \
200 #define BAD_CLUSTER12 0x0FF7
201 #define BAD_CLUSTER16 0xFFF7
202 #define BAD_CLUSTER32 0x0FFFFFF7
204 #define UPDATE_FAT_SIZE(b, dsksz) do { \
205 unsigned int tmp[2]; \
206 unsigned int fatsz; \
207 tmp[0] = (dsksz) - ((b)->reserved_sector + ROOT_DIR_SECTORS(b)); \
208 tmp[1] = (256 * (b)->sector_per_cluster) + (b)->nr_fat; \
212 fatsz = (tmp[0] + (tmp[1] - 1)) / tmp[1]; \
214 (b)->size_of_fat16 = 0; \
215 (b)->type.fat32.size_of_fat32 = fatsz; \
217 (b)->size_of_fat16 = fatsz & 0x0000FFFF; \
221 #define FIRST_ROOTDIR_SECTOR(b) \
222 ((b)->reserved_sector + (b)->nr_fat * FAT_SIZE(b))
224 #define GET_FIRST_BLOCK(d) \
225 ((d)->first_cluster_hi << 16 | (d)->first_cluster_lo)
242 #define IS_FREE_DENTRY(d) \
243 ((unsigned char)((d)->name[0] == (unsigned char)DELETED_FLAG) \
244 || ((d)->name[0] == 0x00))
246 #define IS_KANJI_NAME(d) ((d)->name[0] == 0x05)
247 #define IS_VALID_CHAR_FOR_NAME(ch) (!(((ch) != 0x05 && (ch) < 0x20) && (ch) != 0x22 && ((ch) >= 0x2A && (ch) <= 0x2F) && ((ch) >= 0x3A && (ch) <= 0x3F) && (ch) != 0x5B && (ch) != 0x5C && (ch) != 0x5D && (ch) != 0x7C))
267 #define DAY_OF_MONTH(e) ((e)->write_date & 0x000Fu)
268 #define MONTH_OF_YEAR(e) (((e)->write_date >> 4) & 0x000Fu)
269 #define COUNT_OF_YEAR(e) (1980 + (((e)->write_date >> 8) & 0x00FFu))
272 #define SECOND_COUNT(e) ((e)->write_time & 0x000Fu)
273 #define MINUTES(e) (((e)->write_time >> 4) & 0x003F)
274 #define HOURS(e) (((e)->write_time >> 10) & 0x001F)
288 #define LAST_LONG_ENTRY 0x40
290 #define IS_LAST_SLOT(e) (((e)->ord & LAST_LONG_ENTRY) == 0)