diff --git a/src/dev.c b/src/dev.c index 4f1d7e1d..0e1183ae 100644 --- a/src/dev.c +++ b/src/dev.c @@ -418,9 +418,9 @@ BOOL GetOpticalMedia(IMG_SAVE* img_save) /* For debugging user reports of HDDs vs UFDs */ //#define FORCED_DEVICE #ifdef FORCED_DEVICE -#define FORCED_VID 0x05AC -#define FORCED_PID 0x8406 -#define FORCED_NAME "APPLE SD Card Reader USB Device" +#define FORCED_VID 0x6557 +#define FORCED_PID 0x0021 +#define FORCED_NAME "USB DISK 2.0 USB Device" #endif /* diff --git a/src/drive.c b/src/drive.c index 15190527..ad59e2e3 100644 --- a/src/drive.c +++ b/src/drive.c @@ -1,7 +1,7 @@ /* * Rufus: The Reliable USB Formatting Utility * Drive access function calls - * Copyright © 2011-2019 Pete Batard + * Copyright © 2011-2020 Pete Batard * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -797,11 +797,13 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT* { DWORD size; BOOL r = FALSE; - HANDLE hDrive = INVALID_HANDLE_VALUE; + HANDLE hDrive = INVALID_HANDLE_VALUE, hPhysical = INVALID_HANDLE_VALUE; UINT _drive_type; IO_STATUS_BLOCK io_status_block; FILE_FS_DEVICE_INFORMATION file_fs_device_info; - int i = 0, drive_number; + BYTE geometry[256] = { 0 }; + PDISK_GEOMETRY_EX DiskGeometry = (PDISK_GEOMETRY_EX)(void*)geometry; + int i = 0, drives_found = 0, drive_number; char *drive, drives[26*4 + 1]; /* "D:\", "E:\", etc., plus one NUL */ char logical_drive[] = "\\\\.\\#:"; @@ -831,7 +833,7 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT* } r = TRUE; // Required to detect drives that don't have volumes assigned - for (drive = drives ;*drive; drive += safe_strlen(drive)+1) { + for (drive = drives ;*drive; drive += safe_strlen(drive) + 1) { if (!isalpha(*drive)) continue; *drive = (char)toupper((int)*drive); @@ -865,6 +867,7 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT* safe_closehandle(hDrive); if (drive_number == DriveIndex) { r = TRUE; + drives_found++; if (drive_letters != NULL) drive_letters[i++] = *drive; // The drive type should be the same for all volumes, so we can overwrite @@ -873,6 +876,21 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT* } } + // Devices that don't have mounted partitions require special + // handling to determine if they are fixed or removable. + if ((drives_found == 0) && (drive_type != NULL)) { + hPhysical = GetPhysicalHandle(DriveIndex + DRIVE_INDEX_MIN, FALSE, FALSE, FALSE); + r = DeviceIoControl(hPhysical, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, + NULL, 0, geometry, sizeof(geometry), &size, NULL); + safe_closehandle(hPhysical); + if (r && size > 0) { + if (DiskGeometry->Geometry.MediaType == FixedMedia) + *drive_type = DRIVE_FIXED; + else if (DiskGeometry->Geometry.MediaType == RemovableMedia) + *drive_type = DRIVE_REMOVABLE; + } + } + out: if (drive_letters != NULL) drive_letters[i] = 0; diff --git a/src/hdd_vs_ufd.h b/src/hdd_vs_ufd.h index dff47ec3..d086efd6 100644 --- a/src/hdd_vs_ufd.h +++ b/src/hdd_vs_ufd.h @@ -1,7 +1,7 @@ /* * Rufus: The Reliable USB Formatting Utility * SMART HDD vs Flash detection - isHDD() tables - * Copyright © 2013-2019 Pete Batard + * Copyright © 2013-2020 Pete Batard * * Based in part on drivedb.h from Smartmontools: * http://svn.code.sf.net/p/smartmontools/code/trunk/smartmontools/drivedb.h @@ -261,6 +261,8 @@ static vidpid_score_t vidpid_score[] = { { 0x05ac, 0x8405, -20}, { 0x05ac, 0x8406, -20}, { 0x05ac, 0x8407, -20}, + // No idea who these guys are. They don't exist in usb.ids. + { 0x6557, 0x0021, -5}, // Prolific exceptions { 0x067b, 0x2506, -20 }, // 8 GB Micro Hard Drive { 0x067b, 0x2517, -20 }, // 1 GB UFD diff --git a/src/msapi_utf8.h b/src/msapi_utf8.h index 7d7c3d26..1f1f64fc 100644 --- a/src/msapi_utf8.h +++ b/src/msapi_utf8.h @@ -3,7 +3,7 @@ * Compensating for what Microsoft should have done a long long time ago. * Also see https://utf8everywhere.org * - * Copyright © 2010-2019 Pete Batard + * Copyright © 2010-2020 Pete Batard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -439,7 +439,7 @@ static __inline int ComboBox_GetLBTextU(HWND hCtrl, int index, char* lpString) size = (int)SendMessageW(hCtrl, CB_GETLBTEXTLEN, (WPARAM)index, (LPARAM)0); if (size < 0) return size; - wlpString = (wchar_t*)calloc(size+1, sizeof(wchar_t)); + wlpString = (wchar_t*)calloc((size_t)size + 1, sizeof(wchar_t)); size = (int)SendMessageW(hCtrl, CB_GETLBTEXT, (WPARAM)index, (LPARAM)wlpString); err = GetLastError(); if (size > 0) diff --git a/src/net.c b/src/net.c index ac685f80..5fec3644 100644 --- a/src/net.c +++ b/src/net.c @@ -865,7 +865,7 @@ BOOL CheckForUpdates(BOOL force) static DWORD WINAPI DownloadISOThread(LPVOID param) { char locale_str[1024], cmdline[sizeof(locale_str) + 512], pipe[MAX_GUID_STRING_LENGTH + 16] = "\\\\.\\pipe\\"; - char powershell_path[MAX_PATH], icon_path[MAX_PATH] = "", script_path[MAX_PATH] = ""; + char powershell_path[MAX_PATH], icon_path[MAX_PATH] = { 0 }, script_path[MAX_PATH] = { 0 }; char *url = NULL, sig_url[128]; uint64_t uncompressed_size; int64_t size = -1; diff --git a/src/rufus.rc b/src/rufus.rc index 15bce928..d2aaa871 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 232, 326 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_ACCEPTFILES -CAPTION "Rufus 3.10.1634" +CAPTION "Rufus 3.10.1635" FONT 9, "Segoe UI Symbol", 400, 0, 0x0 BEGIN LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP @@ -395,8 +395,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,10,1634,0 - PRODUCTVERSION 3,10,1634,0 + FILEVERSION 3,10,1635,0 + PRODUCTVERSION 3,10,1635,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -414,13 +414,13 @@ BEGIN VALUE "Comments", "https://rufus.ie" VALUE "CompanyName", "Akeo Consulting" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "3.10.1634" + VALUE "FileVersion", "3.10.1635" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" VALUE "OriginalFilename", "rufus-3.10.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "3.10.1634" + VALUE "ProductVersion", "3.10.1635" END END BLOCK "VarFileInfo" diff --git a/src/smart.c b/src/smart.c index 7384e888..d67411ba 100644 --- a/src/smart.c +++ b/src/smart.c @@ -1,11 +1,11 @@ /* * Rufus: The Reliable USB Formatting Utility * SMART HDD vs Flash detection (using ATA over USB, S.M.A.R.T., etc.) - * Copyright © 2013-2016 Pete Batard + * Copyright © 2013-2020 Pete Batard * * Based in part on scsiata.cpp from Smartmontools: http://smartmontools.sourceforge.net - * Copyright © 2006-12 Douglas Gilbert - * Copyright © 2009-13 Christian Franke + * Copyright © 2006-2012 Douglas Gilbert + * Copyright © 2009-2013 Christian Franke * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -446,7 +446,6 @@ int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid) uint64_t drive_size; // Boost the score if fixed, as these are *generally* HDDs - // NB: Due to a Windows API limitation, drives with no mounted partition will never have DRIVE_FIXED if (GetDriveTypeFromIndex(DriveIndex) == DRIVE_FIXED) score += 3;