📄 fat.h
字号:
#define FATNUM 0xf /* mask for numbering active FAT */
#define FATMIRROR 0x80 /* FAT is mirrored (like it always was) */
WORD bpbFSVers; /* filesystem version */
#define FSVERS 0 /* currently only 0 is understood */
DWORD bpbRootClust; /* start cluster for root directory */
WORD bpbFSInfo; /* filesystem info structure sector */
WORD bpbBackup; /* backup boot sector */
/* There is a 12 byte filler here, but we ignore it */
};
/***************************************************************/
/* byte versions of the above structs */
/***************************************************************/
/*
* BIOS Parameter Block (BPB) for DOS 3.3
*/
struct byte_bpb33 {
CHAR bpbBytesPerSec[2]; /* bytes per sector */
CHAR bpbSecPerClust; /* sectors per cluster */
CHAR bpbResSectors[2]; /* number of reserved sectors */
CHAR bpbFATs; /* number of FATs */
CHAR bpbRootDirEnts[2]; /* number of root directory entries */
CHAR bpbSectors[2]; /* total number of sectors */
CHAR bpbMedia; /* media descriptor */
CHAR bpbFATsecs[2]; /* number of sectors per FAT */
CHAR bpbSecPerTrack[2]; /* sectors per track */
CHAR bpbHeads[2]; /* number of heads */
CHAR bpbHiddenSecs[2]; /* number of hidden sectors */
};
/*
* BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
* and bpbHugeSectors is not in the 3.3 bpb.
*/
struct byte_bpb50 {
CHAR bpbBytesPerSec[2]; /* bytes per sector */
CHAR bpbSecPerClust; /* sectors per cluster */
CHAR bpbResSectors[2]; /* number of reserved sectors */
CHAR bpbFATs; /* number of FATs */
CHAR bpbRootDirEnts[2]; /* number of root directory entries */
CHAR bpbSectors[2]; /* total number of sectors */
CHAR bpbMedia; /* media descriptor */
CHAR bpbFATsecs[2]; /* number of sectors per FAT */
CHAR bpbSecPerTrack[2]; /* sectors per track */
CHAR bpbHeads[2]; /* number of heads */
CHAR bpbHiddenSecs[4]; /* number of hidden sectors */
CHAR bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */
};
/*
* BPB for DOS 7.10 (FAT32). This one has a few extensions to bpb50.
*/
struct byte_bpb710 {
BYTE bpbBytesPerSec[2]; /* bytes per sector */
BYTE bpbSecPerClust; /* sectors per cluster */
BYTE bpbResSectors[2]; /* number of reserved sectors */
BYTE bpbFATs; /* number of FATs */
BYTE bpbRootDirEnts[2]; /* number of root directory entries */
BYTE bpbSectors[2]; /* total number of sectors */
BYTE bpbMedia; /* media descriptor */
BYTE bpbFATsecs[2]; /* number of sectors per FAT */
BYTE bpbSecPerTrack[2]; /* sectors per track */
BYTE bpbHeads[2]; /* number of heads */
BYTE bpbHiddenSecs[4]; /* # of hidden sectors */
BYTE bpbHugeSectors[4]; /* # of sectors if bpbSectors == 0 */
BYTE bpbBigFATsecs[4]; /* like bpbFATsecs for FAT32 */
BYTE bpbExtFlags[2]; /* extended flags: */
BYTE bpbFSVers[2]; /* filesystem version */
BYTE bpbRootClust[4]; /* start cluster for root directory */
BYTE bpbFSInfo[2]; /* filesystem info structure sector */
BYTE bpbBackup[2]; /* backup boot sector */
/* There is a 12 byte filler here, but we ignore it */
};
/*
* FAT32 FSInfo block.
*/
struct fsinfo {
BYTE fsisig1[4];
BYTE fsifill1[480];
BYTE fsisig2[4];
BYTE fsinfree[4];
BYTE fsinxtfree[4];
BYTE fsifill2[12];
BYTE fsisig3[4];
BYTE fsifill3[508];
BYTE fsisig4[4];
};
/***************************************************************/
/***************************************************************/
/*
* Structure of a dos directory entry.
*/
struct direntry {
BYTE deName[8]; /* filename, blank filled */
#define SLOT_EMPTY 0x00 /* slot has never been used */
#define SLOT_E5 0x05 /* the real value is 0xe5 */
#define SLOT_DELETED 0xe5 /* file in this slot deleted */
BYTE deExtension[3]; /* extension, blank filled */
BYTE deAttributes; /* file attributes */
#define ATTR_NORMAL 0x00 /* normal file */
#define ATTR_READONLY 0x01 /* file is readonly */
#define ATTR_HIDDEN 0x02 /* file is hidden */
#define ATTR_SYSTEM 0x04 /* file is a system file */
#define ATTR_VOLUME 0x08 /* entry is a volume label */
#define ATTR_LONG_FILENAME 0x0f /* this is a long filename entry */
#define ATTR_DIRECTORY 0x10 /* entry is a directory name */
#define ATTR_ARCHIVE 0x20 /* file is new or modified */
BYTE deLowerCase; /* NT VFAT lower case flags */
#define LCASE_BASE 0x08 /* filename base in lower case */
#define LCASE_EXT 0x10 /* filename extension in lower case */
BYTE deCHundredth; /* hundredth of seconds in CTime */
BYTE deCTime[2]; /* create time */
BYTE deCDate[2]; /* create date */
BYTE deADate[2]; /* access date */
WORD deHighClust; /* high bytes of cluster number */
BYTE deMTime[2]; /* last update time */
BYTE deMDate[2]; /* last update date */
WORD deStartCluster; /* starting cluster of file */
DWORD deFileSize; /* size of file in bytes */
};
/*
* Structure of a Win95 long name directory entry
*/
struct winentry {
BYTE weCnt;
#define WIN_LAST 0x40
#define WIN_CNT 0x3f
BYTE wePart1[10];
BYTE weAttributes;
#define ATTR_WIN95 0x0f
BYTE weReserved1;
BYTE weChksum;
BYTE wePart2[12];
WORD weReserved2;
BYTE wePart3[4];
};
#define WIN_CHARS 13 /* Number of chars per winentry */
/*
* Maximum filename length in Win95
* Note: Must be < sizeof(dirent.d_name)
*/
#define WIN_MAXLEN 255
/*
* This is the format of the contents of the deTime field in the direntry
* structure.
* We don't use bitfields because we don't know how compilers for
* arbitrary machines will lay them out.
*/
#define DT_2SECONDS_MASK 0x1F /* seconds divided by 2 */
#define DT_2SECONDS_SHIFT 0
#define DT_MINUTES_MASK 0x7E0 /* minutes */
#define DT_MINUTES_SHIFT 5
#define DT_HOURS_MASK 0xF800 /* hours */
#define DT_HOURS_SHIFT 11
/*
* This is the format of the contents of the deDate field in the direntry
* structure.
*/
#define DD_DAY_MASK 0x1F /* day of month */
#define DD_DAY_SHIFT 0
#define DD_MONTH_MASK 0x1E0 /* month */
#define DD_MONTH_SHIFT 5
#define DD_YEAR_MASK 0xFE00 /* year - 1980 */
#define DD_YEAR_SHIFT 9
/*
*
* Prototypes
*
*/
unsigned char init_fat( unsigned char device);
unsigned long get_dir_entry(unsigned int entry, unsigned int count);
void load_sectors(unsigned long cluster, unsigned char *buffer);
unsigned long next_cluster(unsigned long cluster);
unsigned long get_filesize(void);
char *get_filename(void);
char *get_dirname(void);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -