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