1*1b8adde7SWilliam Kucharski /* 2*1b8adde7SWilliam Kucharski * GRUB -- GRand Unified Bootloader 3*1b8adde7SWilliam Kucharski * Copyright (C) 2001 Free Software Foundation, Inc. 4*1b8adde7SWilliam Kucharski * 5*1b8adde7SWilliam Kucharski * This program is free software; you can redistribute it and/or modify 6*1b8adde7SWilliam Kucharski * it under the terms of the GNU General Public License as published by 7*1b8adde7SWilliam Kucharski * the Free Software Foundation; either version 2 of the License, or 8*1b8adde7SWilliam Kucharski * (at your option) any later version. 9*1b8adde7SWilliam Kucharski * 10*1b8adde7SWilliam Kucharski * This program is distributed in the hope that it will be useful, 11*1b8adde7SWilliam Kucharski * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*1b8adde7SWilliam Kucharski * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*1b8adde7SWilliam Kucharski * GNU General Public License for more details. 14*1b8adde7SWilliam Kucharski * 15*1b8adde7SWilliam Kucharski * You should have received a copy of the GNU General Public License 16*1b8adde7SWilliam Kucharski * along with this program; if not, write to the Free Software 17*1b8adde7SWilliam Kucharski * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 18*1b8adde7SWilliam Kucharski */ 19*1b8adde7SWilliam Kucharski 20*1b8adde7SWilliam Kucharski 21*1b8adde7SWilliam Kucharski /* 22*1b8adde7SWilliam Kucharski * Defines for the FAT BIOS Parameter Block (embedded in the first block 23*1b8adde7SWilliam Kucharski * of the partition. 24*1b8adde7SWilliam Kucharski */ 25*1b8adde7SWilliam Kucharski 26*1b8adde7SWilliam Kucharski typedef __signed__ char __s8; 27*1b8adde7SWilliam Kucharski typedef unsigned char __u8; 28*1b8adde7SWilliam Kucharski typedef __signed__ short __s16; 29*1b8adde7SWilliam Kucharski typedef unsigned short __u16; 30*1b8adde7SWilliam Kucharski typedef __signed__ int __s32; 31*1b8adde7SWilliam Kucharski typedef unsigned int __u32; 32*1b8adde7SWilliam Kucharski 33*1b8adde7SWilliam Kucharski /* Note that some shorts are not aligned, and must therefore 34*1b8adde7SWilliam Kucharski * be declared as array of two bytes. 35*1b8adde7SWilliam Kucharski */ 36*1b8adde7SWilliam Kucharski struct fat_bpb { 37*1b8adde7SWilliam Kucharski __s8 ignored[3]; /* Boot strap short or near jump */ 38*1b8adde7SWilliam Kucharski __s8 system_id[8]; /* Name - can be used to special case 39*1b8adde7SWilliam Kucharski partition manager volumes */ 40*1b8adde7SWilliam Kucharski __u8 bytes_per_sect[2]; /* bytes per logical sector */ 41*1b8adde7SWilliam Kucharski __u8 sects_per_clust;/* sectors/cluster */ 42*1b8adde7SWilliam Kucharski __u8 reserved_sects[2]; /* reserved sectors */ 43*1b8adde7SWilliam Kucharski __u8 num_fats; /* number of FATs */ 44*1b8adde7SWilliam Kucharski __u8 dir_entries[2]; /* root directory entries */ 45*1b8adde7SWilliam Kucharski __u8 short_sectors[2]; /* number of sectors */ 46*1b8adde7SWilliam Kucharski __u8 media; /* media code (unused) */ 47*1b8adde7SWilliam Kucharski __u16 fat_length; /* sectors/FAT */ 48*1b8adde7SWilliam Kucharski __u16 secs_track; /* sectors per track */ 49*1b8adde7SWilliam Kucharski __u16 heads; /* number of heads */ 50*1b8adde7SWilliam Kucharski __u32 hidden; /* hidden sectors (unused) */ 51*1b8adde7SWilliam Kucharski __u32 long_sectors; /* number of sectors (if short_sectors == 0) */ 52*1b8adde7SWilliam Kucharski 53*1b8adde7SWilliam Kucharski /* The following fields are only used by FAT32 */ 54*1b8adde7SWilliam Kucharski __u32 fat32_length; /* sectors/FAT */ 55*1b8adde7SWilliam Kucharski __u16 flags; /* bit 8: fat mirroring, low 4: active fat */ 56*1b8adde7SWilliam Kucharski __u8 version[2]; /* major, minor filesystem version */ 57*1b8adde7SWilliam Kucharski __u32 root_cluster; /* first cluster in root directory */ 58*1b8adde7SWilliam Kucharski __u16 info_sector; /* filesystem info sector */ 59*1b8adde7SWilliam Kucharski __u16 backup_boot; /* backup boot sector */ 60*1b8adde7SWilliam Kucharski __u16 reserved2[6]; /* Unused */ 61*1b8adde7SWilliam Kucharski }; 62*1b8adde7SWilliam Kucharski 63*1b8adde7SWilliam Kucharski #define FAT_CVT_U16(bytarr) (* (__u16*)(bytarr)) 64*1b8adde7SWilliam Kucharski 65*1b8adde7SWilliam Kucharski /* 66*1b8adde7SWilliam Kucharski * Defines how to differentiate a 12-bit and 16-bit FAT. 67*1b8adde7SWilliam Kucharski */ 68*1b8adde7SWilliam Kucharski 69*1b8adde7SWilliam Kucharski #define FAT_MAX_12BIT_CLUST 4087 /* 4085 + 2 */ 70*1b8adde7SWilliam Kucharski 71*1b8adde7SWilliam Kucharski /* 72*1b8adde7SWilliam Kucharski * Defines for the file "attribute" byte 73*1b8adde7SWilliam Kucharski */ 74*1b8adde7SWilliam Kucharski 75*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_OK_MASK 0x37 76*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_NOT_OK_MASK 0xC8 77*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_DIR 0x10 78*1b8adde7SWilliam Kucharski #define FAT_ATTRIB_LONGNAME 0x0F 79*1b8adde7SWilliam Kucharski 80*1b8adde7SWilliam Kucharski /* 81*1b8adde7SWilliam Kucharski * Defines for FAT directory entries 82*1b8adde7SWilliam Kucharski */ 83*1b8adde7SWilliam Kucharski 84*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_LENGTH 32 85*1b8adde7SWilliam Kucharski 86*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_ATTRIB(entry) \ 87*1b8adde7SWilliam Kucharski (*((unsigned char *) (entry+11))) 88*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_VALID(entry) \ 89*1b8adde7SWilliam Kucharski ( ((*((unsigned char *) entry)) != 0) \ 90*1b8adde7SWilliam Kucharski && ((*((unsigned char *) entry)) != 0xE5) \ 91*1b8adde7SWilliam Kucharski && !(FAT_DIRENTRY_ATTRIB(entry) & FAT_ATTRIB_NOT_OK_MASK) ) 92*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_FIRST_CLUSTER(entry) \ 93*1b8adde7SWilliam Kucharski ((*((unsigned short *) (entry+26)))+(*((unsigned short *) (entry+20)) << 16)) 94*1b8adde7SWilliam Kucharski #define FAT_DIRENTRY_FILELENGTH(entry) \ 95*1b8adde7SWilliam Kucharski (*((unsigned long *) (entry+28))) 96*1b8adde7SWilliam Kucharski 97*1b8adde7SWilliam Kucharski #define FAT_LONGDIR_ID(entry) \ 98*1b8adde7SWilliam Kucharski (*((unsigned char *) (entry))) 99*1b8adde7SWilliam Kucharski #define FAT_LONGDIR_ALIASCHECKSUM(entry) \ 100*1b8adde7SWilliam Kucharski (*((unsigned char *) (entry+13))) 101