www.pudn.com > 外挂硬盘和FLASH的MP3方案程序下载.rar > FAT.H


/********************************************************/ 
/*                                                      */ 
/*  库   名   称:FAT文件系统函数库                   */ 
 
/*  功 能  描 述:提供对FAT文件系统按文件名存取       */ 
/*                                                      */ 
/*                                                      */ 
/********************************************************/ 
 
#ifndef _TYPE_DEFINE 
 #define _TYPE_DEFINE 
 typedef bit BOOL; 
 typedef unsigned char BYTE; 
 typedef unsigned char CHAR; 
 typedef unsigned int WORD; 
 typedef unsigned long DWORD; 
#endif 
 
#ifndef _FAT_DEFINE 
 #define _FAT_DEFINE 
 
#define FAT_MAX_FCB						2 
 
//文件属性 
#define	FAT_ATTR_READ_ONLY				0x01			//文件属性:只读 
#define	FAT_ATTR_HIDDEN					0x02			//文件属性:隐含 
#define	FAT_ATTR_SYSTEM					0x04			//文件属性:系统 
#define	FAT_ATTR_VOLUME_ID				0x08			//文件属性:卷ID 
#define	FAT_ATTR_DIRECTORY				0x10			//文件属性:目录 
#define	FAT_ATTR_ARCHIVE				0x20			//文件属性:归档 
#define FAT_ATTR_LONG_NAME				FAT_ATTR_READ_ONLY+FAT_ATTR_HIDDEN+FAT_ATTR_SYSTEM+FAT_ATTR_VOLUME_ID	//文件属性:长文件名 
#define FAT_ATTR_LONG_NAME_MASK			FAT_ATTR_READ_ONLY+FAT_ATTR_HIDDEN+FAT_ATTR_SYSTEM+FAT_ATTR_VOLUME_ID+FAT_ATTR_DIRECTORY+FAT_ATTR_ARCHIVE	//文件属性:长文件名 
#define FAT_LAST_LONG_ENTRY				0x40			//长文件名入口标记 
 
#define FAT_ERR_MBR_FLAG				0x01			//MBR扇区标志错误	FATMountPartition 
#define FAT_ERR_PARTITION_NOT_FOUND		0x02			//指定分区没找到	FATMountVolumeID 
#define FAT_ERR_FILE_OPEN_ERROR			FAT_MAX_FCB		//文件打开错误 
#define FAT_ERR_DIR_NOT_FOUND			0x01			//指定的目录入口没有找到F	FATChangeDirectory 
#define FAT_ERR_NOT_DIR					0x02			//不是一个目录入口		FATChangeDirectory 
 
#define FAT_SEEK_BEGIN					0x01 
#define FAT_SEEK_CURRENT				0x02 
#define FAT_SEEK_END					0x03 
 
#define FAT_TYPE_FAT12					0x01 
#define FAT_TYPE_FAT16					0x02 
#define FAT_TYPE_FAT32					0x03 
 
#define FAT_CLUSTER_END32				0xffffffff		//簇链终点 
#define FAT_CLUSTER_END16				0xffff			//簇链终点 
#define FAT_CLUSTER_END12				0xfff			//簇链终点 
#define FAT_CLUSTER_RESERVED32			0xfffffff6		//保留簇 
#define FAT_CLUSTER_RESERVED16			0xfff6			//保留簇 
#define FAT_CLUSTER_RESERVED12			0xff6			//保留簇 
#define FAT_CLUSTER_BAD32				0xfffffff7		//坏簇 
#define FAT_CLUSTER_BAD16				0xfff7			//坏簇 
#define FAT_CLUSTER_BAD12				0xff7			//坏簇 
 
#define FAT_MASK_FAT32					0x0fffffff 
#define FAT_MASK_FAT16					0x0000ffff 
#define FAT_MASK_FAT12					0x00000fff 
 
#define FAT_MAX_PARTITIONS				0x10 
//#define IO_ERROR						0x00				//遇到io错误 
//#define NO_IO_ERROR					0x01				//没有遇到io错误 
 
//计算指定簇的开始扇区号 
#define ClusterToSector(X)			FAT.ClusSec + (X - 2) * FAT.SecPerClus 
 
struct StorageMediaStr 
{ 
	WORD	BytesPerSec;			//每扇区字节数 
	DWORD	TotalSectors;			//总扇区数 
	BYTE	TotalPartitions;		//分区数 
	BYTE	CurrentPartition;		//当前分区 
	BYTE	(*ReadSector)(DWORD Sector,BYTE *Buffer); 
	BYTE	(*WriteSector)(DWORD Sector,BYTE *Buffer); 
}; 
 
struct BootSecFAT16Str					//引导扇区   FAT16  扩展结构 
{ 
	BYTE	BS_DrvNum; 
	BYTE	BS_Reserved1; 
	BYTE	BS_BootSig; 
	DWORD	BS_VolID; 
	char	BS_VolLab[11]; 
	char	BS_FilSysType[8]; 
}; 
 
struct BootSecFAT32Str					//引导扇区   FAT  扩展结构 
{ 
	DWORD	BPB_FATSz32;			//FAT扇区总数 
	WORD	BPB_ExtFlags; 
	WORD	BPB_FSVer; 
	DWORD	BPB_RootClus;			//根目录开始的簇 
	WORD	BPB_FSInfo; 
	WORD	BPB_BkBootSec; 
	char	BPB_Reserved[12]; 
	BYTE	BS_DrvNum; 
	BYTE	BS_Reserved1; 
	BYTE	BS_BootSig; 
	DWORD	BS_VolID; 
	char	BS_VolLab[11]; 
	char	BS_FilSysType[8]; 
}; 
 
struct BootSecStr						//引导扇区结构 
{ 
	BYTE	BS_jmpBoot[3]; 
	BYTE	BS_OEMName[8]; 
	WORD	BPB_BytesPerSec;		//每扇区字节数  512 
	BYTE	BPB_SecPerClus;			//每簇扇区数	1 2 4 8 16 32 64 128 
	WORD	BPB_RsvdSecCnt;			//保留扇区数	0x20 
	BYTE	BPB_NumFATs;			//FAT表个数		2 
	WORD	BPB_RootEntCnt;		 
	WORD	BPB_TotSec16; 
	BYTE	BPB_Media; 
	WORD	BPB_FATSz16; 
	WORD	BPB_SecPerTrk; 
	WORD	BPB_NumHeads; 
	DWORD	BPB_HiddSec; 
	DWORD	BPB_TotSec32; 
	union	FATUni 
	{ 
		struct BootSecFAT32Str	F32; 
		struct BootSecFAT16Str	F16; 
	}FAT; 
 
}; 
 
struct DPTStr				//分区表结构 
{ 
	BYTE	BootFlag; 
	BYTE	CHSBegin[3]; 
	BYTE	TypeCode; 
	BYTE	CHSEnd[3]; 
	DWORD	LBABegin; 
	DWORD	CntSec; 
}; 
 
struct sDPTStr				//简化的分区表 
{ 
	BYTE	FATType; 
	DWORD	LBABegin; 
	DWORD	CntSec; 
}; 
 
struct FAT32FSInfoStr		//FAT32扩展信息结构 
{ 
	DWORD	LeadSig; 
	BYTE	Reserved1[480]; 
	DWORD	StrucSig; 
	DWORD	FreeCount; 
	DWORD	NxtFree; 
	BYTE	Reserved2[12]; 
	DWORD	TrailSig; 
}; 
 
struct FATSDirStr			//FAT目录结构 短文件名 
{ 
	CHAR	Name[11]; 
	BYTE	Attr; 
	BYTE	NTRes; 
	BYTE	CrtTimeTenth; 
	WORD	CrtTime; 
	WORD	CrtDate; 
	WORD	LstAccDate; 
	WORD	FstClusHI; 
	WORD	WrtTime; 
	WORD	WrtDate; 
	WORD	FstClusLO; 
	DWORD	FileSize; 
}; 
 
struct FATLDirStr			//FAT目录结构 长文件名 
{ 
	BYTE	Ord; 
	BYTE	Name1[10]; 
	BYTE	Attr; 
	BYTE	Type; 
	BYTE	Chksum; 
	BYTE	Name2[12]; 
	WORD	FstClusLO; 
	BYTE	Name3[4]; 
}; 
 
struct FATStr					//FAT参数表 
{ 
//	BYTE	ClusSecCnt;			//当前簇扇区计数 
	DWORD	CurrentDirectory;	//当前目录入口(簇号) 
	BYTE	SecPerClus;			//每簇扇区数	1 2 4 8 16 32 64 128 
	DWORD	RootClus;			//根目录开始的簇 
	BYTE	RootSectors;		//根目录占用的扇区数 
	DWORD	ClusSec;			//簇开始的扇区 
	DWORD	FATSz;				//FAT表大小(扇区) 
	DWORD	FATSec;				//FAT表开始扇区 
	DWORD	FSISec;				//FSI所在扇区 
	DWORD	FSIFreeCount;		//空闲簇数 
	DWORD	FSINxtFree;			//空闲簇搜索指针 
}; 
 
struct FCBStr 
{ 
	CHAR	FileName[12];		//文件名 
	DWORD	Size;				//文件大小 
	DWORD	FirstCluster;		//第一个簇 
	DWORD	LastCluster;		//最近一次读到的簇号 
	DWORD	ClusSecCnt;			//当前簇扇区计数 
	DWORD	ByteCnt;			//当前字节计数 
}; 
 
struct FATTableStr 
{ 
	DWORD	Sector; 
	union FATUin 
	{ 
		DWORD	F32[128]; 
		WORD	F16[256]; 
		BYTE	F12[512]; 
	}FAT; 
}; 
 
struct FATClusterStr 
{ 
	BYTE	SecOffset;				//扇区偏移量 
	DWORD	Sector;				//扇区号 
	DWORD	Cluster;			//簇号 
}; 
 
#ifndef _LIBRARY_DEFINE 
 xdata BYTE DiskBuffer[512]; 
 
 xdata struct StorageMediaStr StorageMedia; 
 xdata struct sDPTStr sDPT[FAT_MAX_PARTITIONS]; 
 xdata struct FATStr FAT; 
 xdata struct FCBStr FCB[FAT_MAX_FCB]; 
 xdata CHAR LongFileName[256];  
 xdata struct FATTableStr FATTable; 
 xdata struct DPTStr *DPT;			//分区表结构指针 
 xdata struct BootSecStr *BOOTSEC;		//引导扇区结构指针 
 xdata struct FAT32FSInfoStr *FSI;		//FAT32扩展信息 
 xdata struct FATSDirStr *sDIR;		//FAT目录结构指针 
 xdata struct FATLDirStr *lDIR;		//FAT目录结构指针 
#endif 
#endif 
 
extern xdata BYTE DiskBuffer[512]; 
 
extern xdata struct StorageMediaStr StorageMedia; 
extern xdata struct sDPTStr sDPT[FAT_MAX_PARTITIONS]; 
extern xdata struct FATStr FAT; 
extern xdata struct FCBStr FCB[FAT_MAX_FCB]; 
extern xdata CHAR LongFileName[256];  
extern xdata struct FATTableStr FATTable; 
extern xdata struct DPTStr *DPT;		//分区表结构指针 
extern xdata struct BootSecStr *BOOTSEC;	//引导扇区结构指针 
extern xdata struct FAT32FSInfoStr *FSI;	//FAT32扩展信息 
extern xdata struct FATSDirStr *sDIR;		//FAT目录结构指针 
extern xdata struct FATLDirStr *lDIR;		//FAT目录结构指针 
 
extern void FATInit(void); 
extern BYTE FATSelectMedia(BYTE Media); 
extern BYTE FATFindPartitions(void); 
extern BYTE FATMountPartition(void); 
extern BYTE FATMountVolumeID(BYTE Partition); 
extern void FATGetPartLongName(struct FATLDirStr *ldp,CHAR *name); 
extern DWORD FATDiskSize(void); 
extern DWORD FATDiskFreeSize(void); 
extern BYTE FATFindDIREntry(CHAR *DirName); 
extern BYTE FAT32FindDIREntry(CHAR *DirName); 
extern BYTE FAT16FindDIREntry(CHAR *DirName); 
void FATReadCluster(struct FATClusterStr *Cluster,BYTE *Buffer); 
extern BYTE FATChangeDirectory(CHAR *DirName); 
extern BYTE FATListDirectory(void); 
extern BYTE FAT32ListDirectory(void); 
extern BYTE FAT16ListDirectory(void); 
extern void FATNextCluster(DWORD *CurrentCluster); 
extern BYTE FATGetDirName(WORD SecNum); 
extern BYTE FATOpenFile(CHAR *filename); 
extern void FATCloseFile(BYTE fp); 
extern WORD FATReadFile(BYTE fp);