Hackplemented support for IOCTL_DISK_GET_PARTITION_INFO_EX. It will work fine for MBR partitions but will fake returns for GPT partitions.

svn path=/trunk/; revision=49210
This commit is contained in:
Pierre Schweitzer 2010-10-19 19:27:28 +00:00
parent 6f48b81057
commit 60501a925e

View file

@ -2262,6 +2262,88 @@ Return Value:
break;
case IOCTL_DISK_GET_PARTITION_INFO_EX:
//
// Return the information about the partition specified by the device
// object. Note that no information is ever returned about the size
// or partition type of the physical disk, as this doesn't make any
// sense.
//
if (irpStack->Parameters.DeviceIoControl.OutputBufferLength <
sizeof(PARTITION_INFORMATION_EX)) {
status = STATUS_INFO_LENGTH_MISMATCH;
}
else if (diskData->PartitionNumber == 0) {
//
// Paritition zero is not a partition so this is not a
// reasonable request.
//
status = STATUS_INVALID_DEVICE_REQUEST;
}
else {
PPARTITION_INFORMATION_EX outputBuffer;
//
// Update the geometry in case it has changed.
//
status = UpdateRemovableGeometry (DeviceObject, Irp);
if (!NT_SUCCESS(status)) {
//
// Note the drive is not ready.
//
diskData->DriveNotReady = TRUE;
break;
}
//
// Note the drive is now ready.
//
diskData->DriveNotReady = FALSE;
if (diskData->PartitionType == 0 && (diskData->PartitionNumber > 0)) {
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
outputBuffer =
(PPARTITION_INFORMATION_EX)Irp->AssociatedIrp.SystemBuffer;
//
// FIXME: hack of the year, assume that partition is MBR
// Thing that can obviously be wrong...
//
outputBuffer->PartitionStyle = PARTITION_STYLE_MBR;
outputBuffer->Mbr.PartitionType = diskData->PartitionType;
outputBuffer->StartingOffset = deviceExtension->StartingOffset;
outputBuffer->PartitionLength.QuadPart = deviceExtension->PartitionLength.QuadPart;
outputBuffer->Mbr.HiddenSectors = diskData->HiddenSectors;
outputBuffer->PartitionNumber = diskData->PartitionNumber;
outputBuffer->Mbr.BootIndicator = diskData->BootIndicator;
outputBuffer->RewritePartition = FALSE;
outputBuffer->Mbr.RecognizedPartition =
IsRecognizedPartition(diskData->PartitionType);
status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX);
}
break;
case IOCTL_DISK_SET_PARTITION_INFO:
if (diskData->PartitionNumber == 0) {