⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsk_fatfs.h

📁 linux下开发的针对所有磁盘的数据恢复的源码
💻 H
字号:
/*** The Sleuth Kit **** Brian Carrier [carrier <at> sleuthkit [dot] org]** Copyright (c) 2003-2008 Brian Carrier.  All rights reserved**** TASK** Copyright (c) 2002 @stake Inc.  All rights reserved**** This software is distributed under the Common Public License 1.0***//* * Contains the structures and function APIs for FATFS file system support. */#ifndef _TSK_FATFS_H#define _TSK_FATFS_H#ifdef __cplusplusextern "C" {#endif/*** Constants*/#define FATFS_FIRSTINO	2#define FATFS_ROOTINO	2       /* location of root directory inode */#define FATFS_FIRST_NORMINO 3    // special files go at end of inode list (before $OrphanFiles)#define FATFS_NUM_SPECFILE  4   // includes MBR, FAT1, FAT2, and Orphans#define FATFS_MBRINO(fs_info) \    (TSK_FS_ORPHANDIR_INUM(fs_info) - 3)        // inode for master boot record "special file"#define FATFS_MBRNAME   "$MBR"#define FATFS_FAT1INO(fs_info) \    (TSK_FS_ORPHANDIR_INUM(fs_info) - 2)        // inode for FAT1 "special file"#define FATFS_FAT1NAME  "$FAT1"#define FATFS_FAT2INO(fs_info) \    (TSK_FS_ORPHANDIR_INUM(fs_info) - 1)        // inode for FAT2 "special file"#define FATFS_FAT2NAME  "$FAT2"#define FATFS_DEV_BSIZE 512#define FATFS_SBOFF		0#define FATFS_FS_MAGIC	0xaa55#define FATFS_MAXNAMLEN	256#define FATFS_MAXNAMLEN_UTF8	1024#define FATFS_FILE_CONTENT_LEN sizeof(TSK_DADDR_T)      // we will store the starting cluster/* size of FAT to read into FATFS_INFO each time *//* This must be at least 1024 bytes or else fat12 will get messed up */#define FAT_CACHE_N		4       // number of caches#define FAT_CACHE_B		4096#define FAT_CACHE_S		8       // number of sectors in cache/* MASK values for FAT entries */#define FATFS_12_MASK	0x00000fff#define FATFS_16_MASK	0x0000ffff#define FATFS_32_MASK	0x0fffffff/* Constants for the FAT entry */#define FATFS_UNALLOC	0#define FATFS_BAD		0x0ffffff7#define FATFS_EOFS		0x0ffffff8#define FATFS_EOFE		0x0fffffff/* macro to identify if the FAT value is End of File * returns 1 if it is and 0 if it is not  */#define FATFS_ISEOF(val, mask)	\	((val >= (FATFS_EOFS & mask)) && (val <= (FATFS_EOFE)))#define FATFS_ISBAD(val, mask) \	((val) == (FATFS_BAD & mask))#define FATFS_CLUST_2_SECT(fatfs, c)	\	(TSK_DADDR_T)(fatfs->firstclustsect + ((((c) & fatfs->mask) - 2) * fatfs->csize))#define FATFS_SECT_2_CLUST(fatfs, s)	\	(TSK_DADDR_T)(2 + ((s)  - fatfs->firstclustsect) / fatfs->csize)/* given an inode address, determine in which sector it is located * i must be larger than 3 (2 is the root and it doesn't have a sector) */#define FATFS_INODE_2_SECT(fatfs, i)    \    (TSK_DADDR_T)((i - FATFS_FIRST_NORMINO)/(fatfs->dentry_cnt_se) + fatfs->firstdatasect)#define FATFS_INODE_2_OFF(fatfs, i)     \    (size_t)(((i - FATFS_FIRST_NORMINO) % fatfs->dentry_cnt_se) * sizeof(fatfs_dentry))/* given a sector IN THE DATA AREA, return the base inode for it */#define FATFS_SECT_2_INODE(fatfs, s)    \    (TSK_INUM_T)((s - fatfs->firstdatasect) * fatfs->dentry_cnt_se + FATFS_FIRST_NORMINO)/* * Boot Sector Structure for TSK_FS_INFO_TYPE_FAT_12, TSK_FS_INFO_TYPE_FAT_16, and TSK_FS_INFO_TYPE_FAT_32 */    typedef struct {        uint8_t f1[3];        char oemname[8];        uint8_t ssize[2];       /* sector size in bytes */        uint8_t csize;          /* cluster size in sectors */        uint8_t reserved[2];    /* number of reserved sectors for boot sectors */        uint8_t numfat;         /* Number of FATs */        uint8_t numroot[2];     /* Number of Root dentries */        uint8_t sectors16[2];   /* number of sectors in FS */        uint8_t f2[1];        uint8_t sectperfat16[2];        /* size of FAT */        uint8_t f3[4];        uint8_t prevsect[4];    /* number of sectors before FS partition */        uint8_t sectors32[4];   /* 32-bit value of number of FS sectors */        /* The following are different for fat12/fat16 and fat32 */        union {            struct {                uint8_t f5[3];                uint8_t vol_id[4];                uint8_t vol_lab[11];                uint8_t fs_type[8];                uint8_t f6[448];            } f16;            struct {                uint8_t sectperfat32[4];                uint8_t ext_flag[2];                uint8_t fs_ver[2];                uint8_t rootclust[4];   /* cluster where root directory is stored */                uint8_t fsinfo[2];      /* TSK_FS_INFO Location */                uint8_t bs_backup[2];   /* sector of backup of boot sector */                uint8_t f5[12];                uint8_t drvnum;                uint8_t f6[2];                uint8_t vol_id[4];                uint8_t vol_lab[11];                uint8_t fs_type[8];                uint8_t f7[420];            } f32;        } a;        uint8_t magic[2];       /* MAGIC for all versions */    } fatfs_sb;    typedef struct {        uint8_t magic1[4];      /* 41615252 */        uint8_t f1[480];        uint8_t magic2[4];      /* 61417272 */        uint8_t freecnt[4];     /* free clusters 0xfffffffff if unknown */        uint8_t nextfree[4];    /* next free cluster */        uint8_t f2[12];        uint8_t magic3[4];      /* AA550000 */    } fatfs_fsinfo;/* directory entry short name structure */    typedef struct {        uint8_t name[8];        uint8_t ext[3];        uint8_t attrib;        uint8_t lowercase;        uint8_t ctimeten;       /* create times */        uint8_t ctime[2];        uint8_t cdate[2];        uint8_t adate[2];       /* access time */        uint8_t highclust[2];        uint8_t wtime[2];       /* last write time */        uint8_t wdate[2];        uint8_t startclust[2];        uint8_t size[4];    } fatfs_dentry;/* Macro to combine the upper and lower 2-byte parts of the starting * cluster  */#define FATFS_DENTRY_CLUST(fsi, de)	\	(TSK_DADDR_T)((tsk_getu16(fsi->endian, de->startclust)) | (tsk_getu16(fsi->endian, de->highclust)<<16))/* constants for first byte of name[] */#define FATFS_SLOT_EMPTY	0x00#define FATFS_SLOT_E5		0x05    /* actual value is 0xe5 */#define FATFS_SLOT_DELETED	0xe5/*  *Return 1 if c is an valid charactor for a short file name  * * NOTE: 0x05 is allowed in name[0], and 0x2e (".") is allowed for name[0] * and name[1] and 0xe5 is allowed for name[0] */#define FATFS_IS_83_NAME(c)		\	((((c) < 0x20) || \	  ((c) == 0x22) || \	  (((c) >= 0x2a) && ((c) <= 0x2c)) || \	  ((c) == 0x2e) || \	  ((c) == 0x2f) || \	  (((c) >= 0x3a) && ((c) <= 0x3f)) || \	  (((c) >= 0x5b) && ((c) <= 0x5d)) || \	  ((c) == 0x7c)) == 0)// extensions are to be ascii / latin#define FATFS_IS_83_EXT(c)		\    (FATFS_IS_83_NAME((c)) && ((c) < 0x7f))/* flags for attributes field */#define FATFS_ATTR_NORMAL	0x00    /* normal file */#define FATFS_ATTR_READONLY	0x01    /* file is readonly */#define FATFS_ATTR_HIDDEN	0x02    /* file is hidden */#define FATFS_ATTR_SYSTEM	0x04    /* file is a system file */#define FATFS_ATTR_VOLUME	0x08    /* entry is a volume label */#define FATFS_ATTR_DIRECTORY	0x10    /* entry is a directory name */#define FATFS_ATTR_ARCHIVE	0x20    /* file is new or modified */#define FATFS_ATTR_LFN		0x0f    /* A long file name entry */#define FATFS_ATTR_ALL		0x3f    /* all flags set *//* flags for lowercase field */#define FATFS_CASE_LOWER_BASE	0x08    /* base is lower case */#define FATFS_CASE_LOWER_EXT	0x10    /* extension is lower case */#define FATFS_CASE_LOWER_ALL	0x18    /* both are lower */#define FATFS_SEC_MASK		0x1f    /* number of seconds div by 2 */#define FATFS_SEC_SHIFT		0#define FATFS_SEC_MIN		0#define FATFS_SEC_MAX		30#define FATFS_MIN_MASK		0x7e0   /* number of minutes 0-59 */#define FATFS_MIN_SHIFT		5#define FATFS_MIN_MIN		0#define FATFS_MIN_MAX		59#define FATFS_HOUR_MASK		0xf800  /* number of hours 0-23 */#define FATFS_HOUR_SHIFT	11#define FATFS_HOUR_MIN		0#define FATFS_HOUR_MAX		23/* return 1 if x is a valid FAT time */#define FATFS_ISTIME(x)	\	(((((x & FATFS_SEC_MASK) >> FATFS_SEC_SHIFT) > FATFS_SEC_MAX) || \	  (((x & FATFS_MIN_MASK) >> FATFS_MIN_SHIFT) > FATFS_MIN_MAX) || \	  (((x & FATFS_HOUR_MASK) >> FATFS_HOUR_SHIFT) > FATFS_HOUR_MAX) ) == 0)#define FATFS_DAY_MASK		0x1f    /* day of month 1-31 */#define FATFS_DAY_SHIFT		0#define FATFS_DAY_MIN		1#define FATFS_DAY_MAX		31#define FATFS_MON_MASK		0x1e0   /* month 1-12 */#define FATFS_MON_SHIFT		5#define FATFS_MON_MIN		1#define FATFS_MON_MAX		12#define FATFS_YEAR_MASK		0xfe00  /* year, from 1980 0-127 */#define FATFS_YEAR_SHIFT	9#define FATFS_YEAR_MIN		0#define FATFS_YEAR_MAX		127/* return 1 if x is a valid FAT date */#define FATFS_ISDATE(x)	\	 (((((x & FATFS_DAY_MASK) >> FATFS_DAY_SHIFT) > FATFS_DAY_MAX) || \	   (((x & FATFS_DAY_MASK) >> FATFS_DAY_SHIFT) < FATFS_DAY_MIN) || \	   (((x & FATFS_MON_MASK) >> FATFS_MON_SHIFT) > FATFS_MON_MAX) || \	   (((x & FATFS_MON_MASK) >> FATFS_MON_SHIFT) < FATFS_MON_MIN) || \	   (((x & FATFS_YEAR_MASK) >> FATFS_YEAR_SHIFT) > FATFS_YEAR_MAX) ) == 0)/*  * Long file name support for windows  * * Contents of this are in UNICODE, not ASCII  */    typedef struct {        uint8_t seq;        uint8_t part1[10];        uint8_t attributes;        uint8_t reserved1;        uint8_t chksum;        uint8_t part2[12];        uint8_t reserved2[2];        uint8_t part3[4];    } fatfs_dentry_lfn;/* flags for seq field */#define FATFS_LFN_SEQ_FIRST	0x40    /* This bit is set for the first lfn entry */#define FATFS_LFN_SEQ_MASK	0x3f    /* These bits are a mask for the decreasing                                         * sequence number for the entries *//* internal FATFS_INFO structure */    typedef struct {        TSK_FS_INFO fs_info;    /* super class */        //TSK_DATA_BUF *table;      /* cached section of file allocation table */        /* FAT cache */        char fatc_buf[FAT_CACHE_N][FAT_CACHE_B];        TSK_DADDR_T fatc_addr[FAT_CACHE_N];        uint8_t fatc_ttl[FAT_CACHE_N];  // ttl of 0 means is not in use        char *dinodes;          /* cluster size buffer of inode list */        fatfs_sb *sb;        fatfs_dentry *dep;        /* FIrst sector of FAT */        TSK_DADDR_T firstfatsect;        /* First sector after FAT  - For TSK_FS_INFO_TYPE_FAT_12 and TSK_FS_INFO_TYPE_FAT_16, this is where the         * root directory entries are.  For TSK_FS_INFO_TYPE_FAT_32, this is the the first          * cluster */        TSK_DADDR_T firstdatasect;        /* The sector number were cluster 2 (the first one) is         * for TSK_FS_INFO_TYPE_FAT_32, it will be the same as firstdatasect, but for TSK_FS_INFO_TYPE_FAT_12 & 16         * it will be the first sector after the Root directory  */        TSK_DADDR_T firstclustsect;        /* size of data area in clusters, starting at firstdatasect */        TSK_DADDR_T clustcnt;        TSK_DADDR_T lastclust;        /* sector where the root directory is located */        TSK_DADDR_T rootsect;        uint32_t dentry_cnt_se; /* max number of dentries per sector */        uint32_t dentry_cnt_cl; /* max number of dentries per cluster */        uint16_t ssize;         /* size of sectors in bytes */        uint16_t ssize_sh;      /* power of 2 for size of sectors */        uint8_t csize;          /* size of clusters in sectors */        //uint16_t      reserved;       /* number of reserved sectors */        uint8_t numfat;         /* number of fat tables */        uint32_t sectperfat;    /* sectors per fat table */        uint16_t numroot;       /* number of 32-byte dentries in root dir */        uint32_t mask;          /* the mask to use for the sectors */        TSK_INUM_T *dir_buf;    // array that holds inode address of directories        TSK_INUM_T *par_buf;    // array that holds parent directory address of corresponding dir_buf entry        size_t dir_buf_size;    // number of entries in both dif_buf and par_buf        size_t dir_buf_next;    // index to the next place to store an address in dir_buf and par_buf    } FATFS_INFO;    extern int8_t fatfs_is_sectalloc(FATFS_INFO *, TSK_DADDR_T);    extern int8_t fatfs_is_clustalloc(FATFS_INFO * fatfs,        TSK_DADDR_T clust);    extern uint8_t fatfs_isdentry(FATFS_INFO *, fatfs_dentry *);    extern uint8_t fatfs_make_root(FATFS_INFO *, TSK_FS_META *);    extern TSK_RETVAL_ENUM fatfs_dinode_copy(FATFS_INFO *, TSK_FS_META *,        fatfs_dentry *, TSK_DADDR_T, TSK_INUM_T);    extern uint8_t fatfs_inode_lookup(TSK_FS_INFO * fs,        TSK_FS_FILE * a_fs_file, TSK_INUM_T inum);    extern uint8_t fatfs_inode_walk(TSK_FS_INFO * fs,        TSK_INUM_T start_inum, TSK_INUM_T end_inum,        TSK_FS_META_FLAG_ENUM a_flags, TSK_FS_META_WALK_CB a_action,        void *a_ptr);    extern uint8_t fatfs_make_data_run(TSK_FS_FILE * a_fs_file);    extern uint8_t fatfs_getFAT(FATFS_INFO * fatfs, TSK_DADDR_T clust,        TSK_DADDR_T * value);    extern TSK_RETVAL_ENUM        fatfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,        TSK_INUM_T a_addr);#ifdef __cplusplus}#endif#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -