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