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