xref: /reactos/drivers/storage/partmgr/partmgr.h (revision 0a8b421d)
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 
76*0a8b421dSHermès Bélusca-Maïto     UINT32 VolumeNumber; // Volume number in the "\Device\HarddiskVolumeN" device name
77bd8226afSVictor Perevertkin     UINT32 DetectedNumber;
78bd8226afSVictor Perevertkin     UINT32 OnDiskNumber; // partition number for issuing Io requests to the kernel
79bd8226afSVictor Perevertkin     BOOLEAN IsEnumerated; // reported via IRP_MN_QUERY_DEVICE_RELATIONS
80bd8226afSVictor Perevertkin     BOOLEAN SymlinkCreated;
81bd8226afSVictor Perevertkin     BOOLEAN Attached; // attached to PartitionList of the FDO
82bd8226afSVictor Perevertkin     union
83bd8226afSVictor Perevertkin     {
84bd8226afSVictor Perevertkin         struct
85bd8226afSVictor Perevertkin         {
86bd8226afSVictor Perevertkin             GUID PartitionType;
87bd8226afSVictor Perevertkin             GUID PartitionId;
88bd8226afSVictor Perevertkin             UINT64 Attributes;
89bd8226afSVictor Perevertkin             WCHAR Name[36];
90bd8226afSVictor Perevertkin         } Gpt;
91bd8226afSVictor Perevertkin         struct
92bd8226afSVictor Perevertkin         {
93bd8226afSVictor Perevertkin             UINT8 PartitionType;
94bd8226afSVictor Perevertkin             BOOLEAN BootIndicator;
95bd8226afSVictor Perevertkin             BOOLEAN RecognizedPartition;
96bd8226afSVictor Perevertkin             UINT32 HiddenSectors;
97bd8226afSVictor Perevertkin         } Mbr;
98bd8226afSVictor Perevertkin     };
99bd8226afSVictor Perevertkin     UNICODE_STRING PartitionInterfaceName;
100bd8226afSVictor Perevertkin     UNICODE_STRING VolumeInterfaceName;
101bd8226afSVictor Perevertkin     UNICODE_STRING DeviceName;
102bd8226afSVictor Perevertkin } PARTITION_EXTENSION, *PPARTITION_EXTENSION;
103bd8226afSVictor Perevertkin 
1043adf4508SJérôme Gardou CODE_SEG("PAGE")
105bd8226afSVictor Perevertkin NTSTATUS
106bd8226afSVictor Perevertkin PartitionCreateDevice(
107bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT FDObject,
108bd8226afSVictor Perevertkin     _In_ PPARTITION_INFORMATION_EX PartitionEntry,
109bd8226afSVictor Perevertkin     _In_ UINT32 OnDiskNumber,
110bd8226afSVictor Perevertkin     _In_ PARTITION_STYLE PartitionStyle,
111bd8226afSVictor Perevertkin     _Out_ PDEVICE_OBJECT *PDO);
112bd8226afSVictor Perevertkin 
1133adf4508SJérôme Gardou CODE_SEG("PAGE")
114bd8226afSVictor Perevertkin NTSTATUS
115bd8226afSVictor Perevertkin PartitionHandleRemove(
116bd8226afSVictor Perevertkin     _In_ PPARTITION_EXTENSION PartExt,
117bd8226afSVictor Perevertkin     _In_ BOOLEAN FinalRemove);
118bd8226afSVictor Perevertkin 
1193adf4508SJérôme Gardou CODE_SEG("PAGE")
120bd8226afSVictor Perevertkin NTSTATUS
121bd8226afSVictor Perevertkin PartitionHandlePnp(
122bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
123bd8226afSVictor Perevertkin     _In_ PIRP Irp);
124bd8226afSVictor Perevertkin 
125bd8226afSVictor Perevertkin NTSTATUS
126bd8226afSVictor Perevertkin PartitionHandleDeviceControl(
127bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
128bd8226afSVictor Perevertkin     _In_ PIRP Irp);
129bd8226afSVictor Perevertkin 
130bd8226afSVictor Perevertkin NTSTATUS
131bd8226afSVictor Perevertkin NTAPI
132bd8226afSVictor Perevertkin ForwardIrpAndForget(
133bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
134bd8226afSVictor Perevertkin     _In_ PIRP Irp);
135bd8226afSVictor Perevertkin 
136bd8226afSVictor Perevertkin NTSTATUS
137bd8226afSVictor Perevertkin IssueSyncIoControlRequest(
138bd8226afSVictor Perevertkin     _In_ UINT32 IoControlCode,
139bd8226afSVictor Perevertkin     _In_ PDEVICE_OBJECT DeviceObject,
140bd8226afSVictor Perevertkin     _In_ PVOID InputBuffer,
141bd8226afSVictor Perevertkin     _In_ ULONG InputBufferLength,
142bd8226afSVictor Perevertkin     _In_ PVOID OutputBuffer,
143bd8226afSVictor Perevertkin     _In_ ULONG OutputBufferLength,
144bd8226afSVictor Perevertkin     _In_ BOOLEAN InternalDeviceIoControl);
145bd8226afSVictor Perevertkin 
1466488440aSJérôme Gardou FORCEINLINE
147bd8226afSVictor Perevertkin BOOLEAN
148bd8226afSVictor Perevertkin VerifyIrpOutBufferSize(
149bd8226afSVictor Perevertkin     _In_ PIRP Irp,
150bd8226afSVictor Perevertkin     _In_ SIZE_T Size)
151bd8226afSVictor Perevertkin {
152bd8226afSVictor Perevertkin     PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
153bd8226afSVictor Perevertkin     if (ioStack->Parameters.DeviceIoControl.OutputBufferLength < Size)
154bd8226afSVictor Perevertkin     {
155bd8226afSVictor Perevertkin         Irp->IoStatus.Information = Size;
156bd8226afSVictor Perevertkin         return FALSE;
157bd8226afSVictor Perevertkin     }
158bd8226afSVictor Perevertkin     return TRUE;
159bd8226afSVictor Perevertkin }
160bd8226afSVictor Perevertkin 
1616488440aSJérôme Gardou FORCEINLINE
162bd8226afSVictor Perevertkin BOOLEAN
163bd8226afSVictor Perevertkin VerifyIrpInBufferSize(
164bd8226afSVictor Perevertkin     _In_ PIRP Irp,
165bd8226afSVictor Perevertkin     _In_ SIZE_T Size)
166bd8226afSVictor Perevertkin {
167bd8226afSVictor Perevertkin     PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
168bd8226afSVictor Perevertkin     if (ioStack->Parameters.DeviceIoControl.InputBufferLength < Size)
169bd8226afSVictor Perevertkin     {
170bd8226afSVictor Perevertkin         Irp->IoStatus.Information = Size;
171bd8226afSVictor Perevertkin         return FALSE;
172bd8226afSVictor Perevertkin     }
173bd8226afSVictor Perevertkin     return TRUE;
174bd8226afSVictor Perevertkin }
175bd8226afSVictor Perevertkin 
1766488440aSJérôme Gardou FORCEINLINE
177bd8226afSVictor Perevertkin VOID
178bd8226afSVictor Perevertkin PartMgrAcquireLayoutLock(
179bd8226afSVictor Perevertkin     _In_ PFDO_EXTENSION FDOExtension)
180bd8226afSVictor Perevertkin {
181bd8226afSVictor Perevertkin     PAGED_CODE();
182bd8226afSVictor Perevertkin 
183bd8226afSVictor Perevertkin     KeWaitForSingleObject(&FDOExtension->SyncEvent, Executive, KernelMode, FALSE, NULL);
184bd8226afSVictor Perevertkin }
185bd8226afSVictor Perevertkin 
1866488440aSJérôme Gardou FORCEINLINE
187bd8226afSVictor Perevertkin VOID
188bd8226afSVictor Perevertkin PartMgrReleaseLayoutLock(
189bd8226afSVictor Perevertkin     _In_ PFDO_EXTENSION FDOExtension)
190bd8226afSVictor Perevertkin {
191bd8226afSVictor Perevertkin     PAGED_CODE();
192bd8226afSVictor Perevertkin 
193bd8226afSVictor Perevertkin     KeSetEvent(&FDOExtension->SyncEvent, IO_NO_INCREMENT, FALSE);
194bd8226afSVictor Perevertkin }
195bd8226afSVictor Perevertkin 
196bd8226afSVictor Perevertkin #endif // _PARTMGR_H_
197