blob: b3664641cf876d5027236751ffea210a3a9c3e0a [file] [log] [blame]
#ifndef _BLKID_FAT_H
#define _BLKID_FAT_H
/* This FAT superblock is required for:
*
* superblocks/vfat.c
* partitions/dos.c
*/
/* Yucky misaligned values */
struct vfat_super_block {
/* 00*/ unsigned char vs_ignored[3];
/* 03*/ unsigned char vs_sysid[8];
/* 0b*/ unsigned char vs_sector_size[2];
/* 0d*/ uint8_t vs_cluster_size;
/* 0e*/ uint16_t vs_reserved;
/* 10*/ uint8_t vs_fats;
/* 11*/ unsigned char vs_dir_entries[2];
/* 13*/ unsigned char vs_sectors[2];
/* 15*/ unsigned char vs_media;
/* 16*/ uint16_t vs_fat_length;
/* 18*/ uint16_t vs_secs_track;
/* 1a*/ uint16_t vs_heads;
/* 1c*/ uint32_t vs_hidden;
/* 20*/ uint32_t vs_total_sect;
/* 24*/ uint32_t vs_fat32_length;
/* 28*/ uint16_t vs_flags;
/* 2a*/ uint8_t vs_version[2];
/* 2c*/ uint32_t vs_root_cluster;
/* 30*/ uint16_t vs_fsinfo_sector;
/* 32*/ uint16_t vs_backup_boot;
/* 34*/ uint16_t vs_reserved2[6];
/* 40*/ unsigned char vs_unknown[3];
/* 43*/ unsigned char vs_serno[4];
/* 47*/ unsigned char vs_label[11];
/* 52*/ unsigned char vs_magic[8];
/* 5a*/ unsigned char vs_dummy2[0x1fe - 0x5a];
/*1fe*/ unsigned char vs_pmagic[2];
} __attribute__((packed));
/* Yucky misaligned values */
struct msdos_super_block {
/* 00*/ unsigned char ms_ignored[3];
/* 03*/ unsigned char ms_sysid[8];
/* 0b*/ unsigned char ms_sector_size[2];
/* 0d*/ uint8_t ms_cluster_size;
/* 0e*/ uint16_t ms_reserved;
/* 10*/ uint8_t ms_fats;
/* 11*/ unsigned char ms_dir_entries[2];
/* 13*/ unsigned char ms_sectors[2]; /* =0 iff V3 or later */
/* 15*/ unsigned char ms_media;
/* 16*/ uint16_t ms_fat_length; /* Sectors per FAT */
/* 18*/ uint16_t ms_secs_track;
/* 1a*/ uint16_t ms_heads;
/* 1c*/ uint32_t ms_hidden;
/* V3 BPB */
/* 20*/ uint32_t ms_total_sect; /* iff ms_sectors == 0 */
/* V4 BPB */
/* 24*/ unsigned char ms_unknown[3]; /* Phys drive no., resvd, V4 sig (0x29) */
/* 27*/ unsigned char ms_serno[4];
/* 2b*/ unsigned char ms_label[11];
/* 36*/ unsigned char ms_magic[8];
/* 3e*/ unsigned char ms_dummy2[0x1fe - 0x3e];
/*1fe*/ unsigned char ms_pmagic[2];
} __attribute__((packed));
static inline int blkid_fat_valid_media(struct msdos_super_block *ms)
{
return 0xf8 <= ms->ms_media || ms->ms_media == 0xf0;
}
static inline int blkid_fat_valid_sectorsize(
struct msdos_super_block *ms,
uint16_t *sector_size)
{
unsigned char *tmp = (unsigned char *) &ms->ms_sector_size;
uint16_t ssz;
ssz = tmp[0] + (tmp[1] << 8);
if (ssz != 0x200 && ssz != 0x400 && ssz != 0x800 && ssz != 0x1000)
return 0;
if (sector_size)
*sector_size = ssz;
return 1;
}
#endif /* _BLKID_FAT_H */