diff options
author | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2017-07-23 10:39:03 +0200 |
---|---|---|
committer | Mounir IDRASSI <mounir.idrassi@idrix.fr> | 2017-07-23 14:52:12 +0200 |
commit | 7cc2a3527dd27f49f617c4bfb915fd00098801ab (patch) | |
tree | f3300962aa30392a1a153d4f10dc2f9bb6e3006d /src/Driver | |
parent | 181244990641d5e7f61704a335cc29f73f22c814 (diff) | |
download | VeraCrypt-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.c | 34 | ||||
-rw-r--r-- | src/Driver/Ntvol.c | 3 |
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; |