mirror of
https://github.com/veracrypt/VeraCrypt
synced 2024-11-10 05:03:33 +01:00
Windows: Fix failure to format some disks (e.g. VHDX) caused by partition offset not 4K aligned
Now we set offset to 1MB which is a typical values used for MBR disks. We also use a more standard way to calculate legacy number of cylinders
This commit is contained in:
parent
e70aa13c5b
commit
1688779bc3
@ -1033,8 +1033,8 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
outputBuffer->Geometry.TracksPerCylinder = Extension->TracksPerCylinder;
|
outputBuffer->Geometry.TracksPerCylinder = Extension->TracksPerCylinder;
|
||||||
outputBuffer->Geometry.SectorsPerTrack = Extension->SectorsPerTrack;
|
outputBuffer->Geometry.SectorsPerTrack = Extension->SectorsPerTrack;
|
||||||
outputBuffer->Geometry.BytesPerSector = Extension->BytesPerSector;
|
outputBuffer->Geometry.BytesPerSector = Extension->BytesPerSector;
|
||||||
/* add one sector to DiskLength since our partition size is DiskLength and its offset if BytesPerSector */
|
// Add 1MB to the disk size to emulate the geometry of a real MBR disk
|
||||||
outputBuffer->DiskSize.QuadPart = Extension->DiskLength + Extension->BytesPerSector;
|
outputBuffer->DiskSize.QuadPart = Extension->DiskLength + BYTES_PER_MB;
|
||||||
|
|
||||||
if (bFullBuffer)
|
if (bFullBuffer)
|
||||||
{
|
{
|
||||||
@ -1305,7 +1305,7 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
outputBuffer->BootIndicator = FALSE;
|
outputBuffer->BootIndicator = FALSE;
|
||||||
outputBuffer->RecognizedPartition = TRUE;
|
outputBuffer->RecognizedPartition = TRUE;
|
||||||
outputBuffer->RewritePartition = FALSE;
|
outputBuffer->RewritePartition = FALSE;
|
||||||
outputBuffer->StartingOffset.QuadPart = Extension->BytesPerSector;
|
outputBuffer->StartingOffset.QuadPart = BYTES_PER_MB; // Set offset to 1MB to emulate the partition offset on a real MBR disk
|
||||||
outputBuffer->PartitionLength.QuadPart= Extension->DiskLength;
|
outputBuffer->PartitionLength.QuadPart= Extension->DiskLength;
|
||||||
outputBuffer->PartitionNumber = 1;
|
outputBuffer->PartitionNumber = 1;
|
||||||
outputBuffer->HiddenSectors = 0;
|
outputBuffer->HiddenSectors = 0;
|
||||||
@ -1322,7 +1322,7 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
|
|
||||||
outputBuffer->PartitionStyle = PARTITION_STYLE_MBR;
|
outputBuffer->PartitionStyle = PARTITION_STYLE_MBR;
|
||||||
outputBuffer->RewritePartition = FALSE;
|
outputBuffer->RewritePartition = FALSE;
|
||||||
outputBuffer->StartingOffset.QuadPart = Extension->BytesPerSector;
|
outputBuffer->StartingOffset.QuadPart = BYTES_PER_MB; // Set offset to 1MB to emulate the partition offset on a real MBR disk
|
||||||
outputBuffer->PartitionLength.QuadPart= Extension->DiskLength;
|
outputBuffer->PartitionLength.QuadPart= Extension->DiskLength;
|
||||||
outputBuffer->PartitionNumber = 1;
|
outputBuffer->PartitionNumber = 1;
|
||||||
outputBuffer->Mbr.PartitionType = Extension->PartitionType;
|
outputBuffer->Mbr.PartitionType = Extension->PartitionType;
|
||||||
@ -1350,7 +1350,7 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
outputBuffer->PartitionEntry->BootIndicator = FALSE;
|
outputBuffer->PartitionEntry->BootIndicator = FALSE;
|
||||||
outputBuffer->PartitionEntry->RecognizedPartition = TRUE;
|
outputBuffer->PartitionEntry->RecognizedPartition = TRUE;
|
||||||
outputBuffer->PartitionEntry->RewritePartition = FALSE;
|
outputBuffer->PartitionEntry->RewritePartition = FALSE;
|
||||||
outputBuffer->PartitionEntry->StartingOffset.QuadPart = Extension->BytesPerSector;
|
outputBuffer->PartitionEntry->StartingOffset.QuadPart = BYTES_PER_MB; // Set offset to 1MB to emulate the partition offset on a real MBR disk
|
||||||
outputBuffer->PartitionEntry->PartitionLength.QuadPart = Extension->DiskLength;
|
outputBuffer->PartitionEntry->PartitionLength.QuadPart = Extension->DiskLength;
|
||||||
outputBuffer->PartitionEntry->PartitionNumber = 1;
|
outputBuffer->PartitionEntry->PartitionNumber = 1;
|
||||||
outputBuffer->PartitionEntry->HiddenSectors = 0;
|
outputBuffer->PartitionEntry->HiddenSectors = 0;
|
||||||
@ -1386,7 +1386,7 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
outputBuffer->PartitionEntry->Mbr.BootIndicator = FALSE;
|
outputBuffer->PartitionEntry->Mbr.BootIndicator = FALSE;
|
||||||
outputBuffer->PartitionEntry->Mbr.RecognizedPartition = TRUE;
|
outputBuffer->PartitionEntry->Mbr.RecognizedPartition = TRUE;
|
||||||
outputBuffer->PartitionEntry->RewritePartition = FALSE;
|
outputBuffer->PartitionEntry->RewritePartition = FALSE;
|
||||||
outputBuffer->PartitionEntry->StartingOffset.QuadPart = Extension->BytesPerSector;
|
outputBuffer->PartitionEntry->StartingOffset.QuadPart = BYTES_PER_MB; // Set offset to 1MB to emulate the partition offset on a real MBR disk
|
||||||
outputBuffer->PartitionEntry->PartitionLength.QuadPart = Extension->DiskLength;
|
outputBuffer->PartitionEntry->PartitionLength.QuadPart = Extension->DiskLength;
|
||||||
outputBuffer->PartitionEntry->PartitionNumber = 1;
|
outputBuffer->PartitionEntry->PartitionNumber = 1;
|
||||||
outputBuffer->PartitionEntry->Mbr.HiddenSectors = 0;
|
outputBuffer->PartitionEntry->Mbr.HiddenSectors = 0;
|
||||||
@ -1547,7 +1547,7 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
// of the underlaying physical disk and we report a single extent
|
// of the underlaying physical disk and we report a single extent
|
||||||
extents->NumberOfDiskExtents = 1;
|
extents->NumberOfDiskExtents = 1;
|
||||||
extents->Extents[0].DiskNumber = Extension->DeviceNumber;
|
extents->Extents[0].DiskNumber = Extension->DeviceNumber;
|
||||||
extents->Extents[0].StartingOffset.QuadPart = Extension->BytesPerSector;
|
extents->Extents[0].StartingOffset.QuadPart = BYTES_PER_MB; // Set offset to 1MB to emulate the partition offset on a real MBR disk
|
||||||
extents->Extents[0].ExtentLength.QuadPart = Extension->DiskLength;
|
extents->Extents[0].ExtentLength.QuadPart = Extension->DiskLength;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1575,8 +1575,8 @@ NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION
|
|||||||
capacity->Version = sizeof (STORAGE_READ_CAPACITY);
|
capacity->Version = sizeof (STORAGE_READ_CAPACITY);
|
||||||
capacity->Size = sizeof (STORAGE_READ_CAPACITY);
|
capacity->Size = sizeof (STORAGE_READ_CAPACITY);
|
||||||
capacity->BlockLength = Extension->BytesPerSector;
|
capacity->BlockLength = Extension->BytesPerSector;
|
||||||
capacity->NumberOfBlocks.QuadPart = (Extension->DiskLength / Extension->BytesPerSector) + 1;
|
capacity->DiskLength.QuadPart = Extension->DiskLength + BYTES_PER_MB; // Add 1MB to the disk size to emulate the geometry of a real MBR disk
|
||||||
capacity->DiskLength.QuadPart = Extension->DiskLength + Extension->BytesPerSector;
|
capacity->NumberOfBlocks.QuadPart = capacity->DiskLength.QuadPart / capacity->BlockLength;
|
||||||
|
|
||||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
Irp->IoStatus.Information = sizeof (STORAGE_READ_CAPACITY);
|
Irp->IoStatus.Information = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
@ -798,8 +798,7 @@ NTSTATUS TCOpenVolume (PDEVICE_OBJECT DeviceObject,
|
|||||||
Extension->TracksPerCylinder = 1;
|
Extension->TracksPerCylinder = 1;
|
||||||
Extension->SectorsPerTrack = 1;
|
Extension->SectorsPerTrack = 1;
|
||||||
Extension->BytesPerSector = Extension->cryptoInfo->SectorSize;
|
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;
|
||||||
Extension->NumberOfCylinders = (Extension->DiskLength / Extension->BytesPerSector) + 1;
|
|
||||||
Extension->PartitionType = 0;
|
Extension->PartitionType = 0;
|
||||||
|
|
||||||
Extension->bRawDevice = bRawDevice;
|
Extension->bRawDevice = bRawDevice;
|
||||||
|
Loading…
Reference in New Issue
Block a user