📄 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -