xref: /reactos/drivers/storage/partmgr/partmgr.h (revision 3adf4508)
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 
34bd8226afSVictor Perevertkin typedef struct _FDO_EXTENSION
35bd8226afSVictor Perevertkin {
36bd8226afSVictor Perevertkin     BOOLEAN IsFDO;
37bd8226afSVictor Perevertkin     PDEVICE_OBJECT DeviceObject;
38bd8226afSVictor Perevertkin     PDEVICE_OBJECT LowerDevice;
39bd8226afSVictor Perevertkin     PDEVICE_OBJECT PhysicalDiskDO;
40bd8226afSVictor Perevertkin     KEVENT SyncEvent;
41bd8226afSVictor Perevertkin 
42bd8226afSVictor Perevertkin     BOOLEAN LayoutValid;
43bd8226afSVictor Perevertkin     PDRIVE_LAYOUT_INFORMATION_EX LayoutCache;
44bd8226afSVictor Perevertkin 
45bd8226afSVictor Perevertkin     SINGLE_LIST_ENTRY PartitionList;
46bd8226afSVictor Perevertkin     UINT32 EnumeratedPartitionsTotal;
472d6c6fa3SVictor Perevertkin     UNICODE_STRING DiskInterfaceName;
48bd8226afSVictor Perevertkin 
49bd8226afSVictor Perevertkin     struct {
50bd8226afSVictor Perevertkin         UINT64 DiskSize;
51bd8226afSVictor Perevertkin         UINT32 DeviceNumber;
52bd8226afSVictor Perevertkin         UINT32 BytesPerSector;
53bd8226afSVictor Perevertkin         PARTITION_STYLE PartitionStyle;
54bd8226afSVictor Perevertkin         union {
55bd8226afSVictor Perevertkin             struct {
56bd8226afSVictor Perevertkin                 UINT32 Signature;
57bd8226afSVictor Perevertkin             } Mbr;
58bd8226afSVictor Perevertkin             struct {
59bd8226afSVictor Perevertkin                 GUID DiskId;
60bd8226afSVictor Perevertkin             } Gpt;
61bd8226afSVictor Perevertkin         };
62bd8226afSVictor Perevertkin     } DiskData;
63bd8226afSVictor Perevertkin } FDO_EXTENSION, *PFDO_EXTENSION;
64bd8226afSVictor Perevertkin 
65bd8226afSVictor Perevertkin typedef struct _PARTITION_EXTENSION
66bd8226afSVictor Perevertkin {
67bd8226afSVictor Perevertkin     BOOLEAN IsFDO;
68bd8226afSVictor Perevertkin     PDEVICE_OBJECT DeviceObject;
69bd8226afSVictor Perevertkin     PDEVICE_OBJECT LowerDevice;
70bd8226afSVictor Perevertkin     PDEVICE_OBJECT Part0Device;
71bd8226afSVictor Perevertkin 
72bd8226afSVictor Perevertkin     UINT64 StartingOffset;
73bd8226afSVictor Perevertkin     UINT64 PartitionLength;
74bd8226afSVictor Perevertkin     SINGLE_LIST_ENTRY ListEntry;
75bd8226afSVictor Perevertkin 
76bd8226afSVictor Perevertkin     UINT32 DetectedNumber;
77bd8226afSVictor Perevertkin     UINT32 OnDiskNumber; // partition number for issuing Io requests to the kernel
78bd8226afSVictor Perevertkin     BOOLEAN IsEnumerated; // reported via IRP_MN_QUERY_DEVICE_RELATIONS
79bd8226afSVictor Perevertkin     BOOLEAN SymlinkCreated;
80bd8226afSVictor Perevertkin     BOOLEAN Attached; // attached to PartitionList of the FDO
81bd8226afSVictor Perevertkin     union
82bd8226afSVictor Perevertkin     {
83bd8226afSVictor Perevertkin         struct
84bd8226afSVictor Perevertkin         {
85bd8226afSVictor Perevertkin             GUID PartitionType;
86bd8226afSVictor Perevertkin             GUID PartitionId;
87bd8226afSVictor Perevertkin             UINT64 Attributes;
88bd8226afSVictor Perevertkin             WCHAR Name[36];
89bd8226afSVictor Perevertkin         } Gpt;
90bd8226afSVictor Perevertkin         struct
91bd8226afSVictor Perevertkin         {
92bd8226afSVictor Perevertkin             UINT8 PartitionType;
93bd8226afSVictor Perevertkin             BOOLEAN BootIndicator;
94bd8226afSVictor Perevertkin             BOOLEAN RecognizedPartition;
95bd8226afSVictor Perevertkin             UINT32 HiddenSectors;
96bd8226afSVictor Perevertkin         } Mbr;
97bd8226afSVictor Perevertkin     };
98bd8226afSVictor Perevertkin     UNICODE_STRING PartitionInterfaceName;
99bd8226afSVictor Perevertkin     UNICODE_STRING VolumeInterfaceName;
100bd8226afSVictor Perevertkin     UNICODE_STRING DeviceName;
101bd8226afSVictor Perevertkin } PARTITION_EXTENSION, *PPARTITION_EXTENSION;
102bd8226afSVictor Perevertkin 
103*3adf4508SJérôme Gardou CODE_SEG("PAGE")
104bd8226afSVictor Perevertkin NTSTATUS
105bd8226afSVictor Perevertkin PartitionCreateDevice(
106bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT FDObject,
107bd8226afSVictor Perevertkin     _In_ PPARTITION_INFORMATION_EX PartitionEntry,
108bd8226afSVictor Perevertkin     _In_ UINT32 OnDiskNumber,
109bd8226afSVictor Perevertkin     _In_ PARTITION_STYLE PartitionStyle,
110bd8226afSVictor Perevertkin     _Out_ PDEVICE_OBJECT *PDO);
111bd8226afSVictor Perevertkin 
112*3adf4508SJérôme Gardou CODE_SEG("PAGE")
113bd8226afSVictor Perevertkin NTSTATUS
114bd8226afSVictor Perevertkin PartitionHandleRemove(
115bd8226afSVictor Perevertkin     _In_ PPARTITION_EXTENSION PartExt,
116bd8226afSVictor Perevertkin     _In_ BOOLEAN FinalRemove);
117bd8226afSVictor Perevertkin 
118*3adf4508SJérôme Gardou CODE_SEG("PAGE")
119bd8226afSVictor Perevertkin NTSTATUS
120bd8226afSVictor Perevertkin PartitionHandlePnp(
121bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
122bd8226afSVictor Perevertkin     _In_ PIRP Irp);
123bd8226afSVictor Perevertkin 
124bd8226afSVictor Perevertkin NTSTATUS
125bd8226afSVictor Perevertkin PartitionHandleDeviceControl(
126bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
127bd8226afSVictor Perevertkin     _In_ PIRP Irp);
128bd8226afSVictor Perevertkin 
129bd8226afSVictor Perevertkin NTSTATUS
130bd8226afSVictor Perevertkin NTAPI
131bd8226afSVictor Perevertkin ForwardIrpAndForget(
132bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
133bd8226afSVictor Perevertkin     _In_ PIRP Irp);
134bd8226afSVictor Perevertkin 
135bd8226afSVictor Perevertkin NTSTATUS
136bd8226afSVictor Perevertkin IssueSyncIoControlRequest(
137bd8226afSVictor Perevertkin     _In_ UINT32 IoControlCode,
138bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
139bd8226afSVictor Perevertkin     _In_ PVOID InputBuffer,
140bd8226afSVictor Perevertkin     _In_ ULONG InputBufferLength,
141bd8226afSVictor Perevertkin     _In_ PVOID OutputBuffer,
142bd8226afSVictor Perevertkin     _In_ ULONG OutputBufferLength,
143bd8226afSVictor Perevertkin     _In_ BOOLEAN InternalDeviceIoControl);
144bd8226afSVictor Perevertkin 
1456488440aSJérôme Gardou FORCEINLINE
146bd8226afSVictor Perevertkin BOOLEAN
147bd8226afSVictor Perevertkin VerifyIrpOutBufferSize(
148bd8226afSVictor Perevertkin     _In_ PIRP Irp,
149bd8226afSVictor Perevertkin     _In_ SIZE_T Size)
150bd8226afSVictor Perevertkin {
151bd8226afSVictor Perevertkin     PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
152bd8226afSVictor Perevertkin     if (ioStack->Parameters.DeviceIoControl.OutputBufferLength < Size)
153bd8226afSVictor Perevertkin     {
154bd8226afSVictor Perevertkin         Irp->IoStatus.Information = Size;
155bd8226afSVictor Perevertkin         return FALSE;
156bd8226afSVictor Perevertkin     }
157bd8226afSVictor Perevertkin     return TRUE;
158bd8226afSVictor Perevertkin }
159bd8226afSVictor Perevertkin 
1606488440aSJérôme Gardou FORCEINLINE
161bd8226afSVictor Perevertkin BOOLEAN
162bd8226afSVictor Perevertkin VerifyIrpInBufferSize(
163bd8226afSVictor Perevertkin     _In_ PIRP Irp,
164bd8226afSVictor Perevertkin     _In_ SIZE_T Size)
165bd8226afSVictor Perevertkin {
166bd8226afSVictor Perevertkin     PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
167bd8226afSVictor Perevertkin     if (ioStack->Parameters.DeviceIoControl.InputBufferLength < Size)
168bd8226afSVictor Perevertkin     {
169bd8226afSVictor Perevertkin         Irp->IoStatus.Information = Size;
170bd8226afSVictor Perevertkin         return FALSE;
171bd8226afSVictor Perevertkin     }
172bd8226afSVictor Perevertkin     return TRUE;
173bd8226afSVictor Perevertkin }
174bd8226afSVictor Perevertkin 
1756488440aSJérôme Gardou FORCEINLINE
176bd8226afSVictor Perevertkin VOID
177bd8226afSVictor Perevertkin PartMgrAcquireLayoutLock(
178bd8226afSVictor Perevertkin     _In_ PFDO_EXTENSION FDOExtension)
179bd8226afSVictor Perevertkin {
180bd8226afSVictor Perevertkin     PAGED_CODE();
181bd8226afSVictor Perevertkin 
182bd8226afSVictor Perevertkin     KeWaitForSingleObject(&FDOExtension->SyncEvent, Executive, KernelMode, FALSE, NULL);
183bd8226afSVictor Perevertkin }
184bd8226afSVictor Perevertkin 
1856488440aSJérôme Gardou FORCEINLINE
186bd8226afSVictor Perevertkin VOID
187bd8226afSVictor Perevertkin PartMgrReleaseLayoutLock(
188bd8226afSVictor Perevertkin     _In_ PFDO_EXTENSION FDOExtension)
189bd8226afSVictor Perevertkin {
190bd8226afSVictor Perevertkin     PAGED_CODE();
191bd8226afSVictor Perevertkin 
192bd8226afSVictor Perevertkin     KeSetEvent(&FDOExtension->SyncEvent, IO_NO_INCREMENT, FALSE);
193bd8226afSVictor Perevertkin }
194bd8226afSVictor Perevertkin 
195bd8226afSVictor Perevertkin #endif // _PARTMGR_H_
196