📄 fat.h
字号:
#ifndef __FAT_H__
#define __FAT_H__
struct FAT32_DBR
{
uchar BS_jmpBoot[3]; //跳转指令
uchar BS_OEMName[8];
uchar BPB_BytesPerSec[2]; //每扇区字节数
uchar BPB_SecPerClus[1]; //每簇扇区数
uchar BPB_RsvdSecCnt[2]; //保留扇区数目
uchar BPB_NumFATs[1]; //此卷中FAT表数
uchar BPB_RootEntCnt[2]; //FAT32为0
uchar BPB_TotSec16[2]; //FAT32为0
uchar BPB_Media[1]; //存储介质
uchar BPB_FATSz16[2]; //FAT为0
uchar BPB_SecPerTrk[2]; //磁道扇区数
uchar BPB_NumHeads[2]; //磁头数
uchar BPB_HiddSec[4]; //FAT区前隐扇区数
uchar BPB_TotSec32[4]; //该卷总扇区数
uchar BPB_FATSz32[4]; //一个FAT表扇区数
uchar BPB_ExtFlags[2]; //FAT32特有
uchar BPB_FSVer[2]; //FAT32 特有
uchar BPB_RootClus[4]; //根目录簇号
uchar FSInfo[2]; //保留扇区FSINFO扇区数
uchar BPB_BkBootsec[2]; //通常为6
uchar BPB_Reserved[12]; //扩展用
uchar BS_DrvNum[1];
uchar BS_Reserved1[1];
uchar BS_BootSig[1];
uchar BS_VolID[4];
uchar BS_FilSysType[11];
uchar BS_FilSysType[8]; //FAT32
};
struct FAT32_Init_Arg
{
uchar BPB_Sector_No; //BPB所在扇区号
ulong Total_Size; //磁盘总容量
ulong FirstDirClust; //根目录开始簇
ulong FirstDataSector; //文件数据开始扇区号
uint BytesPerSector; //每个扇区字节数
uint FATsector; //FAT表所占扇区数
uint SectorPerClust; //每簇扇区数
ulong FirstFATSector; //第一个FAT表所在扇区
ulong FirstDirSector; //第一个目录所在扇区
ulong RootDirSector; //根目录所占扇区
ulong RootDirCount; //根目录下的目录与文件数
};
void FAT32_Init(struct FAT32_Init_Arg *arg)
{
struct FAT32_BPB *bpb=(struct FAT32_BPB *)(FAT32_Buffer);
arg.BPB_Sector_No=
arg.Total_Size=
arg.FATsector=LE2BE(bpb.BPBFATSz32,4);
arg.FirstDirClust=LE2BE(bpb.BPB_RootClus,4);
arg.BytesPerSector=LE2BE(bpb.BPB_BytesPerSec,2);
arg.SectorPerClust=LE2BE(bpb.BPB_SecPerClus,1);
arg.FirstFATSector=LE2BE(bpb.BPB_RsvdSecCnt,2)+arg.BPB_Sector_No;
arg.RootDirCount=LE2BE(bpb.BPB_RootEntCnt,2);
arg.RootDirSector=(arg.RootDirCount)*32>>9;
arg.FirstDirSector=(arg.FirstFATSector)+(bpb.BPB_NumFATs[0])*(arg.FATsector);
arg.FirstDataSector=arg.FirstDirSector+arg.RootDirSector;
}
ulong FAT32_GetNextCluster(ulong LastCluster)//当前簇 返回下一簇的簇号
{
ulong temp;
temp=((LastCluster/128)+FAT32_Init_Arg.FirstFATSector);
FAT32_ReadSector(temp,FAT32_Buffer);
for(i=0;i<4;i++) dat[i]=FAT32_Buffer[(LastCluster%128)*4+i];
temp=LE2BE(dat,4);//FAT表占用扇区数
return temp;
}
struct direntry
{
uchar Name[8]; //文件名
uchar Extension[3]; //扩展名
uchar Attributes; //文件属性
uchar LowerCase;
uchar Hunderdth; //创建时间的10毫秒位
uchar Time[2];
uchar Data[2];
uchar LastData[2];
uchar HighClust[2];
uchar ModityTime[2];
uchar ModityData[2];
uchar LowClust[2];
uchar FileSize[4];
}
struct FileInfoStruct
{
uchar FlieName[12]; //文件名
ulong FileStartCluster; //文件首簇号
ulong FileCurCluster; //文件当前簇号
ulong FileNextCluster; //下一簇号
ulong FileSize; //文件大小
uchar FileAttr; //文件属性
unsigned short FileCreateTime;
unsigned short FileCreateData;
unsigned short FileModityTime;
unsigned short FileModityData;
unlong FileSector;
uchar FileOffset;
}
struct FileInfoStruct * FAT32_OpenFile(char *filepath)
{
uchar depth=0;
uchar i,index=1;
ulong iFileSec,iCurFileSec,iFile;
struct direntry *pFile;
iCurFileSec=FAT32_Init_Arg.FirstDirSector;
//---------小端模式转大端 ----------------------------------------------
ulong LE2BE(uchar *dat,uchar len)// 指向字节序列的指针 字节序列中的字节数
{
ulong temp=0,fact=1;
uchar i=0;
for(i=0;i<len;i++)
{
temp+=dat[i]*fact;
fact*=256;
}
return temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -