diff options
author | Christophe Grenier <grenier@cgsecurity.org> | 2007-10-29 22:38:52 +0100 |
---|---|---|
committer | Christophe Grenier <grenier@cgsecurity.org> | 2007-10-29 22:38:52 +0100 |
commit | 9928d99936105b4653d2d1b8ca74dc3ffba5c71e (patch) | |
tree | 06aa4f5e9f0055027c6fb54dd47a8414cf2fba32 /src/fat.h |
First version in git
Diffstat (limited to 'src/fat.h')
-rw-r--r-- | src/fat.h | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/fat.h b/src/fat.h new file mode 100644 index 0000000..2ac42e0 --- /dev/null +++ b/src/fat.h @@ -0,0 +1,164 @@ +/* + + File: fat.h + + Copyright (C) 1998-2004,2007 Christophe GRENIER <grenier@cgsecurity.org> + + This software is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write the Free Software Foundation, Inc., 51 + Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + */ + +#ifndef _FAT_H +#define _FAT_H +#define FAT1X_PART_NAME 0x2B +#define FAT32_PART_NAME 0x47 +#define FAT_NAME1 0x36 +#define FAT_NAME2 0x52 /* FAT32 only */ +#define NTFS_NAME 0x03 +#define OS2_NAME 0x03 + +#define NBR_SECT 8 + +/* + * FAT partition boot sector information, taken from the Linux + * kernel sources. + */ + +struct fat_boot_sector { + uint8_t ignored[3]; /* 0x00 Boot strap short or near jump */ + int8_t system_id[8]; /* 0x03 Name - can be used to special case + partition manager volumes */ + uint8_t sector_size[2]; /* 0x0B bytes per logical sector */ + uint8_t cluster_size; /* 0x0D sectors/cluster */ + uint16_t reserved; /* 0x0E reserved sectors */ + uint8_t fats; /* 0x10 number of FATs */ + uint8_t dir_entries[2]; /* 0x11 root directory entries */ + uint8_t sectors[2]; /* 0x13 number of sectors */ + uint8_t media; /* 0x15 media code (unused) */ + uint16_t fat_length; /* 0x16 sectors/FAT */ + uint16_t secs_track; /* 0x18 sectors per track */ + uint16_t heads; /* 0x1A number of heads */ + uint32_t hidden; /* 0x1C hidden sectors (unused) */ + uint32_t total_sect; /* 0x20 number of sectors (if sectors == 0) */ + + /* The following fields are only used by FAT32 */ + uint32_t fat32_length; /* 0x24=36 sectors/FAT */ + uint16_t flags; /* 0x28 bit 8: fat mirroring, low 4: active fat */ + uint8_t version[2]; /* 0x2A major, minor filesystem version */ + uint32_t root_cluster; /* 0x2C first cluster in root directory */ + uint16_t info_sector; /* 0x30 filesystem info sector */ + uint16_t backup_boot; /* 0x32 backup boot sector */ + uint8_t BPB_Reserved[12]; /* 0x34 Unused */ + uint8_t BS_DrvNum; /* 0x40 */ + uint8_t BS_Reserved1; /* 0x41 */ + uint8_t BS_BootSig; /* 0x42 */ + uint8_t BS_VolID[4]; /* 0x43 */ + uint8_t BS_VolLab[11]; /* 0x47 */ + uint8_t BS_FilSysType[8]; /* 0x52=82*/ + + /* */ + uint8_t nothing[420]; /* 0x5A */ + uint16_t marker; +} __attribute__ ((__packed__)); + +struct msdos_dir_entry { + int8_t name[8],ext[3]; /* name and extension */ + uint8_t attr; /* attribute bits */ + uint8_t lcase; /* Case for base and extension */ + uint8_t ctime_ms; /* Creation time, milliseconds */ + uint16_t ctime; /* Creation time */ + uint16_t cdate; /* Creation date */ + uint16_t adate; /* Last access date */ + uint16_t starthi; /* High 16 bits of cluster in FAT32 */ + uint16_t time; /* time, date and first cluster */ + uint16_t date; + uint16_t start; + uint32_t size; /* file size (in bytes) */ +}; + +/* Up to 13 characters of the name */ +struct msdos_dir_slot { + uint8_t id; /* 00 sequence number for slot */ + uint8_t name0_4[10]; /* 01 first 5 characters in name */ + uint8_t attr; /* 0B attribute byte */ + uint8_t reserved; /* 0C always 0 */ + uint8_t alias_checksum; /* 0D checksum for 8.3 alias */ + uint8_t name5_10[12]; /* 0E 6 more characters in name */ + uint16_t start; /* starting cluster number, 0 in long slots */ + uint8_t name11_12[4]; /* last 2 characters in name */ +}; + + +int comp_FAT(disk_t *disk_car,const partition_t *partition, const unsigned long int fat_size, const unsigned long int sect_res); +int log_fat2_info(const struct fat_boot_sector*fh1, const struct fat_boot_sector*fh2, const upart_type_t upart_type, const unsigned int sector_size); + +unsigned int get_next_cluster(disk_t *disk_car,const partition_t *partition, const upart_type_t upart_type,const int offset, const unsigned int cluster); +int set_next_cluster(disk_t *disk_car,const partition_t *partition, const upart_type_t upart_type,const int offset, const unsigned int cluster, const unsigned int next_cluster); + +int is_fat(const partition_t *partition); +int is_fat12(const partition_t *partition); +int is_fat16(const partition_t *partition); +int is_fat32(const partition_t *partition); +int is_part_fat(const partition_t *partition); +int is_part_fat12(const partition_t *partition); +int is_part_fat16(const partition_t *partition); +int is_part_fat32(const partition_t *partition); +unsigned int get_dir_entries(const struct fat_boot_sector *fat_header); +int dump_fat_info(const struct fat_boot_sector*fh1, const upart_type_t upart_type, const unsigned int sector_size); +int dump_2fat_info(const struct fat_boot_sector*fh1, const struct fat_boot_sector*fh2, const upart_type_t upart_type, const unsigned int sector_size); +int fat32_set_part_name(disk_t *disk_car, partition_t *partition, const struct fat_boot_sector*fat_header); +unsigned int fat_sector_size(const struct fat_boot_sector *fat_header); +unsigned int sectors(const struct fat_boot_sector *fat_header); +unsigned int fat32_get_prev_cluster(disk_t *disk_car,const partition_t *partition, const unsigned int fat_offset, const unsigned int cluster, const unsigned int no_of_cluster); +int fat32_free_info(disk_t *disk_car,const partition_t *partition, const unsigned int fat_offset, const unsigned int no_of_cluster, unsigned int *next_free, unsigned int*free_count); +unsigned long int fat32_get_free_count(const unsigned char *boot_fat32, const unsigned int sector_size); +unsigned long int fat32_get_next_free(const unsigned char *boot_fat32, const unsigned int sector_size); +int repair_FAT_table(disk_t *disk_car, partition_t *partition, const int verbose); +int FAT_init_rootdir(disk_t *disk_car, partition_t *partition, const int verbose); + +#define DELETED_FLAG 0xe5 /* marks file as deleted when in name[0] */ +#define IS_FREE(n) (!*(n) || *(const unsigned char *) (n) == DELETED_FLAG) +#define ATTR_RO 1 /* read-only */ +#define ATTR_HIDDEN 2 /* hidden */ +#define ATTR_SYS 4 /* system */ +#define ATTR_VOLUME 8 /* volume label */ +#define ATTR_DIR 16 /* directory */ +#define ATTR_ARCH 32 /* archived */ + +#define ATTR_NONE 0 /* no attribute bits */ +#define ATTR_UNUSED (ATTR_VOLUME | ATTR_ARCH | ATTR_SYS | ATTR_HIDDEN) + /* attribute bits that are copied "as is" */ +#define ATTR_EXT (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME) +#define ATTR_EXT_MASK (ATTR_RO | ATTR_HIDDEN | ATTR_SYS | ATTR_VOLUME | ATTR_DIR | ATTR_ARCH) + /* bits that are used by the Windows 95/Windows NT extended FAT */ +#define FAT12_BAD 0x0FF7 +#define FAT12_EOC 0x0FF8 +#define FAT16_BAD 0xFFF7 +#define FAT16_EOC 0xFFF8 +#define FAT32_BAD 0x0FFFFFF7 +#define FAT32_EOC 0x0FFFFFF8 +#endif +#define FAT1x_BOOT_SECTOR_SIZE 0x200 + +int recover_FAT(disk_t *disk_car,const struct fat_boot_sector*fat_header, partition_t *partition, const int verbose, const int dump_ind, const int backup); +int check_FAT(disk_t *disk_car,partition_t *partition, const int verbose); +int test_FAT(disk_t *disk_car,const struct fat_boot_sector *fat_header, partition_t *partition,const int verbose, const int dump_ind); +int recover_HPFS(disk_t *disk_car, const struct fat_boot_sector*fat_header, partition_t *partition, const int verbose, const int dump_ind); +int check_HPFS(disk_t *disk_car,partition_t *partition, const int verbose); +int test_HPFS(disk_t *disk_car,const struct fat_boot_sector *fat_header, partition_t *partition,const int verbose, const int dump_ind); +int recover_OS2MB(disk_t *disk_car, const struct fat_boot_sector*fat_header, partition_t *partition, const int verbose, const int dump_ind); +int check_OS2MB(disk_t *disk_car,partition_t *partition, const int verbose); +int test_OS2MB(disk_t *disk_car,const struct fat_boot_sector *fat_header, partition_t *partition,const int verbose, const int dump_ind); + |