?? 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 + -