xref: /reactos/base/setup/usetup/partlist.h (revision 216f15c6)
1 /*
2  *  ReactOS kernel
3  *  Copyright (C) 2002, 2003 ReactOS Team
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 /* COPYRIGHT:       See COPYING in the top level directory
20  * PROJECT:         ReactOS text-mode setup
21  * FILE:            base/setup/usetup/partlist.h
22  * PURPOSE:         Partition list functions
23  * PROGRAMMER:      Eric Kohl
24  */
25 
26 #pragma once
27 
28 typedef enum _FORMATSTATE
29 {
30     Unformatted,
31     UnformattedOrDamaged,
32     UnknownFormat,
33     Preformatted,
34     Formatted
35 } FORMATSTATE, *PFORMATSTATE;
36 
37 typedef enum _FORMATMACHINESTATE
38 {
39     Start,
40     FormatSystemPartition,
41     FormatInstallPartition,
42     FormatOtherPartition,
43     FormatDone,
44     CheckSystemPartition,
45     CheckInstallPartition,
46     CheckOtherPartition,
47     CheckDone
48 } FORMATMACHINESTATE, *PFORMATMACHINESTATE;
49 
50 typedef struct _PARTENTRY
51 {
52     LIST_ENTRY ListEntry;
53 
54     /* The disk this partition belongs to */
55     struct _DISKENTRY *DiskEntry;
56 
57     /* Partition geometry */
58     ULARGE_INTEGER StartSector;
59     ULARGE_INTEGER SectorCount;
60 
61     BOOLEAN BootIndicator;
62     UCHAR PartitionType;
63     ULONG HiddenSectors;
64     ULONG PartitionNumber;  /* Enumerated partition number (primary partitions first -- excluding the extended partition container --, then the logical partitions) */
65     ULONG PartitionIndex;   /* Index in the LayoutBuffer->PartitionEntry[] cached array of the corresponding DiskEntry */
66 
67     CHAR DriveLetter;
68 
69     BOOLEAN LogicalPartition;
70 
71     /* Partition is partitioned disk space */
72     BOOLEAN IsPartitioned;
73 
74     /* Partition is new, table does not exist on disk yet */
75     BOOLEAN New;
76 
77     /* Partition was created automatically */
78     BOOLEAN AutoCreate;
79 
80     /* Partition must be checked */
81     BOOLEAN NeedsCheck;
82 
83     FORMATSTATE FormatState;
84     struct _FILE_SYSTEM_ITEM *FileSystem;
85 
86 } PARTENTRY, *PPARTENTRY;
87 
88 
89 typedef struct _BIOSDISKENTRY
90 {
91     LIST_ENTRY ListEntry;
92     ULONG DiskNumber;
93     ULONG Signature;
94     ULONG Checksum;
95     BOOLEAN Recognized;
96     CM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
97     CM_INT13_DRIVE_PARAMETER Int13DiskData;
98 } BIOSDISKENTRY, *PBIOSDISKENTRY;
99 
100 
101 typedef struct _DISKENTRY
102 {
103     LIST_ENTRY ListEntry;
104 
105     /* Disk geometry */
106 
107     ULONGLONG Cylinders;
108     ULONG TracksPerCylinder;
109     ULONG SectorsPerTrack;
110     ULONG BytesPerSector;
111 
112     ULARGE_INTEGER SectorCount;
113     ULONG SectorAlignment;
114     ULONG CylinderAlignment;
115 
116     /* BIOS parameters */
117     BOOLEAN BiosFound;
118     ULONG BiosDiskNumber;
119 //    ULONG Signature;
120 //    ULONG Checksum;
121 
122     /* SCSI parameters */
123     ULONG DiskNumber;
124     USHORT Port;
125     USHORT Bus;
126     USHORT Id;
127 
128     /* Has the partition list been modified? */
129     BOOLEAN Dirty;
130 
131     BOOLEAN NewDisk;
132     BOOLEAN NoMbr; /* MBR is absent */  // See r40437
133 
134     UNICODE_STRING DriverName;
135 
136     PDRIVE_LAYOUT_INFORMATION LayoutBuffer;
137     // TODO: When adding support for GPT disks:
138     // Use PDRIVE_LAYOUT_INFORMATION_EX which indicates whether
139     // the disk is MBR, GPT, or unknown (uninitialized).
140     // Depending on the style, either use the MBR or GPT partition info.
141 
142     /* Pointer to the unique extended partition on this disk */
143     PPARTENTRY ExtendedPartition;
144 
145     LIST_ENTRY PrimaryPartListHead;
146     LIST_ENTRY LogicalPartListHead;
147 
148 } DISKENTRY, *PDISKENTRY;
149 
150 
151 typedef struct _PARTLIST
152 {
153     /*
154      * Disk & Partition iterators.
155      *
156      * NOTE that when CurrentPartition != NULL, then CurrentPartition->DiskEntry
157      * must be the same as CurrentDisk. We should however keep the two members
158      * separated as we can have a current (selected) disk without any current
159      * partition, if the former does not contain any.
160      */
161     PDISKENTRY CurrentDisk;
162     PPARTENTRY CurrentPartition;
163 
164     /*
165      * The system partition where the boot manager resides.
166      * The corresponding system disk is obtained via:
167      *    SystemPartition->DiskEntry.
168      */
169     PPARTENTRY SystemPartition;
170     /*
171      * The original system partition in case we are redefining it because
172      * we do not have write support on it.
173      * Please note that this is partly a HACK and MUST NEVER happen on
174      * architectures where real system partitions are mandatory (because then
175      * they are formatted in FAT FS and we support write operation on them).
176      * The corresponding original system disk is obtained via:
177      *    OriginalSystemPartition->DiskEntry.
178      */
179     PPARTENTRY OriginalSystemPartition;
180 
181     PPARTENTRY TempPartition;
182     FORMATMACHINESTATE FormatState;
183 
184     LIST_ENTRY DiskListHead;
185     LIST_ENTRY BiosDiskListHead;
186 
187 } PARTLIST, *PPARTLIST;
188 
189 #define  PARTITION_TBL_SIZE 4
190 
191 #include <pshpack1.h>
192 
193 typedef struct _PARTITION
194 {
195     unsigned char   BootFlags;        /* bootable?  0=no, 128=yes  */
196     unsigned char   StartingHead;     /* beginning head number */
197     unsigned char   StartingSector;   /* beginning sector number */
198     unsigned char   StartingCylinder; /* 10 bit nmbr, with high 2 bits put in begsect */
199     unsigned char   PartitionType;    /* Operating System type indicator code */
200     unsigned char   EndingHead;       /* ending head number */
201     unsigned char   EndingSector;     /* ending sector number */
202     unsigned char   EndingCylinder;   /* also a 10 bit nmbr, with same high 2 bit trick */
203     unsigned int  StartingBlock;      /* first sector relative to start of disk */
204     unsigned int  SectorCount;        /* number of sectors in partition */
205 } PARTITION, *PPARTITION;
206 
207 typedef struct _PARTITION_SECTOR
208 {
209     UCHAR BootCode[440];                     /* 0x000 */
210     ULONG Signature;                         /* 0x1B8 */
211     UCHAR Reserved[2];                       /* 0x1BC */
212     PARTITION Partition[PARTITION_TBL_SIZE]; /* 0x1BE */
213     USHORT Magic;                            /* 0x1FE */
214 } PARTITION_SECTOR, *PPARTITION_SECTOR;
215 
216 #include <poppack.h>
217 
218 typedef struct
219 {
220     LIST_ENTRY ListEntry;
221     ULONG DiskNumber;
222     ULONG Identifier;
223     ULONG Signature;
224 } BIOS_DISK, *PBIOS_DISK;
225 
226 VOID
227 GetPartTypeStringFromPartitionType(
228     IN UCHAR partitionType,
229     OUT PCHAR strPartType,
230     IN ULONG cchPartType);
231 
232 PPARTLIST
233 CreatePartitionList(VOID);
234 
235 VOID
236 DestroyPartitionList(
237     IN PPARTLIST List);
238 
239 ULONG
240 SelectPartition(
241     IN PPARTLIST List,
242     IN ULONG DiskNumber,
243     IN ULONG PartitionNumber);
244 
245 PPARTENTRY
246 GetNextPartition(
247     IN PPARTLIST List);
248 
249 PPARTENTRY
250 GetPrevPartition(
251     IN PPARTLIST List);
252 
253 VOID
254 CreatePrimaryPartition(
255     IN PPARTLIST List,
256     IN ULONGLONG SectorCount,
257     IN BOOLEAN AutoCreate);
258 
259 VOID
260 CreateExtendedPartition(
261     IN PPARTLIST List,
262     IN ULONGLONG SectorCount);
263 
264 VOID
265 CreateLogicalPartition(
266     IN PPARTLIST List,
267     IN ULONGLONG SectorCount,
268     IN BOOLEAN AutoCreate);
269 
270 VOID
271 DeleteCurrentPartition(
272     IN PPARTLIST List);
273 
274 VOID
275 CheckActiveSystemPartition(
276     IN PPARTLIST List,
277     IN PFILE_SYSTEM_LIST FileSystemList);
278 
279 BOOLEAN
280 WritePartitionsToDisk(
281     IN PPARTLIST List);
282 
283 BOOLEAN
284 SetMountedDeviceValues(
285     IN PPARTLIST List);
286 
287 VOID
288 SetPartitionType(
289     IN PPARTENTRY PartEntry,
290     IN UCHAR PartitionType);
291 
292 ULONG
293 PrimaryPartitionCreationChecks(
294     IN PPARTLIST List);
295 
296 ULONG
297 ExtendedPartitionCreationChecks(
298     IN PPARTLIST List);
299 
300 ULONG
301 LogicalPartitionCreationChecks(
302     IN PPARTLIST List);
303 
304 BOOLEAN
305 GetNextUnformattedPartition(
306     IN PPARTLIST List,
307     OUT PDISKENTRY *pDiskEntry OPTIONAL,
308     OUT PPARTENTRY *pPartEntry);
309 
310 BOOLEAN
311 GetNextUncheckedPartition(
312     IN PPARTLIST List,
313     OUT PDISKENTRY *pDiskEntry OPTIONAL,
314     OUT PPARTENTRY *pPartEntry);
315 
316 
317 
318 
319 
320 typedef struct _PARTLIST_UI
321 {
322     PPARTLIST List;
323 
324     // PLIST_ENTRY FirstShown;
325     // PLIST_ENTRY LastShown;
326 
327     SHORT Left;
328     SHORT Top;
329     SHORT Right;
330     SHORT Bottom;
331 
332     SHORT Line;
333     SHORT Offset;
334 
335     // BOOL Redraw;
336 } PARTLIST_UI, *PPARTLIST_UI;
337 
338 VOID
339 InitPartitionListUi(
340     IN OUT PPARTLIST_UI ListUi,
341     IN PPARTLIST List,
342     IN SHORT Left,
343     IN SHORT Top,
344     IN SHORT Right,
345     IN SHORT Bottom);
346 
347 VOID
348 ScrollDownPartitionList(
349     IN PPARTLIST_UI ListUi);
350 
351 VOID
352 ScrollUpPartitionList(
353     IN PPARTLIST_UI ListUi);
354 
355 VOID
356 DrawPartitionList(
357     IN PPARTLIST_UI ListUi);
358 
359 /* EOF */
360