📄 ufat_types.h
字号:
/*
* UFAT3 Config File ufat.h
* Copyright (C) 2005 Sunnorth
*
* First Built: Yongliang 2005-8-9
*/
#ifndef _UFAT3_HEADER_UFAT_TYPES_H_
#define _UFAT3_HEADER_UFAT_TYPES_H_
#include "ufat_config.h"
#include "ufat_fcntl.h"
/* basic variable types */
typedef unsigned long UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
typedef long INT32;
typedef short INT16;
typedef char INT8;
/* default function return type */
typedef int RES;
typedef int BOOL;
typedef int MODE;
/* cluster index type */
typedef UINT32 CLUSTER;
/* sector index type */
typedef UINT32 SECTOR;
/* rw count type */
#define RWCOUNT int
#if DIRECT_DMA_MODE
# define BUFTYPE(buf) (UINT32)(buf)
typedef UINT32 buf_t;
extern UINT8 xfermode;
#else
# define BUFTYPE(buf) (UINT8 *)(buf)
typedef void * buf_t;
#endif
/* FAT file name constants */
#define FNAME_SIZE 8
#define FEXT_SIZE 3
/* file time types */
typedef unsigned short dosdate;
typedef unsigned short dostime;
/* FAT file system directory entry */
APACKED struct ufat_dirent {
UINT8 dir_name[FNAME_SIZE + FEXT_SIZE]; /* Filename + extension in FCB format */
UINT8 dir_attrib; /* File Attribute */
UINT8 dir_case; /* File case */
UINT8 dir_crtimems; /* Milliseconds */
UINT16 dir_crtime; /* Creation time */
UINT16 dir_crdate; /* Creation date */
UINT16 dir_accdate; /* Last access date */
UINT16 dir_start_high; /* High word of the cluster */
dostime dir_time; /* Time file created/updated */
dosdate dir_date; /* Date file created/updated */
UINT16 dir_start; /* Starting cluster */
/* 1st available = 2 */
UINT32 dir_size; /* File size in bytes */
} PACKED;
typedef struct ufat_dirent st_dirent;
typedef st_dirent *st_dirent_ptr;
/* Internal drive parameter block */
struct dpb {
UINT8 dpb_unit; /* unit for error reporting */
//BYTE dpb_subunit; /* the sub-unit for driver */
UINT16 dpb_secsize; /* sector size */
UINT8 dpb_clsmask; /* mask (sectors/cluster-1) */
UINT8 dpb_shftcnt; /* log base 2 of cluster size */
UINT16 dpb_fatstrt; /* FAT start sector */
UINT8 dpb_fats; /* # of FAT copies */
UINT16 dpb_dirents; /* # of dir entries */
UINT16 dpb_data; /* start of data area */
UINT16 dpb_size; /* # of clusters+1 on media */
UINT16 dpb_fatsize; /* # of sectors / FAT */
UINT16 dpb_dirstrt; /* start sec. of root dir */
// struct dpb FAR * /* next dpb in chain */
// dpb_next; /* -1 = end */
UINT32 dpb_hidden;
UINT16 dpb_cluster; /* cluster # of first free */
/* -1 if not known */
#if WITHFAT32 == 0
UINT16 dpb_nfreeclst; /* number of free clusters */
/* -1 if not known */
#else
union {
struct {
UINT16 dpb_nfreeclst_lo;
UINT16 dpb_nfreeclst_hi;
} dpb_nfreeclst_st;
UINT32 _dpb_xnfreeclst; /* number of free clusters */
/* -1 if not known */
} dpb_nfreeclst_un;
#define dpb_nfreeclst dpb_nfreeclst_un.dpb_nfreeclst_st.dpb_nfreeclst_lo
#define dpb_xnfreeclst dpb_nfreeclst_un._dpb_xnfreeclst
UINT16 dpb_xflags; /* extended flags, see bpb */
UINT16 dpb_xfsinfosec; /* FS info sector number, */
/* 0xFFFF if unknown */
UINT16 dpb_xbackupsec; /* backup boot sector number */
/* 0xFFFF if unknown */
UINT32 dpb_xdata;
UINT32 dpb_xsize; /* # of clusters+1 on media */
UINT32 dpb_xfatsize; /* # of sectors / FAT */
UINT32 dpb_xrootclst; /* starting cluster of root dir */
UINT32 dpb_xcluster; /* cluster # of first free */
/* -1 if not known */
UINT8 dpb_fsinfoflag; /* change flag for fsinfo */
#endif
UINT8 dpb_mounted; /* the device has been mounted */
struct
{
int write:1;
int read:1;
int active:1;
} Status;
};
typedef struct dpb st_dpb;
typedef st_dpb *st_dpb_ptr;
#define UNKNCLUSTER 0x0000 /* see RBIL INT 21/AH=52 entry */
#define XUNKNCLSTFREE 0xffffffffl /* unknown for DOS */
#define UNKNCLSTFREE 0xffff /* unknown for DOS */
#define FSINFODIRTYFLAG 0x01
#define FSINFOLOADED 0x02
/* file node structure definition */
typedef struct f_node {
UINT16 f_count; /* number of uses of this file */
UINT8 f_mode; /* read, write, read-write, etc */
UINT8 f_flags; /* file flags */
struct ufat_dirent f_dir; /* this file's dir entry image */
UINT16 f_diroff; /* offset/32 of the dir entry */
CLUSTER f_dirstart; /* the starting cluster of dir */
/* when dir is not root */
struct dpb * f_dpb; /* the block device for file */
UINT32 f_offset; /* byte offset for next op */
CLUSTER f_cluster_offset; /* relative cluster number within file */
CLUSTER f_cluster; /* the cluster we are at */
} st_f_node;
/* bit value of f_mode field */
#define F_DMOD (1) /* directory has been modified */
#define F_DDIR (2) /* fnode is assigned to dir */
#define F_DDATE (4) /* date set using setdate */
/* pointer type to the file node structure */
typedef struct f_node * st_f_node_ptr;
/* struct of direntry */
typedef APACKED struct {
INT8 Name[11];
UINT8 Attr;
UINT8 NTRes;
UINT8 CrtTimeTenth;
UINT16 CrtTime;
UINT16 CrtDate;
UINT16 LstAccDate;
UINT16 FstClusHI;
UINT16 WrtTime;
UINT16 WrtDate;
UINT16 FstClusLO;
UINT32 FileSize;
} PACKED tDirEntry;
/* long file name dir entry struct */
typedef APACKED struct
{
INT8 Order; /* Sequence number for slot */
INT16 Name0_4[5]; /* First 5 Unicode characters */
INT8 Attr; /* Attributes, always 0x0F */
INT8 Reserved; /* Reserved, always 0x00 */
INT8 Checksum; /* Checksum of 8.3 name */
INT16 Name5_10[6]; /* 6 more Unicode characters */
INT16 FstClus; /* First cluster number, must be 0 */
INT16 Name11_12[2]; /* Last 2 Unicode characters */
} PACKED tLfnEntry;
/* struct used by fat_find and descend_path, etc */
typedef struct {
tDirEntry SfnEntry;
UINT32 EntryOffset;
int LfnEntries;
char LongName[260];
char ShortName[14];
} tFatFind;
/* driver list structure */
struct Drv_FileSystem {
UINT8 Name[8];
RES (*Drv_Initial)(void);
UINT32 (*Drv_GetMemSize)(void);
RES (*Drv_ReadSector) (SECTOR, RWCOUNT, UINT8 *);
RES (*Drv_WriteSector) (SECTOR, RWCOUNT, UINT8 *);
};
/* driver list structure for ecos*/
struct Drv_FileSystem_ECOS{
UINT8 Name[8];
RES (*Drv_ReadSector) (UINT8,SECTOR, RWCOUNT, UINT8 *);
RES (*Drv_WriteSector) (UINT8,SECTOR, RWCOUNT, UINT8 *);
};
/* data buffer structure type */
#define BUFFERSIZE 512
#define BUFFERSEC (BUFFERSIZE/512)
typedef struct buffer {
struct buffer *b_next; /* next buffer in LRU list */
struct buffer *b_prev; /* previous buffer in LRU list */
UINT8 b_unit; /* disk for this buffer */
UINT8 b_flag; /* buffer flags */
UINT32 b_blkno; /* block for this buffer */
UINT8 b_copies; /* number of copies to write */
UINT16 b_offset; /* offset in sectors between copies
to write for FAT sectors */
struct dpb * b_dpbp; /* pointer to DPB */
/* Commented By Ahan on: 2005/09/28
* To read more than 1 sector from HD, we modify this structure. * */
//UINT8 b_buffer[BUFFERSIZE]; /* 512 byte sectors for now */
UINT8* b_buffer; /* 512 byte sectors for now */
} st_buffer;
/* pointer to data buffer structure data type */
typedef struct buffer XDATA * st_buffer_ptr;
#define BFR_DIRTY 0x40 /* buffer modified */
#define BFR_VALID 0x20 /* buffer contains valid data */
#define BFR_FSINFO 0x10 /* buffer is from file system sector, By Ahan on: 2005/10/07 */
#define BFR_DATA 0x08 /* buffer is from data area */
#define BFR_DIR 0x04 /* buffer is from dir area */
#define BFR_FAT 0x02 /* buffer is from fat area */
#define BFR_UNCACHE 0x01 /* buffer to be released ASAP */
#if UFAT_WITH_PREFETCH_BUFFER
typedef enum{
UFAT_CACHE_START = 0,
UFAT_CACHE_FAT_START = UFAT_CACHE_START,
UFAT_CACHE_FAT_END = UFAT_CACHE_START + UFAT_PREFETCH_FAT_NUM - 1,
UFAT_CACHE_DIR_START = UFAT_CACHE_FAT_END + 1,
UFAT_CACHE_DIR_END = UFAT_CACHE_DIR_START + UFAT_PREFETCH_DIRENT_NUM - 1,
UFAT_CACHE_FSINFO_START = UFAT_CACHE_DIR_END + 1,
UFAT_CACHE_FSINFO_END = UFAT_CACHE_FSINFO_START + UFAT_PREFETCH_FSINFO_NUM - 1,
UFAT_CACHE_DATA_START = UFAT_CACHE_FSINFO_END + 1,
UFAT_CACHE_DATA_END = UFAT_CACHE_DATA_START + UFAT_PREFETCH_DATA_NUM - 1,
UFAT_CACHE_END
}UFAT_CACHE_STRUCT;
#endif
/* dos time and dos date struct type*/
typedef struct s_dosdate
{
unsigned short year;
unsigned char monthday, month;
} st_dosdate;
typedef struct s_dostime
{
unsigned char minute, hour, hundredth, second;
} st_dostime;
/*******************************************************************************/
/* FAT time notation in the form of hhhh hmmm mmmd dddd (d = double second) */
#define EPOCH_YEAR 1980 /* for Tues 1-1-80 epoch */
#define DT_YEAR(d) ((((d)>>9)&0x7f) + EPOCH_YEAR)
#define DT_MONTH(d) (((d)>>5)&0x0f)
#define DT_DAY(d) ((d)&0x1f)
#define TM_HOUR(t) (((t)>>11)&0x1f)
#define TM_MIN(t) (((t)>>5)&0x3f)
#define TM_DEC(t) ((t)&0x1f)
/*******************************************************************************/
/* FAT file date - takes the form of yyyy yyym mmmd dddd where physical */
/* year=1980+yyyyyy */
#define DT_ENCODE(m,d,y) ((((m)&0x0f)<<5)|((d)&0x1f)|(((y)&0x7f)<<9))
#define EPOCH_WEEKDAY 2 /* Tuesday (i. e.- 0 == Sunday) */
#define EPOCH_MONTH 1 /* January */
#define EPOCH_DAY 1 /* 1 for January 1 */
#define EPOCH_YEAR 1980 /* for Tues 1-1-80 epoch */
/* FAT deleted flag */
#define DELETED '\x5' /* if first char, delete file */
#define EXT_DELETED '\xe5' /* external deleted flag */
/*for link fat 2nd parameter*/
#define READ_CLUSTER (CLUSTER)(1)
/* magic constants: even though FF7 is BAD so FF6 could be a valid cluster
no., MS docs specify that FF5 is the maximal possible cluster number
for FAT12; similar for 16 and 32 */
#define FAT_MAGIC 4085
#define FAT_MAGIC16 65525U
#define FAT_MAGIC32 268435455UL
/* FAT cluster special flags */
#define FREE 0x000
#if WITHFAT32
#define LONG_LAST_CLUSTER 0x0FFFFFFFUL
#define LONG_BAD 0x0FFFFFF7UL
#else
#define LONG_LAST_CLUSTER 0xFFFF
#define LONG_BAD 0xFFF7
#endif
#define MASK16 0xFFF8
#define BAD16 0xFFF7
#define MASK12 0xFF8
#define BAD12 0xFF7
/* internal transfer direction flags for read and write*/
#define XFR_READ 1
#define XFR_WRITE 2
#define SEQ_MAP 0x80
#define WIPE_OUT 0x40
/* File system information structure */
struct fsinfo {
UINT32 fi_signature; /* must be 0x61417272 */
INT32 fi_nfreeclst; /* number of free clusters, -1 if unknown */
INT32 fi_cluster; /* most recently allocated cluster, -1 if unknown */
UINT8 fi_reserved[12];
};
#ifndef FALSE
#define FALSE (1==0)
#endif
#ifndef TRUE
#define TRUE (1==1)
#endif
/* */
/* Common pointer types */
/* */
#ifndef NULL
#define NULL ((void *)0)
#endif
struct cds {
#if WITH_CDS_PATHSTR
INT8 cdsCurrentPath[MAX_CDSPATH];
#endif
UINT16 cdsFlags; /* see below */
st_dpb_ptr cdsDpb; /* if != 0, associated DPB */
CLUSTER cdsStrtClst;
};
typedef struct cds st_cds;
typedef st_cds *st_cds_ptr;
#define CDSPHYSDRV 0x4000
#define CDSVALID CDSPHYSDRV
/* Unicode typedefs */
/*define ufat unicode char type */
typedef UINT16 UNI_CHAR;
typedef INT8 UTF8;
typedef INT16 UTF16;
typedef INT32 UTF32;
/*directory entry size */
#define DIRENT_SIZE 32
/* read write mode define */
#define RDONLY 0
#define WRONLY 1
#define RDWR 2
/* ------------from fat32.h ------------*/
/* Access codes */
#define FD32_OACCESS 0x0007 /* Bit mask for access type */
#define FD32_OREAD 0x0000 /* Allow only reads from file */
#define FD32_OWRITE 0x0001 /* Allow only writes into file */
#define FD32_ORDWR 0x0002 /* Allow both reads and writes */
#define FD32_ORDNA 0x0004 /* Read only without updating the */
/* last access date */
/* Sharing modes and inheritance */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -