mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[ui] list drives by increasing order of size
* Also silence MSVC and MinGW obnoxious warnings about bidirectional Unicode characters.
This commit is contained in:
parent
1dcfd69dee
commit
c76327f96e
8 changed files with 112 additions and 66 deletions
|
@ -128,7 +128,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -154,7 +154,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
|
@ -181,7 +181,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
|
@ -212,7 +212,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -238,7 +238,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
|
@ -266,7 +266,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
|
@ -296,7 +296,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
|
@ -329,7 +329,7 @@
|
||||||
<CompileAs>CompileAsC</CompileAs>
|
<CompileAs>CompileAsC</CompileAs>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<ExceptionHandling>false</ExceptionHandling>
|
<ExceptionHandling>false</ExceptionHandling>
|
||||||
<DisableSpecificWarnings>4091;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
<DisableSpecificWarnings>4091;5255;28251;28252;28253;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||||
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
<UndefinePreprocessorDefinitions>NDEBUG</UndefinePreprocessorDefinitions>
|
||||||
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/utf-8 $(ExternalCompilerOptions) %(AdditionalOptions)</AdditionalOptions>
|
||||||
<StringPooling>true</StringPooling>
|
<StringPooling>true</StringPooling>
|
||||||
|
|
2
configure
vendored
2
configure
vendored
|
@ -4726,7 +4726,7 @@ fi
|
||||||
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
|
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
|
||||||
CFLAGS="${saved_CFLAGS}"
|
CFLAGS="${saved_CFLAGS}"
|
||||||
|
|
||||||
AM_CFLAGS="$AM_CFLAGS -DUNICODE -D_UNICODE -UNDEBUG -DCOBJMACROS -D__USE_MINGW_ANSI_STDIO=0 -std=gnu99 -Wshadow -Wall -Wformat-security -Wundef -Wunused -Wstrict-prototypes -Wno-restrict -Werror-implicit-function-declaration $nopointersign_cflags"
|
AM_CFLAGS="$AM_CFLAGS -DUNICODE -D_UNICODE -UNDEBUG -DCOBJMACROS -D__USE_MINGW_ANSI_STDIO=0 -std=gnu99 -Wshadow -Wall -Wformat-security -Wundef -Wunused -Wstrict-prototypes -Wno-restrict -Werror-implicit-function-declaration -Wbidi-chars=none $nopointersign_cflags"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
|
||||||
[nopointersign_cflags="-Wno-pointer-sign"], [nopointersign_cflags=""])
|
[nopointersign_cflags="-Wno-pointer-sign"], [nopointersign_cflags=""])
|
||||||
CFLAGS="${saved_CFLAGS}"
|
CFLAGS="${saved_CFLAGS}"
|
||||||
|
|
||||||
AM_CFLAGS="$AM_CFLAGS -DUNICODE -D_UNICODE -UNDEBUG -DCOBJMACROS -D__USE_MINGW_ANSI_STDIO=0 -std=gnu99 -Wshadow -Wall -Wformat-security -Wundef -Wunused -Wstrict-prototypes -Wno-restrict -Werror-implicit-function-declaration $nopointersign_cflags"
|
AM_CFLAGS="$AM_CFLAGS -DUNICODE -D_UNICODE -UNDEBUG -DCOBJMACROS -D__USE_MINGW_ANSI_STDIO=0 -std=gnu99 -Wshadow -Wall -Wformat-security -Wundef -Wunused -Wstrict-prototypes -Wno-restrict -Werror-implicit-function-declaration -Wbidi-chars=none $nopointersign_cflags"
|
||||||
|
|
||||||
AC_SUBST([VISIBILITY_CFLAGS])
|
AC_SUBST([VISIBILITY_CFLAGS])
|
||||||
AC_SUBST([AM_CFLAGS])
|
AC_SUBST([AM_CFLAGS])
|
||||||
|
|
104
src/dev.c
104
src/dev.c
|
@ -44,8 +44,7 @@
|
||||||
#include "drive.h"
|
#include "drive.h"
|
||||||
#include "dev.h"
|
#include "dev.h"
|
||||||
|
|
||||||
extern StrArray DriveId, DriveName, DriveLabel, DriveHub;
|
extern RUFUS_DRIVE rufus_drive[MAX_DRIVES];
|
||||||
extern uint32_t DrivePort[MAX_DRIVES];
|
|
||||||
extern BOOL enable_HDDs, enable_VHDs, use_fake_units, enable_vmdk, usb_debug;
|
extern BOOL enable_HDDs, enable_VHDs, use_fake_units, enable_vmdk, usb_debug;
|
||||||
extern BOOL list_non_usb_removable_drives, its_a_me_mario;
|
extern BOOL list_non_usb_removable_drives, its_a_me_mario;
|
||||||
|
|
||||||
|
@ -139,29 +138,30 @@ BOOL CyclePort(int index)
|
||||||
DWORD size;
|
DWORD size;
|
||||||
USB_CYCLE_PORT_PARAMS cycle_port;
|
USB_CYCLE_PORT_PARAMS cycle_port;
|
||||||
|
|
||||||
|
assert(index < MAX_DRIVES);
|
||||||
// Wait at least 10 secs between resets
|
// Wait at least 10 secs between resets
|
||||||
if (GetTickCount64() < LastReset + 10000ULL) {
|
if (GetTickCount64() < LastReset + 10000ULL) {
|
||||||
uprintf("You must wait at least 10 seconds before trying to reset a device");
|
uprintf("You must wait at least 10 seconds before trying to reset a device");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DriveHub.String[index] == NULL) {
|
if (rufus_drive[index].hub == NULL) {
|
||||||
uprintf("The device you are trying to reset does not appear to be a USB device...");
|
uprintf("The device you are trying to reset does not appear to be a USB device...");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
LastReset = GetTickCount64();
|
LastReset = GetTickCount64();
|
||||||
|
|
||||||
handle = CreateFileA(DriveHub.String[index], GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
handle = CreateFileA(rufus_drive[index].hub, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
|
||||||
if (handle == INVALID_HANDLE_VALUE) {
|
if (handle == INVALID_HANDLE_VALUE) {
|
||||||
uprintf("Could not open %s: %s", DriveHub.String[index], WindowsErrorString());
|
uprintf("Could not open %s: %s", rufus_drive[index].hub, WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
size = sizeof(cycle_port);
|
size = sizeof(cycle_port);
|
||||||
memset(&cycle_port, 0, size);
|
memset(&cycle_port, 0, size);
|
||||||
cycle_port.ConnectionIndex = DrivePort[index];
|
cycle_port.ConnectionIndex = rufus_drive[index].port;
|
||||||
uprintf("Cycling port %d (reset) on %s", DrivePort[index], DriveHub.String[index]);
|
uprintf("Cycling port %d (reset) on %s", rufus_drive[index].port, rufus_drive[index].hub);
|
||||||
// As per https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/usbioctl/ni-usbioctl-ioctl_usb_hub_cycle_port
|
// As per https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/usbioctl/ni-usbioctl-ioctl_usb_hub_cycle_port
|
||||||
// IOCTL_USB_HUB_CYCLE_PORT is not supported on Windows 7, Windows Vista, and Windows Server 2008
|
// IOCTL_USB_HUB_CYCLE_PORT is not supported on Windows 7, Windows Vista, and Windows Server 2008
|
||||||
if (!DeviceIoControl(handle, IOCTL_USB_HUB_CYCLE_PORT, &cycle_port, size, &cycle_port, size, &size, NULL)) {
|
if (!DeviceIoControl(handle, IOCTL_USB_HUB_CYCLE_PORT, &cycle_port, size, &cycle_port, size, &size, NULL)) {
|
||||||
|
@ -191,7 +191,8 @@ int CycleDevice(int index)
|
||||||
SP_DEVINFO_DATA dev_info_data;
|
SP_DEVINFO_DATA dev_info_data;
|
||||||
SP_PROPCHANGE_PARAMS propchange_params;
|
SP_PROPCHANGE_PARAMS propchange_params;
|
||||||
|
|
||||||
if ((index < 0) || (safe_strlen(DriveId.String[index]) < 8))
|
assert(index < MAX_DRIVES);
|
||||||
|
if ((index < 0) || (safe_strlen(rufus_drive[index].id) < 8))
|
||||||
return ERROR_INVALID_PARAMETER;
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
// Need DIGCF_ALLCLASSES else disabled devices won't be listed.
|
// Need DIGCF_ALLCLASSES else disabled devices won't be listed.
|
||||||
|
@ -210,7 +211,7 @@ int CycleDevice(int index)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (safe_strcmp(DriveId.String[index], device_instance_id) != 0)
|
if (safe_strcmp(rufus_drive[index].id, device_instance_id) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
|
@ -421,6 +422,19 @@ BOOL GetOpticalMedia(IMG_SAVE* img_save)
|
||||||
#define FORCED_NAME "VendorCo Disk USB Device"
|
#define FORCED_NAME "VendorCo Disk USB Device"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void ClearDrives(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < MAX_DRIVES && rufus_drive[i].size != 0; i++) {
|
||||||
|
free(rufus_drive[i].id);
|
||||||
|
free(rufus_drive[i].name);
|
||||||
|
free(rufus_drive[i].display_name);
|
||||||
|
free(rufus_drive[i].label);
|
||||||
|
free(rufus_drive[i].hub);
|
||||||
|
}
|
||||||
|
memset(rufus_drive, 0, sizeof(rufus_drive));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Refresh the list of USB devices
|
* Refresh the list of USB devices
|
||||||
*/
|
*/
|
||||||
|
@ -474,16 +488,13 @@ BOOL GetDevices(DWORD devnum)
|
||||||
ULONG list_size[ARRAYSIZE(usbstor_name)] = { 0 }, list_start[ARRAYSIZE(usbstor_name)] = { 0 }, full_list_size, ulFlags;
|
ULONG list_size[ARRAYSIZE(usbstor_name)] = { 0 }, list_start[ARRAYSIZE(usbstor_name)] = { 0 }, full_list_size, ulFlags;
|
||||||
HANDLE hDrive;
|
HANDLE hDrive;
|
||||||
LONG maxwidth = 0;
|
LONG maxwidth = 0;
|
||||||
int s, score, drive_number, remove_drive;
|
int s, u, v, score, drive_number, remove_drive, num_drives = 0;
|
||||||
char drive_letters[27], *device_id, *devid_list = NULL, entry_msg[128];
|
char drive_letters[27], *device_id, *devid_list = NULL, display_msg[128];
|
||||||
char *p, *label, *entry, buffer[MAX_PATH], str[MAX_PATH], device_instance_id[MAX_PATH], *method_str, *hub_path;
|
char *p, *label, *display_name, buffer[MAX_PATH], str[MAX_PATH], device_instance_id[MAX_PATH], *method_str, *hub_path;
|
||||||
usb_device_props props;
|
usb_device_props props;
|
||||||
|
|
||||||
IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList));
|
IGNORE_RETVAL(ComboBox_ResetContent(hDeviceList));
|
||||||
StrArrayClear(&DriveId);
|
ClearDrives();
|
||||||
StrArrayClear(&DriveName);
|
|
||||||
StrArrayClear(&DriveLabel);
|
|
||||||
StrArrayClear(&DriveHub);
|
|
||||||
StrArrayCreate(&dev_if_path, 128);
|
StrArrayCreate(&dev_if_path, 128);
|
||||||
// Add a dummy for string index zero, as this is what non matching hashes will point to
|
// Add a dummy for string index zero, as this is what non matching hashes will point to
|
||||||
StrArrayAdd(&dev_if_path, "", TRUE);
|
StrArrayAdd(&dev_if_path, "", TRUE);
|
||||||
|
@ -601,7 +612,7 @@ BOOL GetDevices(DWORD devnum)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
dev_info_data.cbSize = sizeof(dev_info_data);
|
dev_info_data.cbSize = sizeof(dev_info_data);
|
||||||
for (i=0; SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
|
for (i = 0; num_drives < MAX_DRIVES && SetupDiEnumDeviceInfo(dev_info, i, &dev_info_data); i++) {
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
memset(&props, 0, sizeof(props));
|
memset(&props, 0, sizeof(props));
|
||||||
method_str = "";
|
method_str = "";
|
||||||
|
@ -907,7 +918,7 @@ BOOL GetDevices(DWORD devnum)
|
||||||
|
|
||||||
// The empty string is returned for drives that don't have any volumes assigned
|
// The empty string is returned for drives that don't have any volumes assigned
|
||||||
if (drive_letters[0] == 0) {
|
if (drive_letters[0] == 0) {
|
||||||
entry = lmprintf(MSG_046, label, drive_number,
|
display_name = lmprintf(MSG_046, label, drive_number,
|
||||||
SizeToHumanReadable(GetDriveSize(drive_index), FALSE, use_fake_units));
|
SizeToHumanReadable(GetDriveSize(drive_index), FALSE, use_fake_units));
|
||||||
} else {
|
} else {
|
||||||
// Find the UEFI:TOGO partition(s) (and eliminate them form our listing)
|
// Find the UEFI:TOGO partition(s) (and eliminate them form our listing)
|
||||||
|
@ -921,14 +932,14 @@ BOOL GetDevices(DWORD devnum)
|
||||||
}
|
}
|
||||||
// We have multiple volumes assigned to the same device (multiple partitions)
|
// We have multiple volumes assigned to the same device (multiple partitions)
|
||||||
// If that is the case, use "Multiple Volumes" instead of the label
|
// If that is the case, use "Multiple Volumes" instead of the label
|
||||||
static_strcpy(entry_msg, (((drive_letters[0] != 0) && (drive_letters[1] != 0))?
|
static_strcpy(display_msg, (((drive_letters[0] != 0) && (drive_letters[1] != 0))?
|
||||||
lmprintf(MSG_047):label));
|
lmprintf(MSG_047):label));
|
||||||
for (k=0, remove_drive=0; drive_letters[k] && (!remove_drive); k++) {
|
for (k=0, remove_drive=0; drive_letters[k] && (!remove_drive); k++) {
|
||||||
// Append all the drive letters we detected
|
// Append all the drive letters we detected
|
||||||
letter_name[2] = drive_letters[k];
|
letter_name[2] = drive_letters[k];
|
||||||
if (right_to_left_mode)
|
if (right_to_left_mode)
|
||||||
static_strcat(entry_msg, RIGHT_TO_LEFT_MARK);
|
static_strcat(display_msg, RIGHT_TO_LEFT_MARK);
|
||||||
static_strcat(entry_msg, letter_name);
|
static_strcat(display_msg, letter_name);
|
||||||
if (drive_letters[k] == (PathGetDriveNumberU(app_dir) + 'A'))
|
if (drive_letters[k] == (PathGetDriveNumberU(app_dir) + 'A'))
|
||||||
remove_drive = 1;
|
remove_drive = 1;
|
||||||
if (drive_letters[k] == (PathGetDriveNumberU(system_dir) + 'A'))
|
if (drive_letters[k] == (PathGetDriveNumberU(system_dir) + 'A'))
|
||||||
|
@ -941,20 +952,25 @@ BOOL GetDevices(DWORD devnum)
|
||||||
safe_free(devint_detail_data);
|
safe_free(devint_detail_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
safe_sprintf(&entry_msg[strlen(entry_msg)], sizeof(entry_msg) - strlen(entry_msg),
|
safe_sprintf(&display_msg[strlen(display_msg)], sizeof(display_msg) - strlen(display_msg),
|
||||||
"%s [%s]", (right_to_left_mode)?RIGHT_TO_LEFT_MARK:"", SizeToHumanReadable(GetDriveSize(drive_index), FALSE, use_fake_units));
|
"%s [%s]", (right_to_left_mode)?RIGHT_TO_LEFT_MARK:"", SizeToHumanReadable(GetDriveSize(drive_index), FALSE, use_fake_units));
|
||||||
entry = entry_msg;
|
display_name = display_msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Must ensure that the combo box is UNSORTED for indexes to be the same
|
rufus_drive[num_drives].index = drive_index;
|
||||||
StrArrayAdd(&DriveId, device_instance_id, TRUE);
|
rufus_drive[num_drives].id = safe_strdup(device_instance_id);
|
||||||
StrArrayAdd(&DriveName, buffer, TRUE);
|
rufus_drive[num_drives].name = safe_strdup(buffer);
|
||||||
StrArrayAdd(&DriveLabel, label, TRUE);
|
rufus_drive[num_drives].display_name = safe_strdup(display_name);
|
||||||
if ((hub_path != NULL) && (StrArrayAdd(&DriveHub, hub_path, TRUE) >= 0))
|
rufus_drive[num_drives].label = safe_strdup(label);
|
||||||
DrivePort[DriveHub.Index - 1] = props.port;
|
rufus_drive[num_drives].size = GetDriveSize(drive_index);
|
||||||
|
assert(rufus_drive[num_drives].size != 0);
|
||||||
IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), drive_index));
|
if (hub_path != NULL) {
|
||||||
maxwidth = max(maxwidth, GetEntryWidth(hDeviceList, entry));
|
rufus_drive[num_drives].hub = safe_strdup(hub_path);
|
||||||
|
rufus_drive[num_drives].port = props.port;
|
||||||
|
}
|
||||||
|
num_drives++;
|
||||||
|
if (num_drives >= MAX_DRIVES)
|
||||||
|
uprintf("Warning: Found more than %d drives - ignoring remaining ones...", MAX_DRIVES);
|
||||||
safe_free(devint_detail_data);
|
safe_free(devint_detail_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -962,6 +978,30 @@ BOOL GetDevices(DWORD devnum)
|
||||||
}
|
}
|
||||||
SetupDiDestroyDeviceInfoList(dev_info);
|
SetupDiDestroyDeviceInfoList(dev_info);
|
||||||
|
|
||||||
|
// Reorder the drives by increasing size, using the "selection sort" algorithm
|
||||||
|
for (u = 0; u < num_drives - 1; u++) {
|
||||||
|
uint64_t min_drive_size = rufus_drive[u].size;
|
||||||
|
int min_index = u;
|
||||||
|
for (v = u + 1; v < num_drives; v++) {
|
||||||
|
if (rufus_drive[v].size < min_drive_size) {
|
||||||
|
min_drive_size = rufus_drive[v].size;
|
||||||
|
min_index = v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (min_index != u) {
|
||||||
|
RUFUS_DRIVE tmp;
|
||||||
|
memcpy(&tmp, &rufus_drive[u], sizeof(RUFUS_DRIVE));
|
||||||
|
memcpy(&rufus_drive[u], &rufus_drive[min_index], sizeof(RUFUS_DRIVE));
|
||||||
|
memcpy(&rufus_drive[min_index], &tmp, sizeof(RUFUS_DRIVE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now populate the drive combo box
|
||||||
|
// NB: The combo box must have the UNSORTED attribute for indexes to remain the ones we assign
|
||||||
|
for (u = 0; u < num_drives; u++) {
|
||||||
|
IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, rufus_drive[u].display_name), rufus_drive[u].index));
|
||||||
|
maxwidth = max(maxwidth, GetEntryWidth(hDeviceList, rufus_drive[u].display_name));
|
||||||
|
}
|
||||||
// Adjust the Dropdown width to the maximum text size
|
// Adjust the Dropdown width to the maximum text size
|
||||||
SendMessage(hDeviceList, CB_SETDROPPEDWIDTH, (WPARAM)maxwidth, 0);
|
SendMessage(hDeviceList, CB_SETDROPPEDWIDTH, (WPARAM)maxwidth, 0);
|
||||||
|
|
||||||
|
|
|
@ -413,6 +413,7 @@ BOOL RefreshDriveLayout(HANDLE hDrive);
|
||||||
const char* GetMBRPartitionType(const uint8_t type);
|
const char* GetMBRPartitionType(const uint8_t type);
|
||||||
const char* GetGPTPartitionType(const GUID* guid);
|
const char* GetGPTPartitionType(const GUID* guid);
|
||||||
const char* GetExtFsLabel(DWORD DriveIndex, uint64_t PartitionOffset);
|
const char* GetExtFsLabel(DWORD DriveIndex, uint64_t PartitionOffset);
|
||||||
|
void ClearDrives(void);
|
||||||
BOOL GetDevices(DWORD devnum);
|
BOOL GetDevices(DWORD devnum);
|
||||||
BOOL CyclePort(int index);
|
BOOL CyclePort(int index);
|
||||||
int CycleDevice(int index);
|
int CycleDevice(int index);
|
||||||
|
|
32
src/rufus.c
32
src/rufus.c
|
@ -108,7 +108,7 @@ HWND hMainDialog, hMultiToolbar, hSaveToolbar, hHashToolbar, hAdvancedDeviceTool
|
||||||
HFONT hInfoFont;
|
HFONT hInfoFont;
|
||||||
uint8_t image_options = IMOP_WINTOGO;
|
uint8_t image_options = IMOP_WINTOGO;
|
||||||
uint16_t rufus_version[3], embedded_sl_version[2];
|
uint16_t rufus_version[3], embedded_sl_version[2];
|
||||||
uint32_t dur_mins, dur_secs, DrivePort[MAX_DRIVES];;
|
uint32_t dur_mins, dur_secs;
|
||||||
loc_cmd* selected_locale = NULL;
|
loc_cmd* selected_locale = NULL;
|
||||||
WORD selected_langid = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
|
WORD selected_langid = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
|
||||||
DWORD MainThreadId;
|
DWORD MainThreadId;
|
||||||
|
@ -134,10 +134,11 @@ char embedded_sl_version_ext[2][32];
|
||||||
char ClusterSizeLabel[MAX_CLUSTER_SIZES][64];
|
char ClusterSizeLabel[MAX_CLUSTER_SIZES][64];
|
||||||
char msgbox[1024], msgbox_title[32], *ini_file = NULL, *image_path = NULL, *short_image_path;
|
char msgbox[1024], msgbox_title[32], *ini_file = NULL, *image_path = NULL, *short_image_path;
|
||||||
char *archive_path = NULL, image_option_txt[128], *fido_url = NULL;
|
char *archive_path = NULL, image_option_txt[128], *fido_url = NULL;
|
||||||
StrArray DriveId, DriveName, DriveLabel, DriveHub, BlockingProcess, ImageList;
|
StrArray BlockingProcess, ImageList;
|
||||||
// Number of steps for each FS for FCC_STRUCTURE_PROGRESS
|
// Number of steps for each FS for FCC_STRUCTURE_PROGRESS
|
||||||
const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10, 1, 1, 1, 1 };
|
const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10, 1, 1, 1, 1 };
|
||||||
const char* flash_type[BADLOCKS_PATTERN_TYPES] = { "SLC", "MLC", "TLC" };
|
const char* flash_type[BADLOCKS_PATTERN_TYPES] = { "SLC", "MLC", "TLC" };
|
||||||
|
RUFUS_DRIVE rufus_drive[MAX_DRIVES] = { 0 };
|
||||||
|
|
||||||
// TODO: Remember to update copyright year in stdlg's AboutCallback() WM_INITDIALOG,
|
// TODO: Remember to update copyright year in stdlg's AboutCallback() WM_INITDIALOG,
|
||||||
// localization_data.sh and the .rc when the year changes!
|
// localization_data.sh and the .rc when the year changes!
|
||||||
|
@ -727,11 +728,11 @@ static void SetProposedLabel(int ComboIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Else if no existing label is available, propose one according to the size (eg: "256MB", "8GB")
|
// Else if no existing label is available, propose one according to the size (eg: "256MB", "8GB")
|
||||||
if ((_stricmp(no_label, DriveLabel.String[ComboIndex]) == 0) || (_stricmp(no_label, empty) == 0)
|
if ((_stricmp(no_label, rufus_drive[ComboIndex].label) == 0) || (_stricmp(no_label, empty) == 0)
|
||||||
|| (safe_stricmp(lmprintf(MSG_207), DriveLabel.String[ComboIndex]) == 0)) {
|
|| (safe_stricmp(lmprintf(MSG_207), rufus_drive[ComboIndex].label) == 0)) {
|
||||||
SetWindowTextU(hLabel, SelectedDrive.proposed_label);
|
SetWindowTextU(hLabel, SelectedDrive.proposed_label);
|
||||||
} else {
|
} else {
|
||||||
SetWindowTextU(hLabel, DriveLabel.String[ComboIndex]);
|
SetWindowTextU(hLabel, rufus_drive[ComboIndex].label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -944,14 +945,14 @@ static BOOL PopulateProperties(void)
|
||||||
SizeToHumanReadable(SelectedDrive.DiskSize, FALSE, TRUE));
|
SizeToHumanReadable(SelectedDrive.DiskSize, FALSE, TRUE));
|
||||||
|
|
||||||
// Add a tooltip (with the size of the device in parenthesis)
|
// Add a tooltip (with the size of the device in parenthesis)
|
||||||
device_tooltip = (char*) malloc(safe_strlen(DriveName.String[device_index]) + 32);
|
device_tooltip = (char*) malloc(safe_strlen(rufus_drive[device_index].name) + 32);
|
||||||
if (device_tooltip != NULL) {
|
if (device_tooltip != NULL) {
|
||||||
if (right_to_left_mode)
|
if (right_to_left_mode)
|
||||||
safe_sprintf(device_tooltip, safe_strlen(DriveName.String[device_index]) + 32, "(%s) %s",
|
safe_sprintf(device_tooltip, safe_strlen(rufus_drive[device_index].name) + 32, "(%s) %s",
|
||||||
SizeToHumanReadable(SelectedDrive.DiskSize, FALSE, FALSE), DriveName.String[device_index]);
|
SizeToHumanReadable(SelectedDrive.DiskSize, FALSE, FALSE), rufus_drive[device_index].name);
|
||||||
else
|
else
|
||||||
safe_sprintf(device_tooltip, safe_strlen(DriveName.String[device_index]) + 32, "%s (%s)",
|
safe_sprintf(device_tooltip, safe_strlen(rufus_drive[device_index].name) + 32, "%s (%s)",
|
||||||
DriveName.String[device_index], SizeToHumanReadable(SelectedDrive.DiskSize, FALSE, FALSE));
|
rufus_drive[device_index].name, SizeToHumanReadable(SelectedDrive.DiskSize, FALSE, FALSE));
|
||||||
CreateTooltip(hDeviceList, device_tooltip, -1);
|
CreateTooltip(hDeviceList, device_tooltip, -1);
|
||||||
free(device_tooltip);
|
free(device_tooltip);
|
||||||
}
|
}
|
||||||
|
@ -1951,10 +1952,6 @@ static void InitDialog(HWND hDlg)
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0));
|
||||||
|
|
||||||
// Create the string arrays
|
// Create the string arrays
|
||||||
StrArrayCreate(&DriveId, MAX_DRIVES);
|
|
||||||
StrArrayCreate(&DriveName, MAX_DRIVES);
|
|
||||||
StrArrayCreate(&DriveLabel, MAX_DRIVES);
|
|
||||||
StrArrayCreate(&DriveHub, MAX_DRIVES);
|
|
||||||
StrArrayCreate(&BlockingProcess, 16);
|
StrArrayCreate(&BlockingProcess, 16);
|
||||||
StrArrayCreate(&ImageList, 16);
|
StrArrayCreate(&ImageList, 16);
|
||||||
// Set various checkboxes
|
// Set various checkboxes
|
||||||
|
@ -2031,7 +2028,7 @@ static void SaveVHD(void)
|
||||||
if ((DriveIndex < 0) || (format_thread != NULL))
|
if ((DriveIndex < 0) || (format_thread != NULL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
static_sprintf(filename, "%s.vhd", DriveLabel.String[DriveIndex]);
|
static_sprintf(filename, "%s.vhd", rufus_drive[DriveIndex].label);
|
||||||
img_save.Type = IMG_SAVE_TYPE_VHD;
|
img_save.Type = IMG_SAVE_TYPE_VHD;
|
||||||
img_save.DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, DriveIndex);
|
img_save.DeviceNum = (DWORD)ComboBox_GetItemData(hDeviceList, DriveIndex);
|
||||||
img_save.ImagePath = FileDialog(TRUE, NULL, &img_ext, 0);
|
img_save.ImagePath = FileDialog(TRUE, NULL, &img_ext, 0);
|
||||||
|
@ -2317,10 +2314,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
if (ulRegister != 0)
|
if (ulRegister != 0)
|
||||||
SHChangeNotifyDeregister(ulRegister);
|
SHChangeNotifyDeregister(ulRegister);
|
||||||
PostQuitMessage(0);
|
PostQuitMessage(0);
|
||||||
StrArrayDestroy(&DriveId);
|
ClearDrives();
|
||||||
StrArrayDestroy(&DriveName);
|
|
||||||
StrArrayDestroy(&DriveLabel);
|
|
||||||
StrArrayDestroy(&DriveHub);
|
|
||||||
StrArrayDestroy(&BlockingProcess);
|
StrArrayDestroy(&BlockingProcess);
|
||||||
StrArrayDestroy(&ImageList);
|
StrArrayDestroy(&ImageList);
|
||||||
DestroyAllTooltips();
|
DestroyAllTooltips();
|
||||||
|
|
11
src/rufus.h
11
src/rufus.h
|
@ -401,6 +401,17 @@ typedef struct {
|
||||||
#define SL_MAJOR(x) ((uint8_t)((x)>>8))
|
#define SL_MAJOR(x) ((uint8_t)((x)>>8))
|
||||||
#define SL_MINOR(x) ((uint8_t)(x))
|
#define SL_MINOR(x) ((uint8_t)(x))
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char* id;
|
||||||
|
char* name;
|
||||||
|
char* display_name;
|
||||||
|
char* label;
|
||||||
|
char* hub;
|
||||||
|
DWORD index;
|
||||||
|
uint32_t port;
|
||||||
|
uint64_t size;
|
||||||
|
} RUFUS_DRIVE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t version[3];
|
uint16_t version[3];
|
||||||
uint32_t platform_min[2]; // minimum platform version required
|
uint32_t platform_min[2]; // minimum platform version required
|
||||||
|
|
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.19.1890"
|
CAPTION "Rufus 3.19.1891"
|
||||||
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,19,1890,0
|
FILEVERSION 3,19,1891,0
|
||||||
PRODUCTVERSION 3,19,1890,0
|
PRODUCTVERSION 3,19,1891,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.19.1890"
|
VALUE "FileVersion", "3.19.1891"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2022 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2022 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.19.exe"
|
VALUE "OriginalFilename", "rufus-3.19.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.19.1890"
|
VALUE "ProductVersion", "3.19.1891"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue