📄 fat.h
字号:
//#include "include.h"
#ifndef _FAT_H
#define _FAT_H
//1常量定义
#ifndef FAT12
#define FAT12 0
#endif
#ifndef FAT16
#define FAT16 1
#endif
#ifndef FAT32
#define FAT32 2
#endif
//1结构定义
/***********************************************************
Offset Length Name Contents
0 8B Name File name
8 3B Extension File extension
B 1B Attributes file attributes
C 10B Reserved RESERVED
16 word Time Time stamp
18 word Date Date stamp
1A word StartCluster Starting cluster number
1C dWord FileSize File size
************************************************************/
/***************************************************************************
目录项(32字节)
***************************************************************************/
typedef struct
{
uint8 fileName[8]; /*文件名*/
uint8 extName[3]; /*扩展名*/
uint8 rdOnly:1; /*只读属性 */
uint8 hide:1; /*隐含属性 */
uint8 sys:1; /*系统属性*/
uint8 label:1; /*卷标标志*/
uint8 dir:1; /*目录标志*/
uint8 arc:1; /*存档属性*/
uint8 res:2; /*保留位*/
uint8 reserve[5]; /*保留*/
uint16 modTime; /*文件修改时间*/
uint16 modDate; /*文件修改日期*/
uint16 createTime; /*文件创建时间*/
uint16 createDate; /*文件创建日期*/
uint16 startClu; /*起始簇号*/
uint32 fileSize; /*文件大小*/
}FDT_REC;
/***************************************************************************
目录项(32字节)
***************************************************************************/
typedef struct
{
uint8 name[8]; /*文件名*/
uint8 ext[3]; /*扩展名*/
uint8 attrib; /*属性*/
uint8 reserved; /*保留*/
uint8 ctime_ms; /*文件创建时间ms*/
uint16 ctime; /*文件创建时间*/
uint16 cdate; /*文件修改日期*/
uint16 adate; /*访问日期*/
uint16 st_clust_msw; /*起始簇号(FAT32高16位)*/
uint16 mtime; /*文件修改时间*/
uint16 mdate; /*文件修改日期*/
uint16 st_clust; /*起始簇号*/
uint32 file_size; /*文件大小(低16位)*/
}_fat_dirent;
/***************************************************************************
长目录项(32字节)
***************************************************************************/
typedef struct
{
uint8 LDIR_Ord;
uint8 LDIR_Name1[10];
uint8 LDIR_Attr;
uint8 LDIR_Type;
uint8 LDIR_Chksum;
uint8 LDIR_Name2[12];
uint16 LDIR_FstClusLO;
uint8 LDIR_Name3[4];
}_fat_ldirent, *pfat_ldirent;
/***************************************************************************
磁盘格式化参数
***************************************************************************/
typedef struct
{
uint32 DiskSize; /*磁盘大小(扇区)*/
uint8 SecPerClus; /*每簇扇区数*/
}_DskSizeToSecPerClus;
/***************************************************************************
引导扇区(512字节)
***************************************************************************/
typedef struct
{
//uint8 jump[3]; // 16-bit JMP to boot code, or 8-bit JMP + NOP
//uint8 oem_id[8]; // e.g. 'MSWIN4.0'
uint16 BPB_BytsPerSec; //bytes_per_sector; // usu. =512
uint8 BPB_SecPerClus; //sectors_per_cluster;
uint16 BPB_ResvdSecCnt; //num_boot_sectors; // usu. =1
uint8 BPB_NumFATs; //num_fats; // usu. =2
uint16 BPB_RootEntCnt; //num_root_dir_ents;
//uint16 BPB_TotSec16; //total_sectors; // 16-bit; 0 if num sectors > 65535
//uint8 media_ID_byte; // usu. =0F0h
//uint16 BPB_FATSz16; //sectors_per_fat;
//uint16 sectors_per_track;
//uint16 heads;
//uint32 hidden_sectors; // =LBA partition start
//uint32 BPB_TotSec32; //total_sectors_large;// 32-bit; 0 if num sectors < 65536
//uint8 boot_code[474];
//uint32 BPB_FATSz32;
//uint8 boot_code1[4];
uint32 BPB_RootClus;
uint16 BPB_FSInfo;
//uint8 boot_code2[460];
//uint8 magic[2]; // 55h, 0AAh
//////////////////////////////////////////////////////////////
// modify and addition variable
//////////////////////////////////////////////////////////////
uint32 FATSz;
uint32 RootDirSectors;
uint32 CountofClusters;
uint32 FirstDataSector;
uint32 PBRSector;
uint32 TotSec; //add by lxs @2005.4.19
}_fat_bootsector; /* 512 bytes total */
//1全局变量
#undef EXT
#ifdef IN_FAT
#define EXT
#else
#define EXT extern
#endif
EXT uint8 FATType DRAM_FAT;
EXT uint8 LogSecPerClus DRAM_FAT;
EXT uint8 LogBytePerSec DRAM_FAT;
EXT _fat_bootsector BootSector DRAM_FAT;
//1函数原型声明
extern void LowFormat(void);
extern void Format(uint8 media, uint8 type);
extern void WriteDBRSector(uint8 type);
extern void WriteRootDir(uint8 type);
extern void WriteFAT2(uint8 type);
extern uint8 CheckFileSystem(void);
extern uint8 GetBootInfo(uint32 PBRSector, uint8 *DbrBuf);
extern int lg2(uint16 arg);
extern bool CheckFatBootSector(uint8 *DbrBuf);
extern uint32 CheckMbr(uint8 *DbrBuf);
extern void CopyFat(uint8 FatNum);
extern void GetFATPosition(uint32 cluster, uint32 *FATSecNum, uint16 *FATEntOffset);
extern bool CheckBadCluster(uint32 checkCluster);
extern bool CheckBadBlock(uint32 pageNum);
extern void SetBadBlock(uint32 pageNum);
extern uint32 GetFirstSectorofCluster(uint32 cluster);
//1表格定义
#ifdef IN_FAT
_DskSizeToSecPerClus DskTableFAT16[] DRAM_FAT_TABLE=
{
{8400, 0}, //磁盘容量最大为4.1MB, SecPerClus=0表示这是个错误
{32680, 2}, //磁盘容量最大为16MB, 1KB clus
{262144, 4}, //磁盘容量最大为128MB, 2KB clus
{524288, 8}, //磁盘容量最大为256MB, 4KB clus
{1048576, 16}, //磁盘容量最大为512MB, 8KB clus
{2097152, 32}, //磁盘容量最大为1GB, 16KB clus
{4194304, 64}, //磁盘容量最大为2GB, 32KB clus
{-1, 0} //磁盘容量超过2GB, SecPerClus=0表示这是个错误
};
#if 0
uint8 defaultBootSector[512] =
{
//2 0x00-0x02:跳转指令,跳到操作系统引导程序代码
0xEB,0x3E,0x90,
//2 0x03-0x0a:OEM ID,操作系统名称和版本
'M','S','W','I','N','4','.','1',
//2 0x0b-0x23:BPB
0x00,0x02, //3 0x0b:每扇区的字节数
0x01, //3 0x0d:每簇扇区数
0x01,0x00, //3 0x0e:保留扇区数
0x02, //3 0x10:FAT备份数
0x00,0x02, //3 0x11:根目录项数
0x00,0x00, //3 0x13:该分区上的扇区数
0xF8, //3 0x15:媒体描述符(0xf8=硬盘)
0x3F,0x00, //3 0x16:每FAT占用的扇区数
0x3F,0x00, //3 0x18:每磁道扇区数
0xFF,0x00, //3 0x1a:磁头数
0x00,0x00,0x00,0x00, //3 0x1c:隐藏扇区数
0x00,0x00,0x00,0x00, //3 0x20:总扇区数
//2 0x24-0x3d:扩展BPB
0x00, //3 0x24:物理软盘
0x00, //3 0x25:保留
0x29, //3 0x26:扩展引导标签,必须是0x28或0x29
0x77,0xE2,0xCB,0x94, //3 0x27:卷序号(格式化时产生随机数)
'N','O','N','A','M','E',' ',' ',' ',' ',' ', //3 0x2b:卷标名(11B)
'F','A','T','1','6',' ',' ',' ', //3 0x36:文件系统类型(8B)
//2 0x3e-0x01fd:引导程序代码
0xf1,0x7d,0xfa,0x33,0xc9,0x8e,0xd1,0xbc,
0xfc,0x7b,0x16,0x07,0xbd,0x78,0x00,0xc5,
0x76,0x00,0x1e,0x56,0x16,0x55,0xbf,0x22,
0x05,0x89,0x7E,0x00,0x89,0x4e,0x02,0xb1,
0x0b,0xfc,0x1F,0xBD,0x00,0x7C,0xC6,0x45,
0xFE,0x0F,0x38,0x4E,0x24,0x7D,0x20,0x8B,
0xC1,0x99,0xE8,0x7E,0x01,0x83,0xEB,0x3A,
0x66,0xA1,0x1C,0x7C,0x66,0x3B,0x07,0x8A,
0x57,0xFC,0x75,0x06,0x80,0xCA,0x02,0x88,
0x56,0x02,0x80,0xC3,0x10,0x73,0xED,0x33,
0xC9,0xFE,0x06,0xD8,0x7D,0x8A,0x46,0x10,
0x98,0xF7,0x66,0x16,0x03,0x46,0x1C,0x13,
0x56,0x1E,0x03,0x46,0x0E,0x13,0xD1,0x8B,
0x76,0x11,0x60,0x89,0x46,0xFC,0x89,0x56,
0xFE,0xB8,0x20,0x00,0xF7,0xE6,0x8B,0x5E,
0x0B,0x03,0xC3,0x48,0xF7,0xF3,0x01,0x46,
0xFC,0x11,0x4E,0xFE,0x61,0xBF,0x00,0x07,
0xE8,0x28,0x01,0x72,0x3E,0x38,0x2D,0x74,
0x17,0x60,0xB1,0x0B,0xBE,0xD8,0x7D,0xF3,
0xA6,0x61,0x74,0x3D,0x4E,0x74,0x09,0x83,
0xC7,0x20,0x3B,0xFB,0x72,0xE7,0xEB,0xDD,
0xFE,0x0E,0xD8,0x7D,0x7B,0xA7,0xBE,0x7F,
0x7D,0xAC,0x98,0x03,0xF0,0xAC,0x98,0x40,
0x74,0x0C,0x48,0x74,0x13,0xB4,0x0E,0xBB,
0x07,0x00,0xCD,0x10,0xEB,0xEF,0xBE,0x82,
0x7D,0xEB,0xE6,0xBE,0x80,0x7D,0xEB,0xE1,
0xCD,0x16,0x5E,0x1F,0x66,0x8F,0x04,0xCD,
0x19,0xBE,0x81,0x7D,0x8B,0x7D,0x1A,0x8D,
0x45,0xFE,0x8A,0x4E,0x0D,0xF7,0xE1,0x03,
0x46,0xFC,0x13,0x56,0xFE,0xB1,0x04,0xE8,
0xC2,0x00,0x72,0xD7,0xEA,0x00,0x02,0x70,
0x00,0x52,0x50,0x06,0x53,0x6A,0x01,0x6A,
0x10,0x91,0x8B,0x46,0x18,0xA2,0x26,0x05,
0x96,0x92,0x33,0xD2,0xF7,0xF6,0x91,0xF7,
0xF6,0x42,0x87,0xCA,0xF7,0x76,0x1A,0x8A,
0xF2,0x8A,0xE8,0xC0,0xCC,0x02,0x0A,0xCC,
0xB8,0x01,0x02,0x80,0x7E,0x02,0x0E,0x75,
0x04,0xB4,0x42,0x8B,0xF4,0x8A,0x56,0x24,
0xCD,0x13,0x61,0x61,0x72,0x0A,0x40,0x75,
0x01,0x42,0x03,0x5E,0x0B,0x49,0x75,0x77,
0xC3,0x03,0x18,0x01,0x27,0x0D,0x0A,0x49,
0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x73,
0x79,0x73,0x74,0x65,0x6D,0x20,0x64,0x69,
0x73,0x6B,0xFF,0x0D,0x0A,0x44,0x69,0x73,
0x6B,0x20,0x49,0x2F,0x4F,0x20,0x65,0x72,
0x72,0x6F,0x72,0xFF,0x0D,0x0A,0x52,0x65,
0x70,0x6C,0x61,0x63,0x65,0x20,0x74,0x68,
0x65,0x20,0x64,0x69,0x73,0x6B,0x2C,0x20,
0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x6E,
0x20,0x70,0x72,0x65,0x73,0x73,0x20,0x61,
0x6E,0x79,0x20,0x6B,0x65,0x79,0x0D,0x0A,
0x00,0x00,0x49,0x4F,0x20,0x20,0x20,0x20,
0x20,0x20,0x53,0x59,0x53,0x4D,0x53,0x44,
0x4F,0x53,0x20,0x20,0x20,0x53,0x59,0x53,
0x7F,0x01,0x00,0x41,0xBB,0x00,0x07,0x60,
0x66,0x6A,0x00,0xE9,0x3B,0xFF,0x00,0x00,
//2 0x01fe-0x01ff:有效结束标志
0x55,0xAA
};
#endif
#else
extern uint8 defaultBootSector[512];
extern _DskSizeToSecPerClus DskTableFAT16[];
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -