00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FAT_H
00023 #define FAT_H
00024
00025 #include "global.h"
00026
00027
00028
00029 #define MSDOSFSROOT 0
00030 #define CLUST_FREE 0
00031 #define MSDOSFSFREE CLUST_FREE
00032 #define CLUST_FIRST 2
00033 #define CLUST_RSRVD 0xfffffff6
00034 #define CLUST_BAD 0xfffffff7
00035 #define CLUST_EOFS 0xfffffff8
00036 #define CLUST_EOFE 0xffffffff
00037
00038 #define FAT12_MASK 0x00000fff
00039 #define FAT16_MASK 0x0000ffff
00040 #define FAT32_MASK 0x0fffffff
00041
00042
00043
00044 #define PART_TYPE_UNKNOWN 0x00
00045 #define PART_TYPE_FAT12 0x01
00046 #define PART_TYPE_XENIX 0x02
00047 #define PART_TYPE_DOSFAT16 0x04
00048 #define PART_TYPE_EXTDOS 0x05
00049 #define PART_TYPE_FAT16 0x06
00050 #define PART_TYPE_NTFS 0x07
00051 #define PART_TYPE_FAT32 0x0B
00052 #define PART_TYPE_FAT32LBA 0x0C
00053 #define PART_TYPE_FAT16LBA 0x0E
00054 #define PART_TYPE_EXTDOSLBA 0x0F
00055 #define PART_TYPE_ONTRACK 0x33
00056 #define PART_TYPE_NOVELL 0x40
00057 #define PART_TYPE_PCIX 0x4B
00058 #define PART_TYPE_PHOENIXSAVE 0xA0
00059 #define PART_TYPE_CPM 0xDB
00060 #define PART_TYPE_DBFS 0xE0
00061 #define PART_TYPE_BBT 0xFF
00062
00063 struct partrecord
00064 {
00065 BYTE prIsActive;
00066 BYTE prStartHead;
00067 WORD prStartCylSect;
00068 BYTE prPartType;
00069 BYTE prEndHead;
00070 WORD prEndCylSect;
00071 DWORD prStartLBA;
00072 DWORD prSize;
00073 };
00074
00075
00076 struct partsector
00077 {
00078 CHAR psPartCode[512-64-2];
00079 BYTE psPart[64];
00080 BYTE psBootSectSig0;
00081 BYTE psBootSectSig1;
00082 #define BOOTSIG0 0x55
00083 #define BOOTSIG1 0xaa
00084 };
00085
00086
00087
00088
00089
00090
00091 struct bootsector33 {
00092 BYTE bsJump[3];
00093 CHAR bsOemName[8];
00094 CHAR bsBPB[19];
00095 CHAR bsDriveNumber;
00096 CHAR bsBootCode[479];
00097 BYTE bsBootSectSig0;
00098 BYTE bsBootSectSig1;
00099 #define BOOTSIG0 0x55
00100 #define BOOTSIG1 0xaa
00101 };
00102
00103 struct extboot {
00104 CHAR exDriveNumber;
00105 CHAR exReserved1;
00106 CHAR exBootSignature;
00107 #define EXBOOTSIG 0x29
00108 CHAR exVolumeID[4];
00109 CHAR exVolumeLabel[11];
00110 CHAR exFileSysType[8];
00111 };
00112
00113 struct bootsector50 {
00114 BYTE bsJump[3];
00115 CHAR bsOemName[8];
00116 CHAR bsBPB[25];
00117 CHAR bsExt[26];
00118 CHAR bsBootCode[448];
00119 BYTE bsBootSectSig0;
00120 BYTE bsBootSectSig1;
00121 #define BOOTSIG0 0x55
00122 #define BOOTSIG1 0xaa
00123 };
00124
00125 struct bootsector710 {
00126 BYTE bsJump[3];
00127 CHAR bsOEMName[8];
00128 CHAR bsBPB[53];
00129 CHAR bsExt[26];
00130 CHAR bsBootCode[418];
00131 BYTE bsBootSectSig2;
00132 BYTE bsBootSectSig3;
00133 BYTE bsBootSectSig0;
00134 BYTE bsBootSectSig1;
00135 #define BOOTSIG0 0x55
00136 #define BOOTSIG1 0xaa
00137 #define BOOTSIG2 0
00138 #define BOOTSIG3 0
00139 };
00140
00141
00142
00143
00144
00145
00146
00147 struct bpb33 {
00148 WORD bpbBytesPerSec;
00149 BYTE bpbSecPerClust;
00150 WORD bpbResSectors;
00151 BYTE bpbFATs;
00152 WORD bpbRootDirEnts;
00153 WORD bpbSectors;
00154 BYTE bpbMedia;
00155 WORD bpbFATsecs;
00156 WORD bpbSecPerTrack;
00157 WORD bpbHeads;
00158 WORD bpbHiddenSecs;
00159 };
00160
00161
00162
00163
00164 struct bpb50 {
00165 WORD bpbBytesPerSec;
00166 BYTE bpbSecPerClust;
00167 WORD bpbResSectors;
00168 BYTE bpbFATs;
00169 WORD bpbRootDirEnts;
00170 WORD bpbSectors;
00171 BYTE bpbMedia;
00172 WORD bpbFATsecs;
00173 WORD bpbSecPerTrack;
00174 WORD bpbHeads;
00175 DWORD bpbHiddenSecs;
00176
00177 DWORD bpbHugeSectors;
00178 };
00179
00180
00181
00182 struct bpb710 {
00183 WORD bpbBytesPerSec;
00184 BYTE bpbSecPerClust;
00185 WORD bpbResSectors;
00186 BYTE bpbFATs;
00187 WORD bpbRootDirEnts;
00188 WORD bpbSectors;
00189 BYTE bpbMedia;
00190 WORD bpbFATsecs;
00191 WORD bpbSecPerTrack;
00192 WORD bpbHeads;
00193 DWORD bpbHiddenSecs;
00194
00195 DWORD bpbHugeSectors;
00196
00197 DWORD bpbBigFATsecs;
00198 WORD bpbExtFlags;
00199 #define FATNUM 0xf // mask for numbering active FAT
00200 #define FATMIRROR 0x80 // FAT is mirrored (like it always was)
00201 WORD bpbFSVers;
00202 #define FSVERS 0 // currently only 0 is understood
00203 DWORD bpbRootClust;
00204 WORD bpbFSInfo;
00205 WORD bpbBackup;
00206
00207 };
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 struct byte_bpb33 {
00219 CHAR bpbBytesPerSec[2];
00220 CHAR bpbSecPerClust;
00221 CHAR bpbResSectors[2];
00222 CHAR bpbFATs;
00223 CHAR bpbRootDirEnts[2];
00224 CHAR bpbSectors[2];
00225 CHAR bpbMedia;
00226 CHAR bpbFATsecs[2];
00227 CHAR bpbSecPerTrack[2];
00228 CHAR bpbHeads[2];
00229 CHAR bpbHiddenSecs[2];
00230 };
00231
00232
00233
00234
00235 struct byte_bpb50 {
00236 CHAR bpbBytesPerSec[2];
00237 CHAR bpbSecPerClust;
00238 CHAR bpbResSectors[2];
00239 CHAR bpbFATs;
00240 CHAR bpbRootDirEnts[2];
00241 CHAR bpbSectors[2];
00242 CHAR bpbMedia;
00243 CHAR bpbFATsecs[2];
00244 CHAR bpbSecPerTrack[2];
00245 CHAR bpbHeads[2];
00246 CHAR bpbHiddenSecs[4];
00247 CHAR bpbHugeSectors[4];
00248 };
00249
00250
00251
00252 struct byte_bpb710 {
00253 BYTE bpbBytesPerSec[2];
00254 BYTE bpbSecPerClust;
00255 BYTE bpbResSectors[2];
00256 BYTE bpbFATs;
00257 BYTE bpbRootDirEnts[2];
00258 BYTE bpbSectors[2];
00259 BYTE bpbMedia;
00260 BYTE bpbFATsecs[2];
00261 BYTE bpbSecPerTrack[2];
00262 BYTE bpbHeads[2];
00263 BYTE bpbHiddenSecs[4];
00264 BYTE bpbHugeSectors[4];
00265 BYTE bpbBigFATsecs[4];
00266 BYTE bpbExtFlags[2];
00267 BYTE bpbFSVers[2];
00268 BYTE bpbRootClust[4];
00269 BYTE bpbFSInfo[2];
00270 BYTE bpbBackup[2];
00271
00272 };
00273
00274
00275 struct fsinfo {
00276 BYTE fsisig1[4];
00277 BYTE fsifill1[480];
00278 BYTE fsisig2[4];
00279 BYTE fsinfree[4];
00280 BYTE fsinxtfree[4];
00281 BYTE fsifill2[12];
00282 BYTE fsisig3[4];
00283 BYTE fsifill3[508];
00284 BYTE fsisig4[4];
00285 };
00286
00287
00288
00289
00290
00291
00292
00293
00294 struct direntry {
00295 BYTE deName[8];
00296 #define SLOT_EMPTY 0x00
00297 #define SLOT_E5 0x05
00298 #define SLOT_DELETED 0xe5
00299 BYTE deExtension[3];
00300 BYTE deAttributes;
00301 #define ATTR_NORMAL 0x00
00302 #define ATTR_READONLY 0x01
00303 #define ATTR_HIDDEN 0x02
00304 #define ATTR_SYSTEM 0x04
00305 #define ATTR_VOLUME 0x08
00306 #define ATTR_LONG_FILENAME 0x0f
00307 #define ATTR_DIRECTORY 0x10
00308 #define ATTR_ARCHIVE 0x20
00309 BYTE deLowerCase;
00310 #define LCASE_BASE 0x08
00311 #define LCASE_EXT 0x10
00312 BYTE deCHundredth;
00313 BYTE deCTime[2];
00314 BYTE deCDate[2];
00315 BYTE deADate[2];
00316 WORD deHighClust;
00317 BYTE deMTime[2];
00318 BYTE deMDate[2];
00319 WORD deStartCluster;
00320 DWORD deFileSize;
00321 };
00322
00323
00324 #define DIRENTRIES_PER_SECTOR 0x10
00325
00326
00327 struct winentry {
00328 BYTE weCnt;
00329 #define WIN_LAST 0x40
00330 #define WIN_CNT 0x3f
00331 BYTE wePart1[10];
00332 BYTE weAttributes;
00333 #define ATTR_WIN95 0x0f
00334 BYTE weReserved1;
00335 BYTE weChksum;
00336 BYTE wePart2[12];
00337 WORD weReserved2;
00338 BYTE wePart3[4];
00339 };
00340
00341 #define WIN_CHARS 13
00342
00343
00344
00345 #define WIN_MAXLEN 255
00346
00347
00348
00349
00350
00351 #define DT_2SECONDS_MASK 0x1F
00352 #define DT_2SECONDS_SHIFT 0
00353 #define DT_MINUTES_MASK 0x7E0
00354 #define DT_MINUTES_SHIFT 5
00355 #define DT_HOURS_MASK 0xF800
00356 #define DT_HOURS_SHIFT 11
00357
00358
00359
00360 #define DD_DAY_MASK 0x1F
00361 #define DD_DAY_SHIFT 0
00362 #define DD_MONTH_MASK 0x1E0
00363 #define DD_MONTH_SHIFT 5
00364 #define DD_YEAR_MASK 0xFE00
00365 #define DD_YEAR_SHIFT 9
00366
00367
00368 unsigned char fatInit( unsigned char device);
00369 unsigned int fatClusterSize(void);
00370 unsigned long fatGetDirEntry(unsigned int entry, unsigned int count);
00371 unsigned long fatGetFilesize(void);
00372 char* fatGetFilename(void);
00373 char* fatGetDirname(void);
00374 void fatLoadCluster(unsigned long cluster, unsigned char *buffer);
00375 unsigned long fatNextCluster(unsigned long cluster);
00376
00377 #endif