xref: /onnv-gate/usr/src/lib/libparted/common/libparted/fs/fat/bootsector.h (revision 9663:ace9a2ac3683)
1 /*
2     libparted
3     Copyright (C) 1998, 1999, 2000, 2007 Free Software Foundation, Inc.
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; either version 3 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #ifndef PED_FAT_BOOTSECTOR_H
20 #define PED_FAT_BOOTSECTOR_H
21 
22 typedef struct _FatBootSector	FatBootSector;
23 typedef struct _FatInfoSector	FatInfoSector;
24 
25 #include "fat.h"
26 
27 #define FAT32_INFO_MAGIC1	0x41615252
28 #define FAT32_INFO_MAGIC2	0x61417272
29 #define FAT32_INFO_MAGIC3	0xaa55
30 
31 /* stolen from mkdosfs, by Dave Hudson */
32 
33 #define FAT_BOOT_MESSAGE	\
34 "This partition does not have an operating system loader installed on it.\n\r"\
35 "Press a key to reboot..."
36 
37 #define FAT_BOOT_JUMP	"\xeb\x58\x90"		/* jmp	+5a */
38 
39 #define FAT_BOOT_CODE	"\x0e"			/* push cs */		\
40 			"\x1f"			/* pop ds */		\
41 			"\xbe\x74\x7e"		/* mov si, offset message */ \
42 					/* write_msg_loop: */		\
43 			"\xac"			/* lodsb */		\
44 			"\x22\xc0"		/* and al, al */	\
45 			"\x74\x06"		/* jz done (+8) */	\
46 			"\xb4\x0e"		/* mov ah, 0x0e */	\
47 			"\xcd\x10"		/* int 0x10 */		\
48 			"\xeb\xf5"		/* jmp write_msg_loop */ \
49 					/* done: */			\
50 			"\xb4\x00"		/* mov ah, 0x00 */	\
51 			"\xcd\x16"		/* int 0x16 */		\
52 			"\xb4\x00"		/* mov ah, 0x00 */	\
53 			"\xcd\x19"		/* int 0x19 */		\
54 			"\xeb\xfe"		/* jmp +0 - in case int 0x19 */ \
55 						/* doesn't work */	\
56 					/* message: */			\
57 			FAT_BOOT_MESSAGE
58 
59 #define FAT_BOOT_CODE_LENGTH 128
60 
61 #ifdef __sun
62 #define __attribute__(X)	/*nothing*/
63 #endif /* __sun */
64 
65 #ifdef __sun
66 #pragma pack(1)
67 #endif
68 struct __attribute__ ((packed)) _FatBootSector {
69         uint8_t		boot_jump[3];	/* 00: Boot strap short or near jump */
70         uint8_t		system_id[8];	/* 03: system name */
71         uint16_t	sector_size;	/* 0b: bytes per logical sector */
72         uint8_t		cluster_size;	/* 0d: sectors/cluster */
73         uint16_t	reserved;	/* 0e: reserved sectors */
74         uint8_t		fats;		/* 10: number of FATs */
75         uint16_t	dir_entries;	/* 11: number of root directory entries */
76         uint16_t	sectors;	/* 13: if 0, total_sect supersedes */
77         uint8_t		media;		/* 15: media code */
78         uint16_t	fat_length;	/* 16: sectors/FAT for FAT12/16 */
79         uint16_t	secs_track;	/* 18: sectors per track */
80         uint16_t	heads;		/* 1a: number of heads */
81         uint32_t	hidden;		/* 1c: hidden sectors (partition start) */
82         uint32_t	sector_count;	/* 20: no. of sectors (if sectors == 0) */
83 
84         union __attribute__ ((packed)) {
85                 /* FAT16 fields */
86                 struct __attribute__ ((packed)) {
87                         uint8_t		drive_num;	/* 24: */
88                         uint8_t		empty_1;	/* 25: */
89                         uint8_t		ext_signature;	/* 26: always 0x29 */
90                         uint32_t	serial_number;	/* 27: */
91                         uint8_t		volume_name [11];       /* 2b: */
92                         uint8_t		fat_name [8];	/* 36: */
93                         uint8_t		boot_code[448];	/* 3f: Boot code (or message) */
94                 } fat16;
95                 /* FAT32 fields */
96                 struct __attribute__ ((packed)) {
97                         uint32_t	fat_length;	/* 24: size of FAT in sectors */
98                         uint16_t	flags;		/* 28: bit8: fat mirroring, low4: active fat */
99                         uint16_t	version;        /* 2a: minor * 256 + major */
100                         uint32_t	root_dir_cluster;	/* 2c: */
101                         uint16_t	info_sector;    /* 30: */
102                         uint16_t	backup_sector;	/* 32: */
103                         uint8_t		empty_1 [12];	/* 34: */
104                         uint16_t	drive_num;	/* 40: */
105                         uint8_t		ext_signature;	/* 42: always 0x29 */
106                         uint32_t	serial_number;	/* 43: */
107                         uint8_t		volume_name [11];	/* 47: */
108                         uint8_t		fat_name [8];	/* 52: */
109                         uint8_t		boot_code[420];	/* 5a: Boot code (or message) */
110                 } fat32;
111         } u;
112 
113 	uint16_t	boot_sign;	/* 1fe: always 0xAA55 */
114 };
115 
116 struct __attribute__ ((packed)) _FatInfoSector {
117         uint32_t	signature_1;	/* should be 0x41615252 */
118         uint8_t		unused [480];
119         uint32_t	signature_2;	/* should be 0x61417272 */
120         uint32_t	free_clusters;
121         uint32_t	next_cluster;	/* most recently allocated cluster */
122         uint8_t		unused2 [0xe];
123         uint16_t	signature_3;	/* should be 0xaa55 */
124 };
125 #ifdef __sun
126 #pragma pack()
127 #endif
128 
129 int fat_boot_sector_read (FatBootSector* bs, const PedGeometry* geom);
130 FatType fat_boot_sector_probe_type (const FatBootSector* bs,
131 				    const PedGeometry* geom);
132 int fat_boot_sector_analyse (FatBootSector* bs, PedFileSystem* fs);
133 int fat_boot_sector_set_boot_code (FatBootSector* bs);
134 int fat_boot_sector_generate (FatBootSector* bs, const PedFileSystem* fs);
135 int fat_boot_sector_write (const FatBootSector* bs, PedFileSystem* fs);
136 
137 int fat_info_sector_read (FatInfoSector* is, const PedFileSystem* fs);
138 int fat_info_sector_generate (FatInfoSector* is, const PedFileSystem* fs);
139 int fat_info_sector_write (const FatInfoSector* is, PedFileSystem* fs);
140 
141 #endif /* PED_FAT_BOOTSECTOR_H */
142 
143