From 4c0500171e1e5690c35037993c901cf5cee74c16 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 1 Mar 2002 23:18:35 +0000 Subject: [PATCH] Implemented IOCTL_DISK_GET_PARTITION_INFO. Fixed bug in IOCTL_DISK_GET_DRIVE_GEOMETRY. svn path=/trunk/; revision=2660 --- reactos/drivers/storage/disk/disk.c | 69 +++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/storage/disk/disk.c b/reactos/drivers/storage/disk/disk.c index 425b68d07a9..ecc724a8477 100644 --- a/reactos/drivers/storage/disk/disk.c +++ b/reactos/drivers/storage/disk/disk.c @@ -1,4 +1,4 @@ -/* $Id: disk.c,v 1.5 2002/02/03 20:21:45 ekohl Exp $ +/* $Id: disk.c,v 1.6 2002/03/01 23:18:35 ekohl Exp $ * */ @@ -16,11 +16,14 @@ #define VERSION "V0.0.1" -typedef struct _DISK_DEVICE_EXTENSION +typedef struct _DISK_DATA { - ULONG Dummy; -} DISK_DEVICE_EXTENSION, *PDISK_DEVICE_EXTENSION; - + ULONG HiddenSectors; + ULONG PartitionNumber; + UCHAR PartitionType; + BOOLEAN BootIndicator; + BOOLEAN DriveNotReady; +} DISK_DATA, *PDISK_DATA; BOOLEAN STDCALL @@ -94,11 +97,11 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, sizeof(CLASS_INIT_DATA)); InitData.InitializationDataSize = sizeof(CLASS_INIT_DATA); - InitData.DeviceExtensionSize = sizeof(DEVICE_EXTENSION) + sizeof(DISK_DEVICE_EXTENSION); + InitData.DeviceExtensionSize = sizeof(DEVICE_EXTENSION) + sizeof(DISK_DATA); InitData.DeviceType = FILE_DEVICE_DISK; InitData.DeviceCharacteristics = 0; - InitData.ClassError = NULL; // DiskClassProcessError; + InitData.ClassError = NULL; // DiskClassProcessError; InitData.ClassReadWriteVerification = DiskClassCheckReadWrite; InitData.ClassFindDeviceCallBack = DiskClassCheckDevice; InitData.ClassFindDevices = DiskClassFindDevices; @@ -334,7 +337,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, PDRIVE_LAYOUT_INFORMATION PartitionList = NULL; HANDLE Handle; PPARTITION_INFORMATION PartitionEntry; - PDISK_DEVICE_EXTENSION DiskData; + PDISK_DATA DiskData; ULONG PartitionNumber; NTSTATUS Status; @@ -435,6 +438,10 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, DiskDeviceExtension->TargetId = InquiryData->TargetId; DiskDeviceExtension->Lun = InquiryData->Lun; + /* zero-out disk data */ + DiskData = (PDISK_DATA)(DiskDeviceExtension + 1); + RtlZeroMemory(DiskData, + sizeof(DISK_DATA)); /* Get disk geometry */ DiskDeviceExtension->DiskGeometry = ExAllocatePool(NonPagedPool, @@ -573,6 +580,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, PartitionDeviceExtension->LockCount = 0; PartitionDeviceExtension->DeviceNumber = DiskNumber; PartitionDeviceExtension->PortDeviceObject = PortDeviceObject; + PartitionDeviceExtension->DiskGeometry = DiskDeviceExtension->DiskGeometry; /* FIXME: Not yet! Will cause pointer corruption! */ // PartitionDeviceExtension->PortCapabilities = PortCapabilities; @@ -586,6 +594,13 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, PartitionDeviceExtension->TargetId = InquiryData->TargetId; PartitionDeviceExtension->Lun = InquiryData->Lun; + DiskData = (PDISK_DATA)(PartitionDeviceExtension + 1); + DiskData->PartitionType = PartitionEntry->PartitionType; + DiskData->PartitionNumber = PartitionNumber + 1; + DiskData->HiddenSectors = PartitionEntry->HiddenSectors; + DiskData->BootIndicator = PartitionEntry->BootIndicator; + DiskData->DriveNotReady = FALSE; + /* assign arc name */ RtlInitAnsiString(&DeviceNameA, @@ -614,7 +629,7 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, } else { - DPRINT1("ScsiClassCreateDeviceObject() failed (Status %x)\n", Status); + DPRINT1("ScsiClassCreateDeviceObject() failed to create partition device object (Status %x)\n", Status); break; } @@ -657,6 +672,7 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, PDEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpStack; ULONG ControlCode, InputLength, OutputLength; + PDISK_DATA DiskData; NTSTATUS Status; DPRINT1("DiskClassDeviceControl() called!\n"); @@ -667,11 +683,13 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength; OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength; DeviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; + DiskData = (PDISK_DATA)(DeviceExtension + 1); /* A huge switch statement in a Windows program?! who would have thought? */ switch (ControlCode) { case IOCTL_DISK_GET_DRIVE_GEOMETRY: + DPRINT1("IOCTL_DISK_GET_DRIVE_GEOMETRY\n"); if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY)) { Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; @@ -706,6 +724,39 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject, break; case IOCTL_DISK_GET_PARTITION_INFO: + DPRINT1("IOCTL_DISK_GET_PARTITION_INFO\n"); + if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < + sizeof(PARTITION_INFORMATION)) + { + Irp->IoStatus.Status = STATUS_INFO_LENGTH_MISMATCH; + Irp->IoStatus.Information = 0; + } + else if (DiskData->PartitionNumber == 0) + { + Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; + Irp->IoStatus.Information = 0; + } + else + { + PPARTITION_INFORMATION PartitionInfo; + + PartitionInfo = (PPARTITION_INFORMATION)Irp->AssociatedIrp.SystemBuffer; + + PartitionInfo->PartitionType = DiskData->PartitionType; + PartitionInfo->StartingOffset = DeviceExtension->StartingOffset; + PartitionInfo->PartitionLength = DeviceExtension->PartitionLength; + PartitionInfo->HiddenSectors = DiskData->HiddenSectors; + PartitionInfo->PartitionNumber = DiskData->PartitionNumber; + PartitionInfo->BootIndicator = DiskData->BootIndicator; + PartitionInfo->RewritePartition = FALSE; + PartitionInfo->RecognizedPartition = + IsRecognizedPartition(DiskData->PartitionType); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION); + } + break; + case IOCTL_DISK_SET_PARTITION_INFO: case IOCTL_DISK_GET_DRIVE_LAYOUT: case IOCTL_DISK_SET_DRIVE_LAYOUT: -- 2.17.1