2 * PROJECT: ReactOS Setup Library
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Partition list functions
5 * COPYRIGHT: Copyright 2003-2018 Casper S. Hornstrup (chorns@users.sourceforge.net)
10 typedef enum _FORMATSTATE
17 } FORMATSTATE
, *PFORMATSTATE
;
21 typedef struct _PARTENTRY
25 /* The disk this partition belongs to */
26 struct _DISKENTRY
*DiskEntry
;
28 /* Partition geometry */
29 ULARGE_INTEGER StartSector
;
30 ULARGE_INTEGER SectorCount
;
32 BOOLEAN BootIndicator
;
35 ULONG PartitionNumber
; /* Enumerated partition number (primary partitions first -- excluding the extended partition container --, then the logical partitions) */
36 ULONG PartitionIndex
; /* Index in the LayoutBuffer->PartitionEntry[] cached array of the corresponding DiskEntry */
40 BOOLEAN LogicalPartition
;
42 /* Partition is partitioned disk space */
43 BOOLEAN IsPartitioned
;
45 /* Partition is new, table does not exist on disk yet */
48 /* Partition was created automatically */
51 /* Partition must be checked */
54 FORMATSTATE FormatState
;
55 struct _FILE_SYSTEM
* FileSystem
;
57 } PARTENTRY
, *PPARTENTRY
;
60 typedef struct _BIOSDISKENTRY
67 CM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry
;
68 CM_INT13_DRIVE_PARAMETER Int13DiskData
;
69 } BIOSDISKENTRY
, *PBIOSDISKENTRY
;
72 typedef struct _DISKENTRY
79 ULONG TracksPerCylinder
;
80 ULONG SectorsPerTrack
;
83 ULARGE_INTEGER SectorCount
;
84 ULONG SectorAlignment
;
85 ULONG CylinderAlignment
;
90 // ULONG Signature; // Obtained from LayoutBuffer->Signature
100 /* Has the partition list been modified? */
104 BOOLEAN NoMbr
; /* MBR is absent */ // See r40437
106 UNICODE_STRING DriverName
;
108 PDRIVE_LAYOUT_INFORMATION LayoutBuffer
;
109 // TODO: When adding support for GPT disks:
110 // Use PDRIVE_LAYOUT_INFORMATION_EX which indicates whether
111 // the disk is MBR, GPT, or unknown (uninitialized).
112 // Depending on the style, either use the MBR or GPT partition info.
114 /* Pointer to the unique extended partition on this disk */
115 PPARTENTRY ExtendedPartition
;
117 LIST_ENTRY PrimaryPartListHead
;
118 LIST_ENTRY LogicalPartListHead
;
120 } DISKENTRY
, *PDISKENTRY
;
123 typedef struct _PARTLIST
126 * Disk & Partition iterators.
128 * NOTE that when CurrentPartition != NULL, then CurrentPartition->DiskEntry
129 * must be the same as CurrentDisk. We should however keep the two members
130 * separated as we can have a current (selected) disk without any current
131 * partition, if the former does not contain any.
133 PDISKENTRY CurrentDisk
;
134 PPARTENTRY CurrentPartition
;
137 * The system partition where the boot manager resides.
138 * The corresponding system disk is obtained via:
139 * SystemPartition->DiskEntry.
141 PPARTENTRY SystemPartition
;
143 * The original system partition in case we are redefining it because
144 * we do not have write support on it.
145 * Please note that this is partly a HACK and MUST NEVER happen on
146 * architectures where real system partitions are mandatory (because then
147 * they are formatted in FAT FS and we support write operation on them).
148 * The corresponding original system disk is obtained via:
149 * OriginalSystemPartition->DiskEntry.
151 PPARTENTRY OriginalSystemPartition
;
153 LIST_ENTRY DiskListHead
;
154 LIST_ENTRY BiosDiskListHead
;
156 } PARTLIST
, *PPARTLIST
;
158 #define PARTITION_TBL_SIZE 4
160 #include <pshpack1.h>
162 typedef struct _PARTITION
164 unsigned char BootFlags
; /* bootable? 0=no, 128=yes */
165 unsigned char StartingHead
; /* beginning head number */
166 unsigned char StartingSector
; /* beginning sector number */
167 unsigned char StartingCylinder
; /* 10 bit nmbr, with high 2 bits put in begsect */
168 unsigned char PartitionType
; /* Operating System type indicator code */
169 unsigned char EndingHead
; /* ending head number */
170 unsigned char EndingSector
; /* ending sector number */
171 unsigned char EndingCylinder
; /* also a 10 bit nmbr, with same high 2 bit trick */
172 unsigned int StartingBlock
; /* first sector relative to start of disk */
173 unsigned int SectorCount
; /* number of sectors in partition */
174 } PARTITION
, *PPARTITION
;
176 typedef struct _PARTITION_SECTOR
178 UCHAR BootCode
[440]; /* 0x000 */
179 ULONG Signature
; /* 0x1B8 */
180 UCHAR Reserved
[2]; /* 0x1BC */
181 PARTITION Partition
[PARTITION_TBL_SIZE
]; /* 0x1BE */
182 USHORT Magic
; /* 0x1FE */
183 } PARTITION_SECTOR
, *PPARTITION_SECTOR
;
189 LIST_ENTRY ListEntry
;
193 } BIOS_DISK
, *PBIOS_DISK
;
209 IN ULONGLONG Dividend
,
210 IN ULONGLONG Divisor
);
215 CreatePartitionList(VOID
);
218 DestroyPartitionList(
224 IN ULONG BiosDiskNumber
);
229 IN ULONG DiskNumber
);
245 // IN PPARTLIST List,
246 IN PDISKENTRY DiskEntry
,
247 IN ULONG PartitionNumber
);
253 IN ULONG PartitionNumber OPTIONAL
,
254 OUT PDISKENTRY
* pDiskEntry
,
255 OUT PPARTENTRY
* pPartEntry OPTIONAL
);
261 IN ULONG PartitionNumber
);
272 CreatePrimaryPartition(
274 IN ULONGLONG SectorCount
,
275 IN BOOLEAN AutoCreate
);
278 CreateExtendedPartition(
280 IN ULONGLONG SectorCount
);
283 CreateLogicalPartition(
285 IN ULONGLONG SectorCount
,
286 IN BOOLEAN AutoCreate
);
289 DeleteCurrentPartition(
293 CheckActiveSystemPartition(
297 WritePartitionsToDisk(
301 SetMountedDeviceValue(
304 IN LARGE_INTEGER StartingOffset
);
307 SetMountedDeviceValues(
312 IN PPARTENTRY PartEntry
,
313 IN UCHAR PartitionType
);
316 PrimaryPartitionCreationChecks(
320 ExtendedPartitionCreationChecks(
324 LogicalPartitionCreationChecks(
328 GetNextUnformattedPartition(
330 OUT PDISKENTRY
*pDiskEntry OPTIONAL
,
331 OUT PPARTENTRY
*pPartEntry
);
334 GetNextUncheckedPartition(
336 OUT PDISKENTRY
*pDiskEntry OPTIONAL
,
337 OUT PPARTENTRY
*pPartEntry
);