VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Driver
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2017-07-23 10:39:03 +0200
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2017-07-23 14:52:12 +0200
commit7cc2a3527dd27f49f617c4bfb915fd00098801ab (patch)
treef3300962aa30392a1a153d4f10dc2f9bb6e3006d /src/Driver
parent181244990641d5e7f61704a335cc29f73f22c814 (diff)
downloadVeraCrypt-7cc2a3527dd27f49f617c4bfb915fd00098801ab.tar.gz
VeraCrypt-7cc2a3527dd27f49f617c4bfb915fd00098801ab.zip
Windows Driver: make IOCTL_DISK_GET_DRIVE_GEOMETRY_EX support optional. Make disk size equal to partition size to avoid compatibility issues with existing software.
Diffstat (limited to 'src/Driver')
-rw-r--r--src/Driver/Ntdriver.c34
-rw-r--r--src/Driver/Ntvol.c3
2 files changed, 20 insertions, 17 deletions
diff --git a/src/Driver/Ntdriver.c b/src/Driver/Ntdriver.c
index f0c6e227..247af64e 100644
--- a/src/Driver/Ntdriver.c
+++ b/src/Driver/Ntdriver.c
@@ -731,21 +731,25 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX:
Dump ("ProcessVolumeDeviceControlIrp (IOCTL_DISK_GET_DRIVE_GEOMETRY_EX)\n");
- /* Return the drive geometry for the disk and its size.*/
- if (ValidateIOBufferSize (Irp, sizeof (DISK_GEOMETRY_EX), ValidateOutput))
+ Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
+ Irp->IoStatus.Information = 0;
+ if (EnableExtendedIoctlSupport)
{
- PDISK_GEOMETRY_EX outputBuffer = (PDISK_GEOMETRY_EX)
- Irp->AssociatedIrp.SystemBuffer;
+ /* Return the drive geometry for the disk and its size.*/
+ if (ValidateIOBufferSize (Irp, sizeof (DISK_GEOMETRY_EX), ValidateOutput))
+ {
+ PDISK_GEOMETRY_EX outputBuffer = (PDISK_GEOMETRY_EX)
+ Irp->AssociatedIrp.SystemBuffer;
- outputBuffer->Geometry.MediaType = Extension->bRemovable ? RemovableMedia : FixedMedia;
- outputBuffer->Geometry.Cylinders.QuadPart = Extension->NumberOfCylinders;
- outputBuffer->Geometry.TracksPerCylinder = Extension->TracksPerCylinder;
- outputBuffer->Geometry.SectorsPerTrack = Extension->SectorsPerTrack;
- outputBuffer->Geometry.BytesPerSector = Extension->BytesPerSector;
- /* add one sector to DiskLength since our partition size is DiskLength and its offset if BytesPerSector */
- outputBuffer->DiskSize.QuadPart = Extension->DiskLength + Extension->BytesPerSector;
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = sizeof (DISK_GEOMETRY_EX);
+ outputBuffer->Geometry.MediaType = Extension->bRemovable ? RemovableMedia : FixedMedia;
+ outputBuffer->Geometry.Cylinders.QuadPart = Extension->NumberOfCylinders;
+ outputBuffer->Geometry.TracksPerCylinder = Extension->TracksPerCylinder;
+ outputBuffer->Geometry.SectorsPerTrack = Extension->SectorsPerTrack;
+ outputBuffer->Geometry.BytesPerSector = Extension->BytesPerSector;
+ outputBuffer->DiskSize.QuadPart = Extension->DiskLength;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof (DISK_GEOMETRY_EX);
+ }
}
break;
@@ -1162,8 +1166,8 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
capacity->Version = sizeof (STORAGE_READ_CAPACITY);
capacity->Size = sizeof (STORAGE_READ_CAPACITY);
capacity->BlockLength = Extension->BytesPerSector;
- capacity->NumberOfBlocks.QuadPart = (Extension->DiskLength / Extension->BytesPerSector) + 1;
- capacity->DiskLength.QuadPart = Extension->DiskLength + Extension->BytesPerSector;
+ capacity->NumberOfBlocks.QuadPart = Extension->DiskLength / Extension->BytesPerSector;
+ capacity->DiskLength.QuadPart = Extension->DiskLength;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof (STORAGE_READ_CAPACITY);
diff --git a/src/Driver/Ntvol.c b/src/Driver/Ntvol.c
index 18dc9b5f..b9117571 100644
--- a/src/Driver/Ntvol.c
+++ b/src/Driver/Ntvol.c
@@ -704,8 +704,7 @@ NTSTATUS TCOpenVolume (PDEVICE_OBJECT DeviceObject,
Extension->TracksPerCylinder = 1;
Extension->SectorsPerTrack = 1;
Extension->BytesPerSector = Extension->cryptoInfo->SectorSize;
- // Add extra sector since our virtual partition starts at Extension->BytesPerSector and not 0
- Extension->NumberOfCylinders = (Extension->DiskLength / Extension->BytesPerSector) + 1;
+ Extension->NumberOfCylinders = Extension->DiskLength / Extension->BytesPerSector;
Extension->PartitionType = 0;
Extension->bRawDevice = bRawDevice;