www.pudn.com > UDiskFileSystem.rar > FAT.h


#ifndef FAT_H 
#define FAT_H 
 
#include "global.h" 
#include "mx_types.h" 
 
// Some useful cluster numbers 
#define MSDOSFSROOT     0               // cluster 0 means the root dir 
#define CLUST_FREE      0               // cluster 0 also means a free cluster 
#define MSDOSFSFREE     CLUST_FREE 
#define CLUST_FIRST     2               // first legal cluster number  
#define CLUST_RSRVD     0xfffffff6      // reserved cluster range 
#define CLUST_BAD       0xfffffff7      // a cluster with a defect 
#define CLUST_EOFS      0xfffffff8      // start of eof cluster range 
#define CLUST_EOFE      0xffffffff      // end of eof cluster range 
 
#define FAT16_MASK      0x0000ffff      // mask for 16 bit cluster numbers 
#define FAT32_MASK      0x0fffffff      // mask for FAT32 cluster numbers 
 
// Partition Type used in the partition record 
#define PART_TYPE_UNKNOWN		0x00 
#define PART_TYPE_FAT12			0x01 
#define PART_TYPE_XENIX			0x02 
#define PART_TYPE_DOSFAT16		0x04 
#define PART_TYPE_EXTDOS		0x05 
#define PART_TYPE_FAT16			0x06 
#define PART_TYPE_NTFS			0x07 
#define PART_TYPE_FAT32			0x0B 
#define PART_TYPE_FAT32LBA		0x0C 
#define PART_TYPE_FAT16LBA		0x0E 
#define PART_TYPE_EXTDOSLBA		0x0F 
#define PART_TYPE_ONTRACK		0x33 
#define PART_TYPE_NOVELL		0x40 
#define PART_TYPE_PCIX			0x4B 
#define PART_TYPE_PHOENIXSAVE	0xA0 
#define PART_TYPE_CPM			0xDB 
#define PART_TYPE_DBFS			0xE0 
#define PART_TYPE_BBT			0xFF 
 
 
#define BYTES_PER_SECTOR			512 //bytes 
#define DIRENTRY_SIZE				32	//bytes 
#define FAT_DIRENTRIES_PER_SECTOR	BYTES_PER_SECTOR/DIRENTRY_SIZE 
#define FAT32_STRUCTS_PER_SECTOR	128 
#define FAT16_STRUCTS_PER_SECTOR	256 
 
//stdio.h has these three define . 
//#define SEEK_SET					0x00 
//#define SEEK_CUR					0x01 
//#define SEEK_END					0x02 
 
#ifdef FOR_WIN 
 
# pragma pack (1) 
struct partrecord // length 16 bytes 
{ 
	u_8		prIsActive;					// 0x80 indicates active partition 
	u_8		prStartHead;				// starting head for partition 
	u_16	prStartCylSect;				// starting cylinder and sector 
	u_8		prPartType;					// partition type (see above) 
	u_8		prEndHead;					// ending head for this partition 
	u_16	prEndCylSect;				// ending cylinder and sector 
	u_32	prStartLBA;					// first LBA sector for this partition 
	u_32	prSize;						// size of this partition (sectors) 
}; 
# pragma pack () 
 
#else 
 
__packed struct partrecord // length 16 bytes 
{ 
	u_8		prIsActive;					// 0x80 indicates active partition 
	u_8		prStartHead;				// starting head for partition 
	u_16	prStartCylSect;				// starting cylinder and sector 
	u_8		prPartType;					// partition type (see above) 
	u_8		prEndHead;					// ending head for this partition 
	u_16	prEndCylSect;				// ending cylinder and sector 
	u_32	prStartLBA;					// first LBA sector for this partition 
	u_32	prSize;						// size of this partition (sectors) 
}; 
 
#endif 
 
 
// Format of a boot sector.  This is the first sector on a DOS floppy disk 
// or the first sector of a partition on a hard disk.  But, it is not the 
// first sector of a partitioned hard disk. 
 
#ifdef FOR_WIN 
 
# pragma pack (1) 
struct bootsector710 { 
	u_8				bsJump[3];					// jump inst E9xxxx or EBxx90 
	char			bsOEMName[8];				// OEM name and version 
	char			bsBPB[53];					// BIOS parameter block 
	char			bsExt[26];					// Bootsector Extension 
	char			bsBootCode[418];			// pad so structure is 512b 
	u_8				bsBootSectSig2;				// 2 & 3 are only defined for FAT32? 
	u_8				bsBootSectSig3; 
	u_8				bsBootSectSig0;				// boot sector signature byte 0x55 
	u_8				bsBootSectSig1;				// boot sector signature byte 0xAA 
	//#define 		BOOTSIG0        0x55 
	//#define 		BOOTSIG1        0xaa 
	//#define 		BOOTSIG2        0 
	//#define 		BOOTSIG3        0 
}; 
# pragma pack () 
 
#else 
 
__packed struct bootsector710 
{ 
	u_8				bsJump[3];					// jump inst E9xxxx or EBxx90 
	char			bsOEMName[8];				// OEM name and version 
	char			bsBPB[53];					// BIOS parameter block 
	char			bsExt[26];					// Bootsector Extension 
	char			bsBootCode[418];			// pad so structure is 512b 
	u_8				bsBootSectSig2;				// 2 & 3 are only defined for FAT32? 
	u_8				bsBootSectSig3; 
	u_8				bsBootSectSig0;				// boot sector signature byte 0x55 
	u_8				bsBootSectSig1;				// boot sector signature byte 0xAA 
	//#define 		BOOTSIG0        0x55 
	//#define 		BOOTSIG1        0xaa 
	//#define 		BOOTSIG2        0 
	//#define 		BOOTSIG3        0 
}; 
 
#endif 
 
#define 		BOOTSIG0        0x55 
#define 		BOOTSIG1        0xaa 
#define 		BOOTSIG2        0 
#define 		BOOTSIG3        0 
 
 
 
/***************************************************************/ 
/***************************************************************/ 
// BPB for DOS 7.10 (FAT32) 
// This one has a few extensions to bpb50. 
 
#ifdef FOR_WIN 
 
# pragma pack (1) 
struct bpb710 { 
	u_16	bpbBytesPerSec;	// bytes per sector 
	u_8		bpbSecPerClust;	// sectors per cluster 
	u_16	bpbResSectors;	// number of reserved sectors 
	u_8		bpbFATs;		// number of FATs 
	u_16	bpbRootDirEnts;	// number of root directory entries 
	u_16	bpbSectors;		// total number of sectors 
	u_8		bpbMedia;		// media descriptor 
	u_16	bpbFATsecs;		// number of sectors per FAT 
	u_16	bpbSecPerTrack;	// sectors per track 
	u_16	bpbHeads;		// number of heads 
	u_32	bpbHiddenSecs;	// # of hidden sectors 
	// 3.3 compat ends here 
	u_32	bpbHugeSectors;	// # of sectors if bpbSectors == 0 
	// 5.0 compat ends here 
	u_32	bpbBigFATsecs;	// like bpbFATsecs for FAT32 
	u_16	bpbExtFlags;	// extended flags: 
	//#define FATNUM    0xf			// mask for numbering active FAT 
	//#define FATMIRROR 0x80			// FAT is mirrored (like it always was) 
	u_16	bpbFSVers;		// filesystem version 
	//#define			FSVERS    0		// currently only 0 is understood 
	u_32	bpbRootClust;	// start cluster for root directory 
	u_16	bpbFSInfo;		// filesystem info structure sector 
	u_16	bpbBackup;		// backup boot sector 
	u_8		bpbReserved[12]; 
	u_8		bpbDriveNum; 
	u_8		bpbReserved1; 
	u_8		bpbBootSig; 
	u_8		bpbVolID[4]; 
	u_8		bpbVolLabel[11]; 
	u_8		bpbFileSystemType[8]; 
}; 
# pragma pack () 
 
#else  
 
__packed struct bpb710 
{ 
	u_16	bpbBytesPerSec;	// bytes per sector 
	u_8		bpbSecPerClust;	// sectors per cluster 
	u_16	bpbResSectors;	// number of reserved sectors 
	u_8		bpbFATs;		// number of FATs 
	u_16	bpbRootDirEnts;	// number of root directory entries 
	u_16	bpbSectors;		// total number of sectors 
	u_8		bpbMedia;		// media descriptor 
	u_16	bpbFATsecs;		// number of sectors per FAT 
	u_16	bpbSecPerTrack;	// sectors per track 
	u_16	bpbHeads;		// number of heads 
	u_32	bpbHiddenSecs;	// # of hidden sectors 
	// 3.3 compat ends here 
	u_32	bpbHugeSectors;	// # of sectors if bpbSectors == 0 
	// 5.0 compat ends here 
	u_32	bpbBigFATsecs;	// like bpbFATsecs for FAT32 
	u_16	bpbExtFlags;	// extended flags: 
	//#define FATNUM    0xf			// mask for numbering active FAT 
	//#define FATMIRROR 0x80			// FAT is mirrored (like it always was) 
	u_16	bpbFSVers;		// filesystem version 
	//#define			FSVERS    0		// currently only 0 is understood 
	u_32	bpbRootClust;	// start cluster for root directory 
	u_16	bpbFSInfo;		// filesystem info structure sector 
	u_16	bpbBackup;		// backup boot sector 
	u_8		bpbReserved[12]; 
	u_8		bpbDriveNum; 
	u_8		bpbReserved1; 
	u_8		bpbBootSig; 
	u_8		bpbVolID[4]; 
	u_8		bpbVolLabel[11]; 
	u_8		bpbFileSystemType[8]; 
}; 
 
#endif 
 
#define FATNUM    0xf			// mask for numbering active FAT 
#define FATMIRROR 0x80			// FAT is mirrored (like it always was) 
#define	FSVERS    0		// currently only 0 is understood 
 
 
 
// Structure of a dos directory entry. 
 
#ifdef FOR_WIN 
 
# pragma pack (1) 
struct direntry { 
	u_8				deName[8];      			// filename, blank filled 
	//#define 		SLOT_EMPTY      	0x00	// slot has never been used 
	//#define 		SLOT_E5         	0x05	// the real value is 0xe5 
	//#define 		SLOT_DELETED    	0xe5	// file in this slot deleted 
	u_8				deExtension[3]; 			// extension, blank filled 
	u_8				deAttributes;   			// file attributes 
	//#define 		ATTR_NORMAL     	0x00	// normal file 
	//#define 		ATTR_READONLY   	0x01	// file is readonly 
	//#define 		ATTR_HIDDEN     	0x02	// file is hidden 
	//#define 		ATTR_SYSTEM     	0x04	// file is a system file 
	//#define 		ATTR_VOLUME     	0x08	// entry is a volume label 
	//#define 		ATTR_LONG_FILENAME	0x0f	// this is a long filename entry 
	//#define 		ATTR_DIRECTORY  	0x10	// entry is a directory name 
	//#define 		ATTR_ARCHIVE    	0x20	// file is new or modified 
	u_8				deLowerCase;    			// NT VFAT lower case flags 
	//#define 		LCASE_BASE      	0x08	// filename base in lower case 
	//#define 		LCASE_EXT       	0x10	// filename extension in lower case 
	u_8				deCHundredth;				// hundredth of seconds in CTime 
	u_8				deCTime[2];					// create time 
	u_8				deCDate[2];					// create date 
	u_8				deADate[2];					// access date 
	u_16 			deHighClust;				// high bytes of cluster number 
	u_8				deMTime[2];					// last update time 
	u_8				deMDate[2];					// last update date 
	u_16 			deStartCluster;				// starting cluster of file 
	u_32			deFileSize;					// size of file in bytes 
}; 
# pragma pack () 
 
#else 
 
__packed struct direntry  
{ 
	u_8				deName[8];      			// filename, blank filled 
	//#define 		SLOT_EMPTY      	0x00	// slot has never been used 
	//#define 		SLOT_E5         	0x05	// the real value is 0xe5 
	//#define 		SLOT_DELETED    	0xe5	// file in this slot deleted 
	u_8				deExtension[3]; 			// extension, blank filled 
	u_8				deAttributes;   			// file attributes 
	//#define 		ATTR_NORMAL     	0x00	// normal file 
	//#define 		ATTR_READONLY   	0x01	// file is readonly 
	//#define 		ATTR_HIDDEN     	0x02	// file is hidden 
	//#define 		ATTR_SYSTEM     	0x04	// file is a system file 
	//#define 		ATTR_VOLUME     	0x08	// entry is a volume label 
	//#define 		ATTR_LONG_FILENAME	0x0f	// this is a long filename entry 
	//#define 		ATTR_DIRECTORY  	0x10	// entry is a directory name 
	//#define 		ATTR_ARCHIVE    	0x20	// file is new or modified 
	u_8				deLowerCase;    			// NT VFAT lower case flags 
	//#define 		LCASE_BASE      	0x08	// filename base in lower case 
	//#define 		LCASE_EXT       	0x10	// filename extension in lower case 
	u_8				deCHundredth;				// hundredth of seconds in CTime 
	u_8				deCTime[2];					// create time 
	u_8				deCDate[2];					// create date 
	u_8				deADate[2];					// access date 
	u_16 			deHighClust;				// high bytes of cluster number 
	u_8				deMTime[2];					// last update time 
	u_8				deMDate[2];					// last update date 
	u_16 			deStartCluster;				// starting cluster of file 
	u_32			deFileSize;					// size of file in bytes 
}; 
 
#endif 
#define 		SLOT_EMPTY      	0x00	// slot has never been used 
#define 		SLOT_E5         	0x05	// the real value is 0xe5 
#define 		SLOT_DELETED    	0xe5	// file in this slot deleted 
#define 		ATTR_NORMAL     	0x00	// normal file 
#define 		ATTR_READONLY   	0x01	// file is readonly 
#define 		ATTR_HIDDEN     	0x02	// file is hidden 
#define 		ATTR_SYSTEM     	0x04	// file is a system file 
#define 		ATTR_VOLUME     	0x08	// entry is a volume label 
#define 		ATTR_LONG_FILENAME	0x0f	// this is a long filename entry 
#define 		ATTR_DIRECTORY  	0x10	// entry is a directory name 
#define 		ATTR_ARCHIVE    	0x20	// file is new or modified 
#define 		LCASE_BASE      	0x08	// filename base in lower case 
#define 		LCASE_EXT       	0x10	// filename extension in lower case 
 
 
// Internal structure of a FILE, used in the program, not writed in FAT 
typedef struct{ 
	struct direntry	de;					// Information about the file opened 
	u_32			currentSector;  	// Actual sector address in memory 
	u_8				*buffer;			// buffer pointer to memory (cache sector) 
	u_32			bytePointer;		// byte pointer to the actual byte (divide by 512 to find the current buffer position) 
	u_8				sectorHasChanged;	// TRUE if the sector in memory has changed and needs to be write before a close file or change in sector 
}TFILE; 
 
 
 
// FAT32 FSInfo block. 
struct fsinfo { 
	unsigned char fsisig1[4]; 
	unsigned char fsifill1[480]; 
	unsigned char fsisig2[4]; 
	unsigned char fsinfree[4]; 
	unsigned char fsinxtfree[4]; 
	unsigned char fsifill2[12]; 
	unsigned char fsisig3[4]; 
	unsigned char fsifill3[508]; 
	unsigned char fsisig4[4]; 
}; 
 
// Prototypes 
u_8		fatInit               	(u_8 index); 
 
u_32 fatGetFirstDirCluster(void); 
 
u_32				fatClustToSect        (u_32 clust); 
 
u_32 fatSectToClust(u_32 sect); 
 
u_8 *fatDir(u_32 cluster, u_32 offset); 
 
struct direntry   *fatGetFileInfo        (struct direntry *rde, char *shortName); 
 
char              *fatGetVolLabel        (void); 
 
 
struct partrecord *fatGetPartInfo        (void); 
 
 
u_8      fatCddir              (char *path); 
 
TFILE             *fatFopen              (char *shortName); 
 
char               fatFgetc              (TFILE *fp); 
u_8       fatFseek              (TFILE *fp, u_32 offSet, u_8 mode); 
u_8      fatFeof               (TFILE *fp); 
 
void				fatNormalize          (char *string); 
 
u_32 fatGetCurDirCluster(void); 
 
 
u_8      fatMkdir              (char *path); 
 
 
u_8      fatRename             (char *oldShortName, char *newShortName); 
 
u_8      fatRemove             (char *shortName); 
 
TFILE             *fatFcreate            (char *shortName); 
 
u_8 	fatFclose(TFILE *fp); 
 
u_8      fatFflush             (TFILE *fp); 
 
u_8      fatFputc              (TFILE *fp, char c); 
 
struct direntry   *fatNextFreeDirEntry   (u_32 cluster); 
 
u_32      fatNextFreeCluster    (u_32 startSector); 
 
void               fatWriteEOC           (u_32 cluster); 
 
void               fatWrite              (u_32 cluster, u_32 data); 
 
u_32      fatTableClustToSect   (u_32 cluster); 
 
u_32      fatLastCluster        (u_32 cluster); 
 
u_8      fatDirectoryIsEmpty   (u_32 DirCluster); 
void               fatRemoveAll          (void); 
 
u_16 fatFread(u_8* buffer,u_16 size,TFILE *fp); 
 
#endif