mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows: handle case of some disk drivers not supporting IOCTL_DISK_GET_DRIVE_GEOMETRY_EX IOCTL.
This commit is contained in:
@@ -8771,6 +8771,33 @@ BOOL GetPhysicalDriveGeometry (int driveNumber, PDISK_GEOMETRY_EX diskGeometry)
|
|||||||
diskGeometry->DiskSize.QuadPart = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
diskGeometry->DiskSize.QuadPart = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
||||||
bResult = TRUE;
|
bResult = TRUE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DISK_GEOMETRY geo;
|
||||||
|
if ( DeviceIoControl (hDev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, (LPVOID) &geo, sizeof (geo), &bytesRead, NULL)
|
||||||
|
&& (bytesRead >= sizeof (DISK_GEOMETRY))
|
||||||
|
&& geo.BytesPerSector)
|
||||||
|
{
|
||||||
|
memcpy (&diskGeometry->Geometry, &geo, sizeof (DISK_GEOMETRY));
|
||||||
|
diskGeometry->DiskSize.QuadPart = geo.Cylinders.QuadPart * geo.SectorsPerTrack * geo.TracksPerCylinder * geo.BytesPerSector;
|
||||||
|
bResult = TRUE;
|
||||||
|
|
||||||
|
if (CurrentOSMajor >= 6)
|
||||||
|
{
|
||||||
|
STORAGE_READ_CAPACITY storage = {0};
|
||||||
|
|
||||||
|
storage.Version = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
storage.Size = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
if (DeviceIoControl (hDev, IOCTL_STORAGE_READ_CAPACITY, NULL, 0, (LPVOID) &storage, sizeof (storage), &bytesRead, NULL)
|
||||||
|
&& (bytesRead >= sizeof (storage))
|
||||||
|
&& (storage.Size == sizeof (STORAGE_READ_CAPACITY))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
diskGeometry->DiskSize.QuadPart = storage.DiskLength.QuadPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CloseHandle (hDev);
|
CloseHandle (hDev);
|
||||||
}
|
}
|
||||||
@@ -11173,8 +11200,28 @@ int OpenVolume (OpenVolumeContext *context, const wchar_t *volumePath, Password
|
|||||||
|
|
||||||
if (!DeviceIoControl (context->HostFileHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, dgBuffer, sizeof (dgBuffer), &dwResult, NULL))
|
if (!DeviceIoControl (context->HostFileHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, dgBuffer, sizeof (dgBuffer), &dwResult, NULL))
|
||||||
{
|
{
|
||||||
status = ERR_OS_ERROR;
|
DISK_GEOMETRY geo;
|
||||||
goto error;
|
if (DeviceIoControl (context->HostFileHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, (LPVOID) &geo, sizeof (geo), &dwResult, NULL))
|
||||||
|
{
|
||||||
|
((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart = geo.Cylinders.QuadPart * geo.SectorsPerTrack * geo.TracksPerCylinder * geo.BytesPerSector;
|
||||||
|
|
||||||
|
if (CurrentOSMajor >= 6)
|
||||||
|
{
|
||||||
|
STORAGE_READ_CAPACITY storage = {0};
|
||||||
|
|
||||||
|
storage.Version = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
storage.Size = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
if (DeviceIoControl (context->HostFileHandle, IOCTL_STORAGE_READ_CAPACITY, NULL, 0, (LPVOID) &storage, sizeof (storage), &dwResult, NULL))
|
||||||
|
{
|
||||||
|
((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart = storage.DiskLength.QuadPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status = ERR_OS_ERROR;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context->HostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
context->HostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
||||||
@@ -11368,7 +11415,8 @@ BOOL IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly)
|
|||||||
BYTE dgBuffer[256];
|
BYTE dgBuffer[256];
|
||||||
DWORD dwResult;
|
DWORD dwResult;
|
||||||
|
|
||||||
if (!DeviceIoControl (handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, dgBuffer, sizeof (dgBuffer), &dwResult, NULL))
|
if (!DeviceIoControl (handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, dgBuffer, sizeof (dgBuffer), &dwResult, NULL)
|
||||||
|
&& !DeviceIoControl (handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, dgBuffer, sizeof (dgBuffer), &dwResult, NULL))
|
||||||
{
|
{
|
||||||
CloseHandle (handle);
|
CloseHandle (handle);
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -244,7 +244,33 @@ int ChangePwd (const wchar_t *lpszVolume, Password *oldPassword, int old_pkcs5,
|
|||||||
dgBuffer, sizeof (dgBuffer), &dwResult, NULL);
|
dgBuffer, sizeof (dgBuffer), &dwResult, NULL);
|
||||||
|
|
||||||
if (!bResult)
|
if (!bResult)
|
||||||
goto error;
|
{
|
||||||
|
DISK_GEOMETRY geo;
|
||||||
|
if (DeviceIoControl (dev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, (LPVOID) &geo, sizeof (geo), &dwResult, NULL))
|
||||||
|
{
|
||||||
|
((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart = geo.Cylinders.QuadPart * geo.SectorsPerTrack * geo.TracksPerCylinder * geo.BytesPerSector;
|
||||||
|
|
||||||
|
if (CurrentOSMajor >= 6)
|
||||||
|
{
|
||||||
|
STORAGE_READ_CAPACITY storage = {0};
|
||||||
|
|
||||||
|
storage.Version = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
storage.Size = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
if (DeviceIoControl (dev, IOCTL_STORAGE_READ_CAPACITY, NULL, 0, (LPVOID) &storage, sizeof (storage), &bytesRead, NULL)
|
||||||
|
&& (bytesRead >= sizeof (storage))
|
||||||
|
&& (storage.Size == sizeof (STORAGE_READ_CAPACITY))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart = storage.DiskLength.QuadPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bResult = GetPartitionInfo (lpszVolume, &diskInfo);
|
bResult = GetPartitionInfo (lpszVolume, &diskInfo);
|
||||||
|
|
||||||
|
|||||||
@@ -565,11 +565,38 @@ static int ExpandVolume (HWND hwndDlg, wchar_t *lpszVolume, Password *pVolumePas
|
|||||||
dgBuffer, sizeof (dgBuffer), &dwResult, NULL);
|
dgBuffer, sizeof (dgBuffer), &dwResult, NULL);
|
||||||
|
|
||||||
if (!bResult)
|
if (!bResult)
|
||||||
goto error;
|
{
|
||||||
|
DISK_GEOMETRY geo;
|
||||||
|
if (DeviceIoControl (dev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, (LPVOID) &geo, sizeof (geo), &dwResult, NULL))
|
||||||
|
{
|
||||||
|
hostSize = geo.Cylinders.QuadPart * geo.SectorsPerTrack * geo.TracksPerCylinder * geo.BytesPerSector;
|
||||||
|
HostSectorSize = geo.BytesPerSector;
|
||||||
|
|
||||||
hostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
if (CurrentOSMajor >= 6)
|
||||||
|
{
|
||||||
|
STORAGE_READ_CAPACITY storage = {0};
|
||||||
|
|
||||||
HostSectorSize = ((PDISK_GEOMETRY_EX) dgBuffer)->Geometry.BytesPerSector;
|
storage.Version = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
storage.Size = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
if (DeviceIoControl (dev, IOCTL_STORAGE_READ_CAPACITY, NULL, 0, (LPVOID) &storage, sizeof (storage), &dwResult, NULL)
|
||||||
|
&& (dwResult >= sizeof (storage))
|
||||||
|
&& (storage.Size == sizeof (STORAGE_READ_CAPACITY))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
hostSize = storage.DiskLength.QuadPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
||||||
|
HostSectorSize = ((PDISK_GEOMETRY_EX) dgBuffer)->Geometry.BytesPerSector;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hostSize == 0)
|
if (hostSize == 0)
|
||||||
|
|||||||
@@ -10637,9 +10637,34 @@ int RestoreVolumeHeader (HWND hwndDlg, const wchar_t *lpszVolume)
|
|||||||
dgBuffer, sizeof (dgBuffer), &dwResult, NULL);
|
dgBuffer, sizeof (dgBuffer), &dwResult, NULL);
|
||||||
|
|
||||||
if (!bResult)
|
if (!bResult)
|
||||||
goto error;
|
{
|
||||||
|
DISK_GEOMETRY geo;
|
||||||
|
if (DeviceIoControl (dev, IOCTL_DISK_GET_DRIVE_GEOMETRY, NULL, 0, (LPVOID) &geo, sizeof (geo), &dwResult, NULL))
|
||||||
|
{
|
||||||
|
hostSize = geo.Cylinders.QuadPart * geo.SectorsPerTrack * geo.TracksPerCylinder * geo.BytesPerSector;
|
||||||
|
|
||||||
hostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
if (CurrentOSMajor >= 6)
|
||||||
|
{
|
||||||
|
STORAGE_READ_CAPACITY storage = {0};
|
||||||
|
|
||||||
|
storage.Version = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
storage.Size = sizeof (STORAGE_READ_CAPACITY);
|
||||||
|
if (DeviceIoControl (dev, IOCTL_STORAGE_READ_CAPACITY, NULL, 0, (LPVOID) &storage, sizeof (storage), &dwResult, NULL)
|
||||||
|
&& (dwResult >= sizeof (storage))
|
||||||
|
&& (storage.Size == sizeof (STORAGE_READ_CAPACITY))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
hostSize = storage.DiskLength.QuadPart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hostSize == 0)
|
if (hostSize == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user