이 파일의 문서화 페이지로 가기
73 #define SIZEOF_DENTRY 32
76 #define ROOT_DIR_SECTORS(b) \
77 ((((b)->nr_root_entry * SIZEOF_DENTRY) + ((b)->sector_size - 1)) \
81 ((b)->size_of_fat16 ? \
82 (b)->size_of_fat16 : \
83 (b)->type.fat32.size_of_fat32)
85 #define FIRST_DATA_SECTOR(b) \
86 ((b)->reserved_sector + ((b)->nr_fat * FAT_SIZE(b)) \
87 + ROOT_DIR_SECTORS(b))
89 #define FIRST_SECTOR_OF_CLUSTER(b, N) \
90 (((N) - 2) * ((b)->sector_per_cluster) + FIRST_DATA_SECTOR(b))
92 #define TOTAL_SECTOR(b) \
93 ((b)->total_sector16 ? \
94 (b)->total_sector16 : \
97 #define NR_DATA_SECTOR(b) \
99 ((b)->reserved_sector + (b)->nr_fat * FAT_SIZE(b)) + \
102 #define COUNT_OF_CLUSTER(b) \
103 (NR_DATA_SECTOR(b) / (b)->sector_per_cluster)
105 #define IS_FAT12(b) \
106 (COUNT_OF_CLUSTER(b) < 4085)
108 #define IS_FAT16(b) \
109 (!IS_FAT12(b) && (COUNT_OF_CLUSTER(b) < 65525))
111 #define IS_FAT32(b) \
112 (COUNT_OF_CLUSTER(b) >= 65525)
118 #define COUNT_OF_VALID_MAX_CLUSTER(b) \
119 (COUNT_OF_CLUSTER(b) + 1)
121 #define FAT_OFFSET(b, N) \
122 (IS_FAT16(b) ? (N) << 1 \
123 : (IS_FAT32(b) ? (N) << 2 \
124 : (IS_FAT12(b) ? (N) + ((N)>>1) \
127 #define FAT_SECTOR_NUMBER(b, N) \
128 (FAT_OFFSET((b), (N)) / (b)->sector_size)
130 #define FAT_SECTORS(b, N) \
131 ((b)->reserved_sector + (N) * FAT_SIZE(b))
133 #define THIS_FAT_OFFSET(b, N) \
134 (FAT_SECTORS((b), (N)) * (b)->sector_size)
136 #define FAT_ENTRY_OFFSET(b, N) \
137 (FAT_OFFSET(b, (N)) % (b)->sector_size)
139 #define WORD(buf) ((unsigned short*)(buf))
140 #define DWORD(buf) ((unsigned int*)(buf))
142 #define FAT_EOF(bpb) (IS_FAT12(bpb) ? 0x0FF8 : \
143 IS_FAT16(bpb) ? 0xFFF8 : \
144 IS_FAT32(bpb) ? 0x0FFFFFF8 : 0)
146 static inline int get_cluster_entry_value(
struct bpb *
bpb,
char *table,
int cluster)
154 return *
DWORD(tmp) & 0x0FFFFFFF;
161 if (cluster & 0x0001)
162 return *
WORD(tmp) >> 4;
164 return *
WORD(tmp) & 0x0FFF;
170 #define SET_CLUSTER_ENTRY_VALUE(b, B, N, val) \
173 *DWORD((B) + FAT_ENTRY_OFFSET(b, N)) = (val); \
174 } else if (IS_FAT32(b)) { \
175 (val) = (val) & 0x0FFFFFFF; \
176 *DWORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0xF0000000;\
177 *DWORD((B) + FAT_ENTRY_OFFSET(b, N)) |= (val); \
179 if ((N) & 0x0001) { \
180 (val) = (val) << 4; \
181 *WORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0x000F;\
183 (val) = (val) & 0x0FFF; \
184 *WORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0xF000;\
186 *WORD((B) + FAT_ENTRY_OFFSET(b, N)) |= (val); \
190 #define IS_EOF(b, v) \
191 (IS_FAT12(b) ? (v) >= 0x0FF8 \
192 : IS_FAT16(b) ? (v) >= 0xFFF8 \
193 : IS_FAT32(b) ? (v) >= 0x0FFFFFF8 \
196 #define BAD_CLUSTER12 0x0FF7
197 #define BAD_CLUSTER16 0xFFF7
198 #define BAD_CLUSTER32 0x0FFFFFF7
200 #define UPDATE_FAT_SIZE(b, dsksz) do { \
201 unsigned int tmp[2]; \
202 unsigned int fatsz; \
203 tmp[0] = (dsksz) - ((b)->reserved_sector + ROOT_DIR_SECTORS(b)); \
204 tmp[1] = (256 * (b)->sector_per_cluster) + (b)->nr_fat; \
208 fatsz = (tmp[0] + (tmp[1] - 1)) / tmp[1]; \
210 (b)->size_of_fat16 = 0; \
211 (b)->type.fat32.size_of_fat32 = fatsz; \
213 (b)->size_of_fat16 = fatsz & 0x0000FFFF; \
217 #define FIRST_ROOTDIR_SECTOR(b) \
218 ((b)->reserved_sector + (b)->nr_fat * FAT_SIZE(b))
220 #define GET_FIRST_BLOCK(d) \
221 ((d)->first_cluster_hi << 16 | (d)->first_cluster_lo)
238 #define IS_FREE_DENTRY(d) \
239 ((unsigned char)((d)->name[0] == (unsigned char)DELETED_FLAG) \
240 || ((d)->name[0] == 0x00))
242 #define IS_KANJI_NAME(d) ((d)->name[0] == 0x05)
243 #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))
263 #define DAY_OF_MONTH(e) ((e)->write_date & 0x000Fu)
264 #define MONTH_OF_YEAR(e) (((e)->write_date >> 4) & 0x000Fu)
265 #define COUNT_OF_YEAR(e) (1980 + (((e)->write_date >> 8) & 0x00FFu))
268 #define SECOND_COUNT(e) ((e)->write_time & 0x000Fu)
269 #define MINUTES(e) (((e)->write_time >> 4) & 0x003F)
270 #define HOURS(e) (((e)->write_time >> 10) & 0x001F)
284 #define LAST_LONG_ENTRY 0x40
286 #define IS_LAST_SLOT(e) (((e)->ord & LAST_LONG_ENTRY) == 0)