?? fat.h
字號(hào):
/************************************************************/
/* HEAD FILE for FAT */
/* By pasyong */
/* 2006-4 */
/* Base ICC6.31A */
/************************************************************/
#ifndef FAT_H
#define FAT_H
#define CHAR unsigned char
#define BYTE unsigned char
#define WORD unsigned int
#define DWORD unsigned long
//簇定義
#define MSDOSFSROOT 0
#define CLUST_FREE 0
#define MSDOSFSFREE CLUST_FREE
#define CLUST_FIRST 2 // 第一個(gè)數(shù)據(jù)簇
#define CLUST_RSRVD 0xfffffff6 // 系統(tǒng)保留簇
#define CLUST_BAD 0xfffffff7 // 壞簇
#define CLUST_EOFS 0xfffffff8 // 第一個(gè)結(jié)束簇
#define CLUST_EOFE 0xffffffff // 最后一個(gè)結(jié)束簇
#define FAT12_MASK 0x00000fff // FAT12掩碼
#define FAT16_MASK 0x0000ffff // FAT16掩碼
#define FAT32_MASK 0x0fffffff // FAT32掩碼
// 分區(qū)類型
#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
struct partrecord // 16 字節(jié)
{
BYTE prIsActive; // 0x80代表該分區(qū)為缺省分區(qū)
BYTE prStartHead; // 該分區(qū)入口的磁頭地址
WORD prStartCylSect; // 該分區(qū)入口的扇區(qū)地址和柱面地址
BYTE prPartType; // 該分區(qū)類型
BYTE prEndHead; // 該分區(qū)結(jié)束的扇區(qū)地址
WORD prEndCylSect; // 該分區(qū)結(jié)束的柱面地址
DWORD prStartLBA; // 該分區(qū)內(nèi)第一個(gè)扇區(qū)地址
DWORD prSize; // 該分區(qū)所包含的扇區(qū)總數(shù)
};
struct partsector
{
CHAR psPartCode[512-64-2]; // 啟動(dòng)代碼 (446 bytes)
BYTE psPart[64]; // 四個(gè)分區(qū)表(64 bytes)
BYTE psBootSectSig0; // 兩個(gè)簽名(2 bytes)
BYTE psBootSectSig1;
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
};
//系統(tǒng)引導(dǎo)扇區(qū)(DOS BOOT RECORD)DBR結(jié)構(gòu)
struct bootsector710 {
BYTE bsJump[3]; // 跳轉(zhuǎn)指令
CHAR bsOEMName[8]; // 廠商標(biāo)志和OS版本號(hào)
CHAR bsBPB[53]; // BIOS 參數(shù)塊
CHAR bsExt[26]; // 擴(kuò)展BPB
CHAR bsBootCode[418]; // 引導(dǎo)扇區(qū)代碼
BYTE bsBootSectSig2;
BYTE bsBootSectSig3;
BYTE bsBootSectSig0; // 引導(dǎo)扇區(qū)簽名0x55
BYTE bsBootSectSig1; // 引導(dǎo)扇區(qū)簽名0xAA
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
#define BOOTSIG2 0
#define BOOTSIG3 0
};
// BIOS 參數(shù)塊
struct bpb710 {
WORD bpbBytesPerSec; // 每扇區(qū)字節(jié)數(shù)
BYTE bpbSecPerClust; // 每簇扇區(qū)數(shù)
WORD bpbResSectors; // 保留區(qū)域中的保留扇區(qū)數(shù)
BYTE bpbFATs; // FAT表的份數(shù)
WORD bpbRootDirEnts; // 根目錄項(xiàng)數(shù)
WORD bpbSectors; // 此域?yàn)榇鎯?chǔ)卷上的扇區(qū)總數(shù)
BYTE bpbMedia; // 固定存儲(chǔ)介質(zhì)描述
WORD bpbFATsecs; // FAT表所占的扇區(qū)數(shù)
WORD bpbSecPerTrack; // 每道扇區(qū)數(shù)
WORD bpbHeads; // 磁頭數(shù)
DWORD bpbHiddenSecs; // 隱藏扇區(qū)數(shù)
DWORD bpbHugeSectors; // 總扇區(qū)數(shù)
DWORD bpbBigFATsecs;// 每個(gè)FAT區(qū)所占扇區(qū)數(shù)
WORD bpbExtFlags; // 擴(kuò)展標(biāo)志
#define FATNUM 0xf
#define FATMIRROR 0x80
WORD bpbFSVers; // 文件系統(tǒng)版本
#define FSVERS 0
DWORD bpbRootClust; // 根目錄簇號(hào)
WORD bpbFSInfo; // 文件系統(tǒng)信息扇區(qū)號(hào)
WORD bpbBackup; // 備份引導(dǎo)扇區(qū)
};
// 目錄或文件入口地址結(jié)構(gòu)
struct direntry {
BYTE deName[8]; // 文件名
#define SLOT_EMPTY 0x00 // 目錄項(xiàng)為空
#define SLOT_E5 0x05
#define SLOT_DELETED 0xe5 // 文件已被刪除
BYTE deExtension[3]; // 擴(kuò)展名
BYTE deAttributes; // 文件屬性
#define ATTR_NORMAL 0x00 // 讀寫(xiě)
#define ATTR_READONLY 0x01 // 只讀
#define ATTR_HIDDEN 0x02 // 隱藏
#define ATTR_SYSTEM 0x04 // 系統(tǒng)文件
#define ATTR_VOLUME 0x08 // 卷標(biāo)文件
#define ATTR_LONG_FILENAME 0x0f // 長(zhǎng)文件名文件
#define ATTR_DIRECTORY 0x10 // 子目錄文件
#define ATTR_ARCHIVE 0x20 // 歸檔文件
BYTE deLowerCase; // 系統(tǒng)保留
#define LCASE_BASE 0x08
#define LCASE_EXT 0x10
BYTE deCHundredth; // 文件創(chuàng)建時(shí)間的10MS
BYTE deCTime[2]; // 文件創(chuàng)建時(shí)間
BYTE deCDate[2]; // 文件創(chuàng)建日期
BYTE deADate[2]; // 文件最近訪問(wèn)日期
WORD deHighClust; // 文件起始簇號(hào)的高16位
BYTE deMTime[2]; // 文件最近修改時(shí)間
BYTE deMDate[2]; // 文件最近修改日期
WORD deStartCluster; // 文件起始簇號(hào)的低16位
DWORD deFileSize; // 文件長(zhǎng)度
};
// 一個(gè)扇區(qū)中的目錄項(xiàng)數(shù)
#define DIRENTRIES_PER_SECTOR 0x10
// 長(zhǎng)文件名入口地址結(jié)構(gòu)
struct winentry {
BYTE weCnt; //序號(hào)
#define WIN_LAST 0x40
#define WIN_CNT 0x3f
BYTE wePart1[10]; //長(zhǎng)文件名UNICODE碼(第一部分)
BYTE weAttributes; //長(zhǎng)文件名目錄項(xiàng)標(biāo)志
#define ATTR_WIN95 0x0f
BYTE weReserved1; //系統(tǒng)保留
BYTE weChksum; //校驗(yàn)值
BYTE wePart2[12]; //長(zhǎng)文件名UNICODE碼(第二部分)
WORD weReserved2; //文件開(kāi)始簇號(hào)
BYTE wePart3[4]; //長(zhǎng)文件名UNICODE碼(第三部分)
};
#define WIN_CHARS 13 //長(zhǎng)文件名入口地址結(jié)構(gòu)可包含13個(gè)字符
//在FAT32中,文件名最長(zhǎng)可到255個(gè)字符
#define WIN_MAXLEN 255
// 目錄或文件入口地址結(jié)構(gòu)中的時(shí)間結(jié)構(gòu)
#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 // 時(shí)
#define DT_HOURS_SHIFT 11
// 目錄或文件入口地址結(jié)構(gòu)中的日期結(jié)構(gòu)
#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
// 調(diào)可函數(shù)
void ReadBlock(unsigned long LBA);
unsigned long fatClustToSect(unsigned long clust);
unsigned char fatInit( void);
unsigned int fatClusterSize(void);
unsigned long fatGetDirEntry(unsigned int entry);
unsigned long fatGetFilesize(void);
char* fatGetFilename(void);
char* fatGetDirname(void);
void fatLoadCluster(unsigned long cluster, unsigned char *buffer);
unsigned long fatNextCluster(unsigned long cluster);
#endif
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -