From 95748751dfcfce1a885dfa4974ca3761ed0f7dbb Mon Sep 17 00:00:00 2001 From: Mounir IDRASSI Date: Sat, 1 Sep 2018 00:28:27 +0200 Subject: Windows: handle case of some disk drivers not supporting IOCTL_DISK_GET_DRIVE_GEOMETRY_EX IOCTL. --- src/ExpandVolume/ExpandVolume.c | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'src/ExpandVolume') diff --git a/src/ExpandVolume/ExpandVolume.c b/src/ExpandVolume/ExpandVolume.c index 9e9252c3..0a9733a4 100644 --- a/src/ExpandVolume/ExpandVolume.c +++ b/src/ExpandVolume/ExpandVolume.c @@ -565,11 +565,38 @@ static int ExpandVolume (HWND hwndDlg, wchar_t *lpszVolume, Password *pVolumePas dgBuffer, sizeof (dgBuffer), &dwResult, NULL); if (!bResult) - goto error; - - hostSize = ((PDISK_GEOMETRY_EX) dgBuffer)->DiskSize.QuadPart; - - HostSectorSize = ((PDISK_GEOMETRY_EX) dgBuffer)->Geometry.BytesPerSector; + { + 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; + + 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; + HostSectorSize = ((PDISK_GEOMETRY_EX) dgBuffer)->Geometry.BytesPerSector; + } } if (hostSize == 0) -- cgit v1.2.3