1bd8226afSVictor Perevertkin /*
2bd8226afSVictor Perevertkin * PROJECT: Partition manager driver
3bd8226afSVictor Perevertkin * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4bd8226afSVictor Perevertkin * PURPOSE: Main header
5bd8226afSVictor Perevertkin * COPYRIGHT: 2020 Victor Perevertkin (victor.perevertkin@reactos.org)
6bd8226afSVictor Perevertkin */
7bd8226afSVictor Perevertkin
8bd8226afSVictor Perevertkin #ifndef _PARTMGR_H_
9bd8226afSVictor Perevertkin #define _PARTMGR_H_
10bd8226afSVictor Perevertkin
11bd8226afSVictor Perevertkin #include <ntifs.h>
12bd8226afSVictor Perevertkin #include <mountdev.h>
13bd8226afSVictor Perevertkin #include <ntddvol.h>
14bd8226afSVictor Perevertkin #include <ntdddisk.h>
15bd8226afSVictor Perevertkin #include <ndk/psfuncs.h>
16bd8226afSVictor Perevertkin #include <ndk/section_attribs.h>
17bd8226afSVictor Perevertkin #include <ioevent.h>
18bd8226afSVictor Perevertkin #include <stdio.h>
19bd8226afSVictor Perevertkin #include <debug/driverdbg.h>
20bd8226afSVictor Perevertkin
21bd8226afSVictor Perevertkin #include "debug.h"
22bd8226afSVictor Perevertkin
23bd8226afSVictor Perevertkin #define TAG_PARTMGR 'MtrP'
24bd8226afSVictor Perevertkin
25bd8226afSVictor Perevertkin // from disk.sys
26bd8226afSVictor Perevertkin typedef struct _DISK_GEOMETRY_EX_INTERNAL
27bd8226afSVictor Perevertkin {
28bd8226afSVictor Perevertkin DISK_GEOMETRY Geometry;
29bd8226afSVictor Perevertkin INT64 DiskSize;
30bd8226afSVictor Perevertkin DISK_PARTITION_INFO Partition;
31bd8226afSVictor Perevertkin DISK_DETECTION_INFO Detection;
32bd8226afSVictor Perevertkin } DISK_GEOMETRY_EX_INTERNAL, *PDISK_GEOMETRY_EX_INTERNAL;
33bd8226afSVictor Perevertkin
34*e80cd676SHermès Bélusca-Maïto // Unique ID data for basic (disk partition-based) volumes.
35*e80cd676SHermès Bélusca-Maïto // It is stored in the MOUNTDEV_UNIQUE_ID::UniqueId member
36*e80cd676SHermès Bélusca-Maïto // as an array of bytes.
37*e80cd676SHermès Bélusca-Maïto #include <pshpack1.h>
38*e80cd676SHermès Bélusca-Maïto typedef union _BASIC_VOLUME_UNIQUE_ID
39*e80cd676SHermès Bélusca-Maïto {
40*e80cd676SHermès Bélusca-Maïto struct
41*e80cd676SHermès Bélusca-Maïto {
42*e80cd676SHermès Bélusca-Maïto ULONG Signature;
43*e80cd676SHermès Bélusca-Maïto ULONGLONG StartingOffset;
44*e80cd676SHermès Bélusca-Maïto } Mbr;
45*e80cd676SHermès Bélusca-Maïto struct
46*e80cd676SHermès Bélusca-Maïto {
47*e80cd676SHermès Bélusca-Maïto ULONGLONG Signature; // UCHAR[8] // "DMIO:ID:"
48*e80cd676SHermès Bélusca-Maïto GUID PartitionGuid;
49*e80cd676SHermès Bélusca-Maïto } Gpt;
50*e80cd676SHermès Bélusca-Maïto } BASIC_VOLUME_UNIQUE_ID, *PBASIC_VOLUME_UNIQUE_ID;
51*e80cd676SHermès Bélusca-Maïto #include <poppack.h>
52*e80cd676SHermès Bélusca-Maïto C_ASSERT(RTL_FIELD_SIZE(BASIC_VOLUME_UNIQUE_ID, Mbr) == 0x0C);
53*e80cd676SHermès Bélusca-Maïto C_ASSERT(RTL_FIELD_SIZE(BASIC_VOLUME_UNIQUE_ID, Gpt) == 0x18);
54*e80cd676SHermès Bélusca-Maïto
55*e80cd676SHermès Bélusca-Maïto #define DMIO_ID_SIGNATURE (*(ULONGLONG*)"DMIO:ID:")
56*e80cd676SHermès Bélusca-Maïto
57bd8226afSVictor Perevertkin typedef struct _FDO_EXTENSION
58bd8226afSVictor Perevertkin {
59bd8226afSVictor Perevertkin BOOLEAN IsFDO;
60bd8226afSVictor Perevertkin PDEVICE_OBJECT DeviceObject;
61bd8226afSVictor Perevertkin PDEVICE_OBJECT LowerDevice;
62bd8226afSVictor Perevertkin PDEVICE_OBJECT PhysicalDiskDO;
63bd8226afSVictor Perevertkin KEVENT SyncEvent;
64bd8226afSVictor Perevertkin
65bd8226afSVictor Perevertkin BOOLEAN LayoutValid;
66bd8226afSVictor Perevertkin PDRIVE_LAYOUT_INFORMATION_EX LayoutCache;
67bd8226afSVictor Perevertkin
68bd8226afSVictor Perevertkin SINGLE_LIST_ENTRY PartitionList;
69bd8226afSVictor Perevertkin UINT32 EnumeratedPartitionsTotal;
703d26d76aSHermès Bélusca-Maïto BOOLEAN IsSuperFloppy;
71bd8226afSVictor Perevertkin
72bd8226afSVictor Perevertkin struct {
73bd8226afSVictor Perevertkin UINT64 DiskSize;
74bd8226afSVictor Perevertkin UINT32 DeviceNumber;
75bd8226afSVictor Perevertkin UINT32 BytesPerSector;
76bd8226afSVictor Perevertkin PARTITION_STYLE PartitionStyle;
77bd8226afSVictor Perevertkin union {
78bd8226afSVictor Perevertkin struct {
79bd8226afSVictor Perevertkin UINT32 Signature;
80bd8226afSVictor Perevertkin } Mbr;
81bd8226afSVictor Perevertkin struct {
82bd8226afSVictor Perevertkin GUID DiskId;
83bd8226afSVictor Perevertkin } Gpt;
84bd8226afSVictor Perevertkin };
85bd8226afSVictor Perevertkin } DiskData;
863d26d76aSHermès Bélusca-Maïto UNICODE_STRING DiskInterfaceName;
87bd8226afSVictor Perevertkin } FDO_EXTENSION, *PFDO_EXTENSION;
88bd8226afSVictor Perevertkin
89bd8226afSVictor Perevertkin typedef struct _PARTITION_EXTENSION
90bd8226afSVictor Perevertkin {
91bd8226afSVictor Perevertkin BOOLEAN IsFDO;
92bd8226afSVictor Perevertkin PDEVICE_OBJECT DeviceObject;
93bd8226afSVictor Perevertkin PDEVICE_OBJECT LowerDevice;
94bd8226afSVictor Perevertkin PDEVICE_OBJECT Part0Device;
95bd8226afSVictor Perevertkin
96bd8226afSVictor Perevertkin UINT64 StartingOffset;
97bd8226afSVictor Perevertkin UINT64 PartitionLength;
98bd8226afSVictor Perevertkin SINGLE_LIST_ENTRY ListEntry;
99bd8226afSVictor Perevertkin
1000a8b421dSHermès Bélusca-Maïto UINT32 VolumeNumber; // Volume number in the "\Device\HarddiskVolumeN" device name
101bd8226afSVictor Perevertkin UINT32 DetectedNumber;
102bd8226afSVictor Perevertkin UINT32 OnDiskNumber; // partition number for issuing Io requests to the kernel
103bd8226afSVictor Perevertkin BOOLEAN IsEnumerated; // reported via IRP_MN_QUERY_DEVICE_RELATIONS
104bd8226afSVictor Perevertkin BOOLEAN SymlinkCreated;
105bd8226afSVictor Perevertkin BOOLEAN Attached; // attached to PartitionList of the FDO
106bd8226afSVictor Perevertkin union
107bd8226afSVictor Perevertkin {
108bd8226afSVictor Perevertkin struct
109bd8226afSVictor Perevertkin {
110bd8226afSVictor Perevertkin GUID PartitionType;
111bd8226afSVictor Perevertkin GUID PartitionId;
112bd8226afSVictor Perevertkin UINT64 Attributes;
113bd8226afSVictor Perevertkin WCHAR Name[36];
114bd8226afSVictor Perevertkin } Gpt;
115bd8226afSVictor Perevertkin struct
116bd8226afSVictor Perevertkin {
117bd8226afSVictor Perevertkin UINT8 PartitionType;
118bd8226afSVictor Perevertkin BOOLEAN BootIndicator;
119bd8226afSVictor Perevertkin BOOLEAN RecognizedPartition;
120bd8226afSVictor Perevertkin UINT32 HiddenSectors;
121bd8226afSVictor Perevertkin } Mbr;
122bd8226afSVictor Perevertkin };
123bd8226afSVictor Perevertkin UNICODE_STRING PartitionInterfaceName;
124bd8226afSVictor Perevertkin UNICODE_STRING VolumeInterfaceName;
125bd8226afSVictor Perevertkin UNICODE_STRING DeviceName;
126bd8226afSVictor Perevertkin } PARTITION_EXTENSION, *PPARTITION_EXTENSION;
127bd8226afSVictor Perevertkin
1283adf4508SJérôme Gardou CODE_SEG("PAGE")
129bd8226afSVictor Perevertkin NTSTATUS
130bd8226afSVictor Perevertkin PartitionCreateDevice(
131bd8226afSVictor Perevertkin _In_ PDEVICE_OBJECT FDObject,
132bd8226afSVictor Perevertkin _In_ PPARTITION_INFORMATION_EX PartitionEntry,
133bd8226afSVictor Perevertkin _In_ UINT32 OnDiskNumber,
134bd8226afSVictor Perevertkin _In_ PARTITION_STYLE PartitionStyle,
135bd8226afSVictor Perevertkin _Out_ PDEVICE_OBJECT *PDO);
136bd8226afSVictor Perevertkin
1373adf4508SJérôme Gardou CODE_SEG("PAGE")
138bd8226afSVictor Perevertkin NTSTATUS
139bd8226afSVictor Perevertkin PartitionHandleRemove(
140bd8226afSVictor Perevertkin _In_ PPARTITION_EXTENSION PartExt,
141bd8226afSVictor Perevertkin _In_ BOOLEAN FinalRemove);
142bd8226afSVictor Perevertkin
1433adf4508SJérôme Gardou CODE_SEG("PAGE")
144bd8226afSVictor Perevertkin NTSTATUS
145bd8226afSVictor Perevertkin PartitionHandlePnp(
146bd8226afSVictor Perevertkin _In_ PDEVICE_OBJECT DeviceObject,
147bd8226afSVictor Perevertkin _In_ PIRP Irp);
148bd8226afSVictor Perevertkin
149bd8226afSVictor Perevertkin NTSTATUS
150bd8226afSVictor Perevertkin PartitionHandleDeviceControl(
151bd8226afSVictor Perevertkin _In_ PDEVICE_OBJECT DeviceObject,
152bd8226afSVictor Perevertkin _In_ PIRP Irp);
153bd8226afSVictor Perevertkin
154bd8226afSVictor Perevertkin NTSTATUS
155bd8226afSVictor Perevertkin NTAPI
156bd8226afSVictor Perevertkin ForwardIrpAndForget(
157bd8226afSVictor Perevertkin _In_ PDEVICE_OBJECT DeviceObject,
158bd8226afSVictor Perevertkin _In_ PIRP Irp);
159bd8226afSVictor Perevertkin
160bd8226afSVictor Perevertkin NTSTATUS
161bd8226afSVictor Perevertkin IssueSyncIoControlRequest(
162bd8226afSVictor Perevertkin _In_ UINT32 IoControlCode,
163bd8226afSVictor Perevertkin _In_ PDEVICE_OBJECT DeviceObject,
164bd8226afSVictor Perevertkin _In_ PVOID InputBuffer,
165bd8226afSVictor Perevertkin _In_ ULONG InputBufferLength,
166bd8226afSVictor Perevertkin _In_ PVOID OutputBuffer,
167bd8226afSVictor Perevertkin _In_ ULONG OutputBufferLength,
168bd8226afSVictor Perevertkin _In_ BOOLEAN InternalDeviceIoControl);
169bd8226afSVictor Perevertkin
1706488440aSJérôme Gardou FORCEINLINE
171bd8226afSVictor Perevertkin BOOLEAN
VerifyIrpOutBufferSize(_In_ PIRP Irp,_In_ SIZE_T Size)172bd8226afSVictor Perevertkin VerifyIrpOutBufferSize(
173bd8226afSVictor Perevertkin _In_ PIRP Irp,
174bd8226afSVictor Perevertkin _In_ SIZE_T Size)
175bd8226afSVictor Perevertkin {
176bd8226afSVictor Perevertkin PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
177bd8226afSVictor Perevertkin if (ioStack->Parameters.DeviceIoControl.OutputBufferLength < Size)
178bd8226afSVictor Perevertkin {
179bd8226afSVictor Perevertkin Irp->IoStatus.Information = Size;
180bd8226afSVictor Perevertkin return FALSE;
181bd8226afSVictor Perevertkin }
182bd8226afSVictor Perevertkin return TRUE;
183bd8226afSVictor Perevertkin }
184bd8226afSVictor Perevertkin
1856488440aSJérôme Gardou FORCEINLINE
186bd8226afSVictor Perevertkin BOOLEAN
VerifyIrpInBufferSize(_In_ PIRP Irp,_In_ SIZE_T Size)187bd8226afSVictor Perevertkin VerifyIrpInBufferSize(
188bd8226afSVictor Perevertkin _In_ PIRP Irp,
189bd8226afSVictor Perevertkin _In_ SIZE_T Size)
190bd8226afSVictor Perevertkin {
191bd8226afSVictor Perevertkin PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
192bd8226afSVictor Perevertkin if (ioStack->Parameters.DeviceIoControl.InputBufferLength < Size)
193bd8226afSVictor Perevertkin {
194bd8226afSVictor Perevertkin Irp->IoStatus.Information = Size;
195bd8226afSVictor Perevertkin return FALSE;
196bd8226afSVictor Perevertkin }
197bd8226afSVictor Perevertkin return TRUE;
198bd8226afSVictor Perevertkin }
199bd8226afSVictor Perevertkin
2006488440aSJérôme Gardou FORCEINLINE
201bd8226afSVictor Perevertkin VOID
PartMgrAcquireLayoutLock(_In_ PFDO_EXTENSION FDOExtension)202bd8226afSVictor Perevertkin PartMgrAcquireLayoutLock(
203bd8226afSVictor Perevertkin _In_ PFDO_EXTENSION FDOExtension)
204bd8226afSVictor Perevertkin {
205bd8226afSVictor Perevertkin PAGED_CODE();
206bd8226afSVictor Perevertkin
207bd8226afSVictor Perevertkin KeWaitForSingleObject(&FDOExtension->SyncEvent, Executive, KernelMode, FALSE, NULL);
208bd8226afSVictor Perevertkin }
209bd8226afSVictor Perevertkin
2106488440aSJérôme Gardou FORCEINLINE
211bd8226afSVictor Perevertkin VOID
PartMgrReleaseLayoutLock(_In_ PFDO_EXTENSION FDOExtension)212bd8226afSVictor Perevertkin PartMgrReleaseLayoutLock(
213bd8226afSVictor Perevertkin _In_ PFDO_EXTENSION FDOExtension)
214bd8226afSVictor Perevertkin {
215bd8226afSVictor Perevertkin PAGED_CODE();
216bd8226afSVictor Perevertkin
217bd8226afSVictor Perevertkin KeSetEvent(&FDOExtension->SyncEvent, IO_NO_INCREMENT, FALSE);
218bd8226afSVictor Perevertkin }
219bd8226afSVictor Perevertkin
220bd8226afSVictor Perevertkin #endif // _PARTMGR_H_
221