67fb4b14b7804e3f78b1a31ca7aed040d4c095e4
[reactos.git] / boot / freeldr / freeldr / include / disk.h
1 /*
2 * FreeLoader
3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
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 2 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 along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #pragma once
21
22 #include <reactos/rosioctl.h>
23
24 typedef struct _GEOMETRY
25 {
26 ULONG Cylinders; // Number of cylinders on the disk
27 ULONG Heads; // Number of heads on the disk
28 ULONG Sectors; // Number of sectors per track
29 ULONG BytesPerSector; // Number of bytes per sector
30
31 } GEOMETRY, *PGEOMETRY;
32
33 /*
34 * Extended disk geometry (Int13 / ah=48h)
35 */
36 #include <pshpack1.h>
37 typedef struct _EXTENDED_GEOMETRY
38 {
39 USHORT Size;
40 USHORT Flags;
41 ULONG Cylinders;
42 ULONG Heads;
43 ULONG SectorsPerTrack;
44 ULONGLONG Sectors;
45 USHORT BytesPerSector;
46 ULONG PDPTE;
47
48 } EXTENDED_GEOMETRY, *PEXTENDED_GEOMETRY;
49
50 /*
51 * Define the structure of a partition table entry
52 */
53 typedef struct _PARTITION_TABLE_ENTRY
54 {
55 UCHAR BootIndicator; // 0x00 - non-bootable partition,
56 // 0x80 - bootable partition (one partition only)
57 UCHAR StartHead; // Beginning head number
58 UCHAR StartSector; // Beginning sector (2 high bits of cylinder #)
59 UCHAR StartCylinder; // Beginning cylinder# (low order bits of cylinder #)
60 UCHAR SystemIndicator; // System indicator
61 UCHAR EndHead; // Ending head number
62 UCHAR EndSector; // Ending sector (2 high bits of cylinder #)
63 UCHAR EndCylinder; // Ending cylinder# (low order bits of cylinder #)
64 ULONG SectorCountBeforePartition; // Number of sectors preceding the partition
65 ULONG PartitionSectorCount; // Number of sectors in the partition
66
67 } PARTITION_TABLE_ENTRY, *PPARTITION_TABLE_ENTRY;
68
69 /*
70 * Define the structure of the master boot record
71 */
72 typedef struct _MASTER_BOOT_RECORD
73 {
74 UCHAR MasterBootRecordCodeAndData[0x1b8]; /* 0x000 */
75 ULONG Signature; /* 0x1B8 */
76 USHORT Reserved; /* 0x1BC */
77 PARTITION_TABLE_ENTRY PartitionTable[4]; /* 0x1BE */
78 USHORT MasterBootRecordMagic; /* 0x1FE */
79
80 } MASTER_BOOT_RECORD, *PMASTER_BOOT_RECORD;
81 #include <poppack.h>
82
83 /*
84 * Partition type defines (of PSDK)
85 */
86 #define PARTITION_ENTRY_UNUSED 0x00 // Entry unused
87 #define PARTITION_FAT_12 0x01 // 12-bit FAT entries
88 #define PARTITION_XENIX_1 0x02 // Xenix
89 #define PARTITION_XENIX_2 0x03 // Xenix
90 #define PARTITION_FAT_16 0x04 // 16-bit FAT entries
91 #define PARTITION_EXTENDED 0x05 // Extended partition entry
92 #define PARTITION_HUGE 0x06 // Huge partition MS-DOS V4
93 #define PARTITION_IFS 0x07 // IFS Partition
94 #define PARTITION_OS2BOOTMGR 0x0A // OS/2 Boot Manager/OPUS/Coherent swap
95 #define PARTITION_FAT32 0x0B // FAT32
96 #define PARTITION_FAT32_XINT13 0x0C // FAT32 using extended int13 services
97 #define PARTITION_XINT13 0x0E // Win95 partition using extended int13 services
98 #define PARTITION_XINT13_EXTENDED 0x0F // Same as type 5 but uses extended int13 services
99 #define PARTITION_NTFS 0x17 // NTFS
100 #define PARTITION_PREP 0x41 // PowerPC Reference Platform (PReP) Boot Partition
101 #define PARTITION_LDM 0x42 // Logical Disk Manager partition
102 #define PARTITION_UNIX 0x63 // Unix
103 #define VALID_NTFT 0xC0 // NTFT uses high order bits
104 #define PARTITION_NTFT 0x80 // NTFT partition
105 #define PARTITION_GPT 0xEE // GPT protective partition
106 #ifdef __REACTOS__
107 #define PARTITION_OLD_LINUX 0x43
108 #define PARTITION_LINUX 0x83
109 #endif
110
111 ///////////////////////////////////////////////////////////////////////////////////////
112 //
113 // PC x86/64 BIOS Disk Functions (pcdisk.c)
114 //
115 ///////////////////////////////////////////////////////////////////////////////////////
116 #if defined(__i386__) || defined(_M_AMD64)
117 VOID DiskStopFloppyMotor(VOID);
118 #endif // defined __i386__ || defined(_M_AMD64)
119
120 /* Buffer for disk reads (hwdisk.c) */
121 extern PVOID DiskReadBuffer;
122 extern SIZE_T DiskReadBufferSize;
123
124
125 /* ARC path of the boot drive and partition */
126 extern CCHAR FrldrBootPath[MAX_PATH];
127
128
129 ///////////////////////////////////////////////////////////////////////////////////////
130 //
131 // Fixed Disk Partition Management Functions
132 //
133 ///////////////////////////////////////////////////////////////////////////////////////
134
135 VOID
136 DiskDetectPartitionType(
137 IN UCHAR DriveNumber);
138
139 BOOLEAN
140 DiskGetBootPartitionEntry(
141 IN UCHAR DriveNumber,
142 OUT PPARTITION_TABLE_ENTRY PartitionTableEntry,
143 OUT PULONG BootPartition);
144
145 BOOLEAN
146 DiskGetPartitionEntry(
147 IN UCHAR DriveNumber,
148 IN ULONG PartitionNumber,
149 OUT PPARTITION_TABLE_ENTRY PartitionTableEntry);
150
151 /*
152 * SCSI support (disk/scsiport.c)
153 */
154 ULONG LoadBootDeviceDriver(VOID);