#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 */