📄 fat.h
字号:
#ifndef __FAT__H
#define __FAT__H
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CHAR unsigned char //8b
#define BYTE unsigned char //8b
#define WORD unsigned short //16b
#define DWORD unsigned int //32b
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern int Fat_Init(void);
int Fat_Init(void); //初始化磁盘分区
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CLUST_RSRVD 0xfffffff6 // 系统保留簇
#define CLUST_BAD 0xfffffff7 // 坏簇
#define CLUST_EOFS 0xfffffff8 // 第一个结束簇
#define CLUST_EOFE 0xffffffff // 最后一个结束簇
#define FAT12_MASK 0x00000fff // FAT12掩码
#define FAT16_MASK 0x0000ffff // FAT16掩码
#define FAT32_MASK 0x0fffffff // FAT32掩码
unsigned int FatNextCluster(unsigned int cluster);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern void List_DirFile(void);
void List_DirFile(void); //列出指定分区的活动目录的内容
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern int Find_DirFile(unsigned char * DFName,unsigned char * DFExt);
#define Null_Ext 0x00 //无后缀名
int Find_DirFile(unsigned char * DFName,unsigned char * DFExt); //查找文件或子目录
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//命令表
extern int CD(unsigned char * DFName);
int CD(unsigned char * DFName);
extern void DIR(void);
void DIR(void);
extern int LoadFile(unsigned int * DesAddr,unsigned char * DFName,unsigned char * DFExt);
int LoadFile(unsigned int * DesAddr,unsigned char * DFName,unsigned char * DFExt);
extern char *ReadCmd(unsigned char * DFName,unsigned char * DFExt);
char *ReadCmd(unsigned char * DFName,unsigned char * DFExt);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 分区类型
#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
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//FAT表结构
__packed typedef struct
{
BYTE Item[512];
}FAT;
/*在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),
随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,硬盘分区表),最后的两
个字节“55 AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。*/
//主引导记录(512字节)
__packed typedef struct //PartSector
{
CHAR psPartCode[512-64-2]; // 启动代码 (446 bytes)
BYTE psPart[64]; // 四个分区表(64 bytes)
BYTE psBootSectSig0; // 两个签名(2 bytes)
BYTE psBootSectSig1;
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
}MBR;
/*第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外
的其余空间,一般而言,就是我们所说的扩展分区。*/
//MBR之DPT部分(partsector->psPart[64]的前16个字节)
__packed typedef struct //PartRecord // 16字节
{
BYTE prIsActive; // 0x80代表该分区为缺省分区
BYTE prStartHead; // 该分区入口的磁头地址
WORD prStartCylSect; // 该分区入口的扇区地址和柱面地址
BYTE prPartType; // 该分区类型,系统ID(System ID)
BYTE prEndHead; // 该分区结束的磁头地址
WORD prEndCylSect; // 该分区结束的扇区地址和柱面地址
DWORD prStartLBA; // 该分区的第一个扇区地址,相对与磁盘的开始(物理0扇区)
DWORD prSize; // 该分区所包含的扇区总数
}DPT;
//系统引导扇区(DOS BOOT RECORD)DBR结构
__packed typedef struct //BootSector
{
BYTE bsJump[3]; // 跳转指令
CHAR bsOEMName[8]; // 厂商标志和OS版本号
CHAR bsBPB[53]; // BPB 参数块
CHAR bsExt[26]; // 扩展BPB
CHAR bsBootCode[418]; // 引导扇区代码
BYTE bsBootSectSig2;
BYTE bsBootSectSig3;
BYTE bsBootSectSig0; // 引导扇区签名0x55
BYTE bsBootSectSig1; // 引导扇区签名0xAA
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
#define BOOTSIG2 0
#define BOOTSIG3 0
}DBR;
// BPB(BIOS Parameter Block) 参数块
// (BootSector->bsBPB[53]的前41字节)
__packed typedef struct
{
WORD bpbBytesPerSec; // 每扇区字节数,通常为512
BYTE bpbSecPerClust; // 每簇扇区数
WORD bpbResSectors; // 保留区域中的保留扇区数
BYTE bpbFATs; // FAT表的份数
WORD bpbRootDirEnts; // 根目录项数,只有Fat12/Fat16用到,Fat32的为0
WORD bpbSmallSectors; // 小扇区数,只有Fat12/Fat16用到,Fat32的为0
BYTE bpbMedia; // 固定存储介质描述
WORD bpbFATsecs; // FAT表所占的扇区数,只有Fat12/Fat16用到,Fat32的为0
WORD bpbSecPerTrack; // 每道扇区数
WORD bpbHeads; // 磁头数
DWORD bpbHiddenSecs; // 隐藏扇区数
DWORD bpbHugeSectors; // 大扇区数,只供Fat32使用
//上面的25字节兼容Fat16
DWORD bpbBigFATsecs; // 每个FAT区所占扇区数,只供Fat32使用
WORD bpbExtFlags; // 扩展标志
#define FATNUM 0xf
#define FATMIRROR 0x80
WORD bpbFSVers; // 文件系统版本,只供Fat32使用
#define FSVERS 0
DWORD bpbRootClust; // 根目录簇号
WORD bpbFSInfo; // 文件系统信息扇区号,只供Fat32使用
WORD bpbBackup; // 备份引导扇区,扇区号,一般为6,只供Fat32使用
//这里还有12个字节的保留空间,全为0x00,只供Fat32使用
}BPB;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// 目录或文件入口地址结构
__packed typedef struct
{
BYTE deName[8]; // 文件名
#define SLOT_EMPTY 0x00 // 目录项为空
#define SLOT_E5 0x05
#define SLOT_DELETED 0xe5 // 文件已被删除
BYTE deExtension[3]; // 扩展名
BYTE deAttributes; // 文件属性
#define ATTR_NORMAL 0x00 // 读写
#define ATTR_READONLY 0x01 // 只读
#define ATTR_HIDDEN 0x02 // 隐藏
#define ATTR_SYSTEM 0x04 // 系统文件
#define ATTR_VOLUME 0x08 // 卷标文件
#define ATTR_LONG_FILENAME 0x0f // 长文件名文件
#define ATTR_DIRECTORY 0x10 // 子目录文件
#define ATTR_ARCHIVE 0x20 // 归档文件
////////Fat16时,下面部分为系统保留空间,共10字节////////////////////
BYTE deLowerCase; // 系统保留
#define LCASE_BASE 0x08
#define LCASE_EXT 0x10
BYTE deCHundredth; // 文件创建时间的10MS
BYTE deCTime[2]; // 文件创建时间
BYTE deCDate[2]; // 文件创建日期
BYTE deADate[2]; // 文件最近访问日期
WORD deHighClust; // 文件起始簇号的高16位
/////////////////////////////////////////////////////////////////////
BYTE deMTime[2]; // 文件最近修改时间
BYTE deMDate[2]; // 文件最近修改日期
WORD deStartCluster; // 文件起始簇号的低16位
DWORD deFileSize; // 文件长度
}DirFile;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
/*
// Stuctures
struct FileInfoStruct
{
unsigned char Name[256]; // 100 first char on the longfilename
unsigned char Extension[3]; // extension
unsigned long StartCluster; //< file starting cluster for last file accessed
unsigned long Size; //< file size for last file accessed
unsigned char Attr; //< file attr for last file accessed
unsigned char CreateDate[10]; //< file creation date for last file accessed
unsigned char CreateTime[8]; //< file creation time for last file accessed
};
*/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -