From 9d1ee2400a64f14764edda1199828dd8467c62eb Mon Sep 17 00:00:00 2001 From: Bernhard Feichtinger <43303168+BieHDC@users.noreply.github.com> Date: Sat, 15 Sep 2018 23:08:30 +0200 Subject: [PATCH] [RAMDISK] Implement missing IOCTLs --- drivers/storage/class/ramdisk/ramdisk.c | 64 +++++++++++++++++++++---- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/drivers/storage/class/ramdisk/ramdisk.c b/drivers/storage/class/ramdisk/ramdisk.c index 0bef2ef2470..de6d2d5ca10 100644 --- a/drivers/storage/class/ramdisk/ramdisk.c +++ b/drivers/storage/class/ramdisk/ramdisk.c @@ -702,7 +702,7 @@ RamdiskCreateRamdisk(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Information = STATUS_SUCCESS; } - /* We're done */ + /* We are done */ return Status; } @@ -1025,7 +1025,7 @@ DoCopy: CurrentOffset.QuadPart += BytesRead; CurrentBase = (PVOID)((ULONG_PTR)CurrentBase + BytesRead); - /* Check if we're done */ + /* Check if we are done */ if (!BytesLeft) return Status; } } @@ -1195,7 +1195,7 @@ RamdiskDeviceControl(IN PDEVICE_OBJECT DeviceObject, DiskGeometry->MediaType = DriveExtension->DiskOptions.Fixed ? FixedMedia : RemovableMedia; - /* We're done */ + /* We are done */ Status = STATUS_SUCCESS; Information = sizeof(DISK_GEOMETRY); break; @@ -1225,7 +1225,7 @@ RamdiskDeviceControl(IN PDEVICE_OBJECT DeviceObject, Toc->TrackData[0].Control = TOC_DATA_TRACK; Toc->TrackData[0].TrackNumber = 1; - /* We're done */ + /* We are done */ Status = STATUS_SUCCESS; Information = RAMDISK_TOC_SIZE; break; @@ -1260,13 +1260,62 @@ RamdiskDeviceControl(IN PDEVICE_OBJECT DeviceObject, goto CallWorker; } - /* We're done */ + /* We are done */ Information = Irp->IoStatus.Information; break; } - case IOCTL_DISK_GET_DRIVE_LAYOUT: case IOCTL_DISK_GET_LENGTH_INFO: + { + PGET_LENGTH_INFORMATION LengthInformation = Irp->AssociatedIrp.SystemBuffer; + + /* Validate the length */ + if (IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GET_LENGTH_INFORMATION)) + { + /* Invalid length */ + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + /* Fill it out */ + LengthInformation->Length = DriveExtension->DiskLength; + + /* We are done */ + Status = STATUS_SUCCESS; + Information = sizeof(GET_LENGTH_INFORMATION); + break; + } + case IOCTL_VOLUME_GET_GPT_ATTRIBUTES: + { + PVOLUME_GET_GPT_ATTRIBUTES_INFORMATION GptInformation; + + /* Validate the length */ + if (IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength < sizeof(VOLUME_GET_GPT_ATTRIBUTES_INFORMATION)) + { + /* Invalid length */ + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + /* Fill it out */ + GptInformation = Irp->AssociatedIrp.SystemBuffer; + GptInformation->GptAttributes = 0; + + /* Translate the Attributes */ + if (DriveExtension->DiskOptions.Readonly) + GptInformation->GptAttributes |= GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY; + if (DriveExtension->DiskOptions.Hidden) + GptInformation->GptAttributes |= GPT_BASIC_DATA_ATTRIBUTE_HIDDEN; + if (DriveExtension->DiskOptions.NoDriveLetter) + GptInformation->GptAttributes |= GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER; + + /* We are done */ + Status = STATUS_SUCCESS; + Information = sizeof(VOLUME_GET_GPT_ATTRIBUTES_INFORMATION); + break; + } + + case IOCTL_DISK_GET_DRIVE_LAYOUT: case IOCTL_DISK_IS_WRITABLE: case IOCTL_SCSI_MINIPORT: case IOCTL_STORAGE_QUERY_PROPERTY: @@ -1274,7 +1323,6 @@ RamdiskDeviceControl(IN PDEVICE_OBJECT DeviceObject, case IOCTL_MOUNTDEV_QUERY_STABLE_GUID: case IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS: case IOCTL_VOLUME_SET_GPT_ATTRIBUTES: - case IOCTL_VOLUME_GET_GPT_ATTRIBUTES: case IOCTL_VOLUME_OFFLINE: { UNIMPLEMENTED_DBGBREAK("IOCTL: 0x%lx is UNIMPLEMENTED!\n", @@ -2456,7 +2504,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, Status = RamdiskAddDevice(DriverObject, PhysicalDeviceObject); if (NT_SUCCESS(Status)) { - /* We're done */ + /* We are done */ PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; Status = STATUS_SUCCESS; } -- 2.17.1