📄 fat.h
字号:
/****************************************Copyright (c)**************************************************
** 上海新时达电气有限公司
** 研 发 中 心
** 研发一部
**
** http://www.stepelevatar.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: fat.h
**创 建 人: 吕海安
**最后修改日期: 2007年05月31日
**描 述: fat 文件系统的头文件
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕海安
** 版 本: v1.0
** 日 期: 2007年05月31日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人:
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef FAT_H
#define FAT_H
#include "comm.h"
#pragma pack(1)
#define uint8 unsigned char
#define uint8 unsigned char
#define uint16 unsigned short
#define uint32 unsigned long
//簇定义
#define MSDOSFSROOT 0
#define CLUST_FREE 0
#define MSDOSFSFREE CLUST_FREE
#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掩码
#define FAT12 0
#define FAT16 1
#define FAT32 2
// 分区类型
#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
typedef struct // 16 字节
{
uint8 prIsActive; // 0x80代表该分区为缺省分区
uint8 prStartHead; // 该分区入口的磁头地址
uint16 prStartCylSect; // 该分区入口的扇区地址和柱面地址
uint8 prPartType; // 该分区类型
uint8 prEndHead; // 该分区结束的扇区地址
uint16 prEndCylSect; // 该分区结束的柱面地址
uint32 prStartLBA; // 该分区内第一个扇区地址
uint32 prSize; // 该分区所包含的扇区总数
}PARTRECORD;
typedef struct
{
uint8 psPartCode[512-64-2]; // 启动代码 (446 bytes)
uint8 psPart[64]; // 四个分区表(64 bytes)
uint8 psBootSectSig0; // 两个签名(2 bytes)
uint8 psBootSectSig1;
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
}PARTSECTOR;
// 系统引导扇区(DOS BOOT RECORD)DBR结构
typedef struct
{
uint8 bsJump[3]; // 跳转指令
uint8 bsOEMName[8]; // 厂商标志和OS版本号
uint8 bsBPB[53]; // BIOS 参数块
uint8 bsExt[26]; // 扩展BPB
uint8 bsBootCode[418]; // 引导扇区代码
uint8 bsBootSectSig2;
uint8 bsBootSectSig3;
uint8 bsBootSectSig0; // 引导扇区签名0x55
uint8 bsBootSectSig1; // 引导扇区签名0xAA
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
#define BOOTSIG2 0
#define BOOTSIG3 0
}BOOTSECTOR710;
// BIOS 参数块
typedef struct
{
uint16 bpbBytesPerSec; // 每扇区字节数
uint8 bpbSecPerClust; // 每簇扇区数
uint16 bpbResSectors; // 保留区域中的保留扇区数
uint8 bpbFATs; // FAT表的份数
uint16 bpbRootDirEnts; // 根目录项数
uint16 bpbSectors; // 此域为存储卷上的扇区总数
uint8 bpbMedia; // 固定存储介质描述
uint16 bpbFATsecs; // FAT表所占的扇区数
uint16 bpbSecPerTrack; // 每道扇区数
uint16 bpbHeads; // 磁头数
uint32 bpbHiddenSecs; // 隐藏扇区数
uint32 bpbHugeSectors; // 总扇区数
uint32 bpbBigFATsecs; // 每个FAT区所占扇区数
uint16 bpbExtFlags; // 扩展标志
#define FATNUM 0xf
#define FATMIRROR 0x80
uint16 bpbFSVers; // 文件系统版本
#define FSVERS 0
uint32 bpbRootClust; // 根目录簇号
uint16 bpbFSInfo; // 文件系统信息扇区号
uint16 bpbBackup; // 备份引导扇区
} BPB710;
// 目录或文件入口地址结构
typedef struct{
uint8 deName[8]; // 文件名
#define SLOT_EMPTY 0x00 // 目录项为空
#define SLOT_E5 0x05
#define SLOT_DELETED 0xe5 // 文件已被删除
uint8 deExtension[3]; // 扩展名
uint8 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 // 归档文件
uint8 deLowerCase; // 系统保留
#define LCASE_BASE 0x08
#define LCASE_EXT 0x10
uint8 deCHundredth; // 文件创建时间的10MS
uint8 deCTime[2]; // 文件创建时间
uint8 deCDate[2]; // 文件创建日期
uint8 deADate[2]; // 文件最近访问日期
uint16 deHighClust; // 文件起始簇号的高16位
uint8 deMTime[2]; // 文件最近修改时间
uint8 deMDate[2]; // 文件最近修改日期
uint16 deStartCluster; // 文件起始簇号的低16位
uint32 deFileSize; // 文件长度
} DIRENTRY;
// 一个扇区中的目录项数
#define DIRENTRIES_PER_SECTOR 0x10
// 长文件名入口地址结构
typedef struct {
uint8 weCnt; //序号
#define WIN_LAST 0x40
#define WIN_CNT 0x3f
uint8 wePart1[10]; //长文件名UNICODE码(第一部分)
uint8 weAttributes; //长文件名目录项标志
#define ATTR_WIN95 0x0f
uint8 weReserved1; //系统保留
uint8 weChksum; //校验值
uint8 wePart2[12]; //长文件名UNICODE码(第二部分)
uint16 weReserved2; //文件开始簇号
uint8 wePart3[4]; //长文件名UNICODE码(第三部分)
} WINENTRY;
#define WIN_uint8S 13 //长文件名入口地址结构可包含13个字符
//在FAT32中,文件名最长可到255个字符
#define WIN_MAXLEN 255
// 目录或文件入口地址结构中的时间结构
#define DT_2SECONDS_MASK 0x1F // 秒
#define DT_2SECONDS_SHIFT 0
#define DT_MINUTES_MASK 0x7E0 // 分
#define DT_MINUTES_SHIFT 5
#define DT_HOURS_MASK 0xF800 // 时
#define DT_HOURS_SHIFT 11
// 目录或文件入口地址结构中的日期结构
#define DD_DAY_MASK 0x1F // 日
#define DD_DAY_SHIFT 0
#define DD_MONTH_MASK 0x1E0 // 月
#define DD_MONTH_SHIFT 5
#define DD_YEAR_MASK 0xFE00 // 年 - 1980
#define DD_YEAR_SHIFT 9
// 可调函数
extern void ReadBlock(INT32U LBA);
extern INT32U fatClustToSect(INT32U clust);
extern INT32U fatGetRootSector(void);
extern INT32U fatGetRootClust(void);
extern INT8U fatInit( void);
extern INT16U fatClusterSize(void);
extern INT32U fatGetFilesize(void);
extern char* fatGetFilename(void);
extern char* fatGetDirname(void);
extern void fatLoadCluster(INT32U cluster, INT8U *buffer);
extern INT32U fatNextCluster(INT32U cluster);
extern void GetSysFileClust(INT32U *hzk,INT32U *unit);
extern void FindLrcFile(INT32U dircluster,INT8U *strName);
extern INT8U IsMusicFile(INT8U *strName);
extern void InitSetPath(FIND_FILE_INFO *fp,INT32U dircluster);
extern void ReadBlockToBuff(INT32U LBA,INT8U *pbuff);
extern INT8U ReadNextDirEntry(FIND_FILE_INFO *fp);
extern void UniToGB(INT8U *pbuf);
extern INT8U IsUnitogbFile(INT8U *pbuf);
extern INT8U IsHzk12File(INT8U *pbuf);
extern INT8U IsCurDir(INT8U *strName);
extern INT8U IsFatherDir(INT8U *strName);
extern INT16U FindDirIndex(INT32U fatherdir,INT32U dircluster);
extern INT16U SerarchFile(INT32U dircluster,INT16U index);
extern INT32U GetSysFileSector(void *eep,INT16U clustr);
#endif
/*****************************************************************************************
* END OF FILE
*****************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -