ncloader  0.1
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 그룹들 페이지들
fat0.h
이 파일의 문서화 페이지로 가기
1 
11 struct bpb {
12  unsigned char jmp[2];
13  unsigned char nop;
14  unsigned char oem[8];
15  unsigned short sector_size;
16  unsigned char sector_per_cluster;
17  unsigned short reserved_sector;
18  unsigned char nr_fat;
19  unsigned short nr_root_entry;
20  unsigned short total_sector16;
21  unsigned char media_type;
22  unsigned short size_of_fat16;
23  unsigned short sector_per_track;
24  unsigned short nr_head;
25  unsigned int hidden_sector;
26  unsigned int total_sector32;
27 
28  /* FAT12/16 */
29  union {
30  struct {
31  unsigned char boot_drive;
32  unsigned char reserved;
33  unsigned char boot_signature;
34  unsigned int volume_id;
35  unsigned char volume_label[11];
36  unsigned char fs_type[8];
37  } __PACKED fat16;
38 
39  struct {
40  unsigned int size_of_fat32;
41  unsigned short ext_flags;
42  unsigned short version;
43  unsigned int root_cluster;
44  unsigned short info;
45  unsigned short backup_boot_sec;
46  unsigned char reserved1[12];
47 
48  unsigned char boot_drive;
49  unsigned char reserved;
50  unsigned char boot_signature;
51  unsigned int volume_id;
52  unsigned char volume_label[11];
53  unsigned char fs_type[8];
54  } __PACKED fat32;
55  } type;
56 } __PACKED;
57 
59  unsigned int DiskSize;
60  unsigned char SecPerClusVal;
61 };
62 
63 struct fat32_fsinfo {
64  unsigned int lead_sig;
65  unsigned char reserved1[480];
66  unsigned int struct_sig;
67  unsigned int free_count;
68  unsigned int next_free;
69  unsigned char reserved2[12];
70  unsigned int trail_sig;
71 } __PACKED((packed));
72 
73 #define SIZEOF_DENTRY 32
74 
76 #define ROOT_DIR_SECTORS(b) \
77  ((((b)->nr_root_entry * SIZEOF_DENTRY) + ((b)->sector_size - 1)) \
78  / (b)->sector_size)
79 
80 #define FAT_SIZE(b) \
81  ((b)->size_of_fat16 ? \
82  (b)->size_of_fat16 : \
83  (b)->type.fat32.size_of_fat32)
84 
85 #define FIRST_DATA_SECTOR(b) \
86  ((b)->reserved_sector + ((b)->nr_fat * FAT_SIZE(b)) \
87  + ROOT_DIR_SECTORS(b))
88 
89 #define FIRST_SECTOR_OF_CLUSTER(b, N) \
90  (((N) - 2) * ((b)->sector_per_cluster) + FIRST_DATA_SECTOR(b))
91 
92 #define TOTAL_SECTOR(b) \
93  ((b)->total_sector16 ? \
94  (b)->total_sector16 : \
95  (b)->total_sector32)
96 
97 #define NR_DATA_SECTOR(b) \
98  (TOTAL_SECTOR(b) - \
99  ((b)->reserved_sector + (b)->nr_fat * FAT_SIZE(b)) + \
100  ROOT_DIR_SECTORS(b))
101 
102 #define COUNT_OF_CLUSTER(b) \
103  (NR_DATA_SECTOR(b) / (b)->sector_per_cluster)
104 
105 #define IS_FAT12(b) \
106  (COUNT_OF_CLUSTER(b) < 4085)
107 
108 #define IS_FAT16(b) \
109  (!IS_FAT12(b) && (COUNT_OF_CLUSTER(b) < 65525))
110 
111 #define IS_FAT32(b) \
112  (COUNT_OF_CLUSTER(b) >= 65525)
113 
118 #define COUNT_OF_VALID_MAX_CLUSTER(b) \
119  (COUNT_OF_CLUSTER(b) + 1)
120 
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) \
125  : -1)))
126 
127 #define FAT_SECTOR_NUMBER(b, N) \
128  (FAT_OFFSET((b), (N)) / (b)->sector_size)
129 
130 #define FAT_SECTORS(b, N) \
131  ((b)->reserved_sector + (N) * FAT_SIZE(b))
132 
133 #define THIS_FAT_OFFSET(b, N) \
134  (FAT_SECTORS((b), (N)) * (b)->sector_size)
135 
136 #define FAT_ENTRY_OFFSET(b, N) \
137  (FAT_OFFSET(b, (N)) % (b)->sector_size)
138 
139 #define WORD(buf) ((unsigned short*)(buf))
140 #define DWORD(buf) ((unsigned int*)(buf))
141 
142 #define FAT_EOF(bpb) (IS_FAT12(bpb) ? 0x0FF8 : \
143  IS_FAT16(bpb) ? 0xFFF8 : \
144  IS_FAT32(bpb) ? 0x0FFFFFF8 : 0)
145 
146 static inline int get_cluster_entry_value(struct bpb *bpb, char *table, int cluster)
147 {
148  char *tmp;
149  tmp = table + FAT_ENTRY_OFFSET(bpb, cluster);
150  if (IS_FAT16(bpb))
151  return *WORD(tmp);
152 
153  if (IS_FAT32(bpb))
154  return *DWORD(tmp) & 0x0FFFFFFF;
155 
156  if (IS_FAT12(bpb)) {
157  tmp = table;
158  tmp += FAT_SECTOR_NUMBER(bpb, cluster) * bpb->sector_size;
159  tmp += FAT_ENTRY_OFFSET(bpb, cluster);
160 
161  if (cluster & 0x0001)
162  return *WORD(tmp) >> 4;
163  else
164  return *WORD(tmp) & 0x0FFF;
165  }
166 
167  return FAT_EOF(bpb);
168 }
169 
170 #define SET_CLUSTER_ENTRY_VALUE(b, B, N, val) \
171  do { \
172  if (IS_FAT16(b)) { \
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); \
178  } else { \
179  if ((N) & 0x0001) { \
180  (val) = (val) << 4; \
181  *WORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0x000F;\
182  } else { \
183  (val) = (val) & 0x0FFF; \
184  *WORD((B) + FAT_ENTRY_OFFSET(b, N)) &= 0xF000;\
185  } \
186  *WORD((B) + FAT_ENTRY_OFFSET(b, N)) |= (val); \
187  } \
188  } while (0)
189 
190 #define IS_EOF(b, v) \
191  (IS_FAT12(b) ? (v) >= 0x0FF8 \
192  : IS_FAT16(b) ? (v) >= 0xFFF8 \
193  : IS_FAT32(b) ? (v) >= 0x0FFFFFF8 \
194  : 0)
195 
196 #define BAD_CLUSTER12 0x0FF7
197 #define BAD_CLUSTER16 0xFFF7
198 #define BAD_CLUSTER32 0x0FFFFFF7
199 
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; \
205  if (IS_FAT32(b)) { \
206  tmp[1] >>= 1; \
207  } \
208  fatsz = (tmp[0] + (tmp[1] - 1)) / tmp[1]; \
209  if (IS_FAT32(b)) { \
210  (b)->size_of_fat16 = 0; \
211  (b)->type.fat32.size_of_fat32 = fatsz; \
212  } else { \
213  (b)->size_of_fat16 = fatsz & 0x0000FFFF; \
214  } \
215 } while (0)
216 
217 #define FIRST_ROOTDIR_SECTOR(b) \
218  ((b)->reserved_sector + (b)->nr_fat * FAT_SIZE(b))
219 
220 #define GET_FIRST_BLOCK(d) \
221  ((d)->first_cluster_hi << 16 | (d)->first_cluster_lo)
222 
223 struct fat_dentry {
224  unsigned char name[11];
225  unsigned char attr;
226  unsigned char reserved;
227  unsigned char create_time_tenth;
228  unsigned short create_time;
229  unsigned short create_date;
230  unsigned short last_access_date;
231  unsigned short first_cluster_hi;
232  unsigned short write_time;
233  unsigned short write_date;
234  unsigned short first_cluster_lo;
235  unsigned int file_size;
236 } __PACKED;
237 
238 #define IS_FREE_DENTRY(d) \
239  ((unsigned char)((d)->name[0] == (unsigned char)DELETED_FLAG) \
240  || ((d)->name[0] == 0x00))
241 
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))
244 
246  ATTR_NONE = 0x00,
247  ATTR_RDONLY = 0x01,
248  ATTR_HIDDEN = 0x02,
249  ATTR_SYS = 0x04,
250  ATTR_VOLID = 0x08,
251  ATTR_DIR = 0x10,
252  ATTR_ARCH = 0x20,
257  ACTIVE_FLAG = 0x80,
259  DELETED_FLAG = 0xE5,
260 };
261 
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))
266 
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)
271 
274  char ord;
275  unsigned char name1[10];
276  char attr;
277  char type;
278  unsigned char checksum;
279  unsigned char name2[12];
280  unsigned short first_cluster_lo;
281  unsigned char name3[4];
282 } __PACKED;
283 
284 #define LAST_LONG_ENTRY 0x40
285 #define PATH_MAX 256
286 #define IS_LAST_SLOT(e) (((e)->ord & LAST_LONG_ENTRY) == 0)
287