116e244ed8f6ae412e8a2809b2d6a13b1ba100ae
[profile/ivi/syslinux.git] / libfat / fat.h
1 /* ----------------------------------------------------------------------- *
2  *
3  *   Copyright 2001-2008 H. Peter Anvin - All Rights Reserved
4  *
5  *   This program is free software; you can redistribute it and/or modify
6  *   it under the terms of the GNU General Public License as published by
7  *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
8  *   Boston MA 02111-1307, USA; either version 2 of the License, or
9  *   (at your option) any later version; incorporated herein by reference.
10  *
11  * ----------------------------------------------------------------------- */
12
13 /*
14  * fat.h
15  *
16  * Basic data structures for a FAT filesystem
17  */
18
19 #ifndef FAT_H
20 #define FAT_H
21
22 #include "ulint.h"
23
24 /* The poor excuse FAT has for a superblock -- in the boot sector */
25 struct fat_bootsect {
26   le8_t bsJump[3];              /* Jump to code */
27   char bsOemName[8];            /* Formatting program */
28   le16_t bsBytesPerSec;         /* Bytes/sector */
29   le8_t bsSecPerClust;          /* Sectors/cluster */
30   le16_t bsResSectors;          /* Reserved sectors */
31   le8_t bsFATs;                 /* Number of FATs */
32   le16_t bsRootDirEnts;         /* Number of entries/root directory */
33   le16_t bsSectors;             /* Number of sectors [1] */
34   le8_t bsMedia;                /* Magic media type byte */
35   le16_t bsFATsecs;             /* Sectors/FAT */
36   le16_t bsSecPerTrack;         /* Sectors/track */
37   le16_t bsHeads;               /* Number of heads */
38   le32_t bsHiddenSecs;          /* Number of hidden sectors */
39   le32_t bsHugeSectors;         /* Number of sectors [2] */
40   union {
41     /* FAT12/16 */
42     struct {
43       le8_t bsDriveNumber;      /* Drive number */
44       le8_t bsReserved1;        /* Reserved */
45       le8_t bsBootSignature;    /* 0x29 */
46       le32_t bsVolumeID;        /* Volume serial number */
47       char bsVolumeLabel[11];   /* Volume name */
48       char bsFileSysType[8];    /* File system type */
49
50       le8_t bsCode[448];        /* Boot sector code */
51     } fat16;
52
53     /* FAT32 */
54     struct {
55       le32_t bpb_fatsz32;       /* Sectors/FAT */
56       le16_t bpb_extflags;      /* Extended flags */
57       le16_t bpb_fsver;         /* Filesystem version */
58       le32_t bpb_rootclus;      /* Root directory cluster */
59       le16_t bpb_fsinfo;        /* FSINFO sector number */
60       le16_t bpb_bkbootsec;     /* Backup boot sector (superblock) */
61       char bpb_reserved[12];
62
63       /* Same shit, different offset! */
64       le8_t bsDriveNumber;      /* Drive number */
65       le8_t bsReserved1;        /* Reserved */
66       le8_t bsBootSignature;    /* 0x29 */
67       le32_t bsVolumeID;        /* Volume serial number */
68       char bsVolumeLabel[11];   /* Volume name */
69       char bsFileSysType[8];    /* File system type */
70
71       le8_t bsCode[420];        /* Boot sector code */
72     } fat32;
73   } u;
74
75   le16_t bsSignature;           /* 0xAA55 */
76 };
77
78 #define BS_BOOTSIGNATURE        0x29
79 #define BS_SIGNATURE            0xAA55
80
81 /* A FAT filesystem directory entry */
82
83 struct fat_dirent
84 {
85   le8_t name[11];               /* Mangled filename */
86   le8_t attribute;              /* File type/attribute */
87   le8_t caseflags;              /* VFAT: case for basis and extension */
88   le8_t ctime_ms;               /* ms of creation time */
89   le32_t ctime;                 /* Creation time */
90   le16_t atime;                 /* Date portion (high 16 bits) of atime */
91   le16_t clusthi;               /* FAT32: high 16 bits of cluster */
92   le32_t mtime;                 /* Modification time */
93   le16_t clustlo;               /* First cluster pointer */
94   le32_t size;                  /* File size (bytes) */
95 };
96
97 /* A VFAT filesystem continuation entry */
98 struct fat_vfat_slot
99 {
100   le8_t  id;                    /* Sequence number for slot */
101   le16_t name0[5];              /* 5 characters */
102   le8_t  attribute;             /* Attribute byte */
103   le8_t  reserved;              /* Reserved, MBZ */
104   le8_t  alias_csum;            /* Short name checksum */
105   le16_t name5[6];              /* 6 characters */
106   le16_t firstclust;            /* MBZ */
107   le16_t name11[2];             /* 2 characters */
108 };
109
110 #endif /* FAT_H */