mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[dev] improve FIXED vs REMOVABLE detection for drives with unmounted partitions
* And add an exception for a reported flash drive * Also fix a couple warnings in msapi_utf8.h and net.c
This commit is contained in:
parent
1e6e38b180
commit
2442aaf76f
7 changed files with 39 additions and 20 deletions
|
@ -418,9 +418,9 @@ BOOL GetOpticalMedia(IMG_SAVE* img_save)
|
||||||
/* For debugging user reports of HDDs vs UFDs */
|
/* For debugging user reports of HDDs vs UFDs */
|
||||||
//#define FORCED_DEVICE
|
//#define FORCED_DEVICE
|
||||||
#ifdef FORCED_DEVICE
|
#ifdef FORCED_DEVICE
|
||||||
#define FORCED_VID 0x05AC
|
#define FORCED_VID 0x6557
|
||||||
#define FORCED_PID 0x8406
|
#define FORCED_PID 0x0021
|
||||||
#define FORCED_NAME "APPLE SD Card Reader USB Device"
|
#define FORCED_NAME "USB DISK 2.0 USB Device"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
26
src/drive.c
26
src/drive.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Rufus: The Reliable USB Formatting Utility
|
* Rufus: The Reliable USB Formatting Utility
|
||||||
* Drive access function calls
|
* Drive access function calls
|
||||||
* Copyright © 2011-2019 Pete Batard <pete@akeo.ie>
|
* Copyright © 2011-2020 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* 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;
|
DWORD size;
|
||||||
BOOL r = FALSE;
|
BOOL r = FALSE;
|
||||||
HANDLE hDrive = INVALID_HANDLE_VALUE;
|
HANDLE hDrive = INVALID_HANDLE_VALUE, hPhysical = INVALID_HANDLE_VALUE;
|
||||||
UINT _drive_type;
|
UINT _drive_type;
|
||||||
IO_STATUS_BLOCK io_status_block;
|
IO_STATUS_BLOCK io_status_block;
|
||||||
FILE_FS_DEVICE_INFORMATION file_fs_device_info;
|
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 *drive, drives[26*4 + 1]; /* "D:\", "E:\", etc., plus one NUL */
|
||||||
char logical_drive[] = "\\\\.\\#:";
|
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
|
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))
|
if (!isalpha(*drive))
|
||||||
continue;
|
continue;
|
||||||
*drive = (char)toupper((int)*drive);
|
*drive = (char)toupper((int)*drive);
|
||||||
|
@ -865,6 +867,7 @@ static BOOL _GetDriveLettersAndType(DWORD DriveIndex, char* drive_letters, UINT*
|
||||||
safe_closehandle(hDrive);
|
safe_closehandle(hDrive);
|
||||||
if (drive_number == DriveIndex) {
|
if (drive_number == DriveIndex) {
|
||||||
r = TRUE;
|
r = TRUE;
|
||||||
|
drives_found++;
|
||||||
if (drive_letters != NULL)
|
if (drive_letters != NULL)
|
||||||
drive_letters[i++] = *drive;
|
drive_letters[i++] = *drive;
|
||||||
// The drive type should be the same for all volumes, so we can overwrite
|
// 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:
|
out:
|
||||||
if (drive_letters != NULL)
|
if (drive_letters != NULL)
|
||||||
drive_letters[i] = 0;
|
drive_letters[i] = 0;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Rufus: The Reliable USB Formatting Utility
|
* Rufus: The Reliable USB Formatting Utility
|
||||||
* SMART HDD vs Flash detection - isHDD() tables
|
* SMART HDD vs Flash detection - isHDD() tables
|
||||||
* Copyright © 2013-2019 Pete Batard <pete@akeo.ie>
|
* Copyright © 2013-2020 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* Based in part on drivedb.h from Smartmontools:
|
* Based in part on drivedb.h from Smartmontools:
|
||||||
* http://svn.code.sf.net/p/smartmontools/code/trunk/smartmontools/drivedb.h
|
* 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, 0x8405, -20},
|
||||||
{ 0x05ac, 0x8406, -20},
|
{ 0x05ac, 0x8406, -20},
|
||||||
{ 0x05ac, 0x8407, -20},
|
{ 0x05ac, 0x8407, -20},
|
||||||
|
// No idea who these guys are. They don't exist in usb.ids.
|
||||||
|
{ 0x6557, 0x0021, -5},
|
||||||
// Prolific exceptions
|
// Prolific exceptions
|
||||||
{ 0x067b, 0x2506, -20 }, // 8 GB Micro Hard Drive
|
{ 0x067b, 0x2506, -20 }, // 8 GB Micro Hard Drive
|
||||||
{ 0x067b, 0x2517, -20 }, // 1 GB UFD
|
{ 0x067b, 0x2517, -20 }, // 1 GB UFD
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* Compensating for what Microsoft should have done a long long time ago.
|
* Compensating for what Microsoft should have done a long long time ago.
|
||||||
* Also see https://utf8everywhere.org
|
* Also see https://utf8everywhere.org
|
||||||
*
|
*
|
||||||
* Copyright © 2010-2019 Pete Batard <pete@akeo.ie>
|
* Copyright © 2010-2020 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* 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);
|
size = (int)SendMessageW(hCtrl, CB_GETLBTEXTLEN, (WPARAM)index, (LPARAM)0);
|
||||||
if (size < 0)
|
if (size < 0)
|
||||||
return size;
|
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);
|
size = (int)SendMessageW(hCtrl, CB_GETLBTEXT, (WPARAM)index, (LPARAM)wlpString);
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
if (size > 0)
|
if (size > 0)
|
||||||
|
|
|
@ -865,7 +865,7 @@ BOOL CheckForUpdates(BOOL force)
|
||||||
static DWORD WINAPI DownloadISOThread(LPVOID param)
|
static DWORD WINAPI DownloadISOThread(LPVOID param)
|
||||||
{
|
{
|
||||||
char locale_str[1024], cmdline[sizeof(locale_str) + 512], pipe[MAX_GUID_STRING_LENGTH + 16] = "\\\\.\\pipe\\";
|
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];
|
char *url = NULL, sig_url[128];
|
||||||
uint64_t uncompressed_size;
|
uint64_t uncompressed_size;
|
||||||
int64_t size = -1;
|
int64_t size = -1;
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 3.10.1634"
|
CAPTION "Rufus 3.10.1635"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -395,8 +395,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,10,1634,0
|
FILEVERSION 3,10,1635,0
|
||||||
PRODUCTVERSION 3,10,1634,0
|
PRODUCTVERSION 3,10,1635,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -414,13 +414,13 @@ BEGIN
|
||||||
VALUE "Comments", "https://rufus.ie"
|
VALUE "Comments", "https://rufus.ie"
|
||||||
VALUE "CompanyName", "Akeo Consulting"
|
VALUE "CompanyName", "Akeo Consulting"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "3.10.1634"
|
VALUE "FileVersion", "3.10.1635"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
||||||
VALUE "OriginalFilename", "rufus-3.10.exe"
|
VALUE "OriginalFilename", "rufus-3.10.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.10.1634"
|
VALUE "ProductVersion", "3.10.1635"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
/*
|
/*
|
||||||
* Rufus: The Reliable USB Formatting Utility
|
* Rufus: The Reliable USB Formatting Utility
|
||||||
* SMART HDD vs Flash detection (using ATA over USB, S.M.A.R.T., etc.)
|
* SMART HDD vs Flash detection (using ATA over USB, S.M.A.R.T., etc.)
|
||||||
* Copyright © 2013-2016 Pete Batard <pete@akeo.ie>
|
* Copyright © 2013-2020 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* Based in part on scsiata.cpp from Smartmontools: http://smartmontools.sourceforge.net
|
* Based in part on scsiata.cpp from Smartmontools: http://smartmontools.sourceforge.net
|
||||||
* Copyright © 2006-12 Douglas Gilbert <dgilbert@interlog.com>
|
* Copyright © 2006-2012 Douglas Gilbert <dgilbert@interlog.com>
|
||||||
* Copyright © 2009-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright © 2009-2013 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* 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;
|
uint64_t drive_size;
|
||||||
|
|
||||||
// Boost the score if fixed, as these are *generally* HDDs
|
// 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)
|
if (GetDriveTypeFromIndex(DriveIndex) == DRIVE_FIXED)
|
||||||
score += 3;
|
score += 3;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue