From 45714cf5fb095d23cdd44f4909e4a22eb7581cda Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Sat, 9 Aug 2014 00:10:12 +0100 Subject: [PATCH] [ui] UI fixes and improvements * Fix missing DD-Image option when no drive is present * Prevent formatting of a drive when using an image residing on same drive * Fix ignored bootable checkbox when using a DD-Image * Fix wrong title for error messages (due to too many concurrent loc messages) --- src/.msvc/rufus.vcxproj | 8 ++++---- src/.msvc/rufus_sources | 1 + src/Makefile.am | 2 +- src/Makefile.in | 2 +- src/format.c | 10 +++++++++- src/localization.h | 2 +- src/msapi_utf8.h | 13 +++++++++++++ src/rufus.c | 5 +++-- src/rufus.rc | 12 ++++++------ src/usb.c | 4 ++-- 10 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/.msvc/rufus.vcxproj b/src/.msvc/rufus.vcxproj index ed4d73b1..6bd9f016 100644 --- a/src/.msvc/rufus.vcxproj +++ b/src/.msvc/rufus.vcxproj @@ -90,7 +90,7 @@ false - setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies) + setupapi.lib;comctl32.lib;wininet.lib;shlwapi.lib;%(AdditionalDependencies) RequireAdministrator true Windows @@ -117,7 +117,7 @@ false - setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies) + setupapi.lib;comctl32.lib;wininet.lib;shlwapi.lib;%(AdditionalDependencies) RequireAdministrator true Windows @@ -140,7 +140,7 @@ false - setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies) + setupapi.lib;comctl32.lib;wininet.lib;shlwapi.lib;%(AdditionalDependencies) RequireAdministrator false Windows @@ -166,7 +166,7 @@ false - setupapi.lib;comctl32.lib;wininet.lib;%(AdditionalDependencies) + setupapi.lib;comctl32.lib;wininet.lib;shlwapi.lib;%(AdditionalDependencies) RequireAdministrator false Windows diff --git a/src/.msvc/rufus_sources b/src/.msvc/rufus_sources index b88e38c3..6c33871c 100644 --- a/src/.msvc/rufus_sources +++ b/src/.msvc/rufus_sources @@ -18,6 +18,7 @@ TARGETLIBS=$(SDK_LIB_PATH)\kernel32.lib \ $(SDK_LIB_PATH)\uuid.lib \ $(SDK_LIB_PATH)\shell32.lib \ $(SDK_LIB_PATH)\wininet.lib \ + $(SDK_LIB_PATH)\shlwapi.lib \ .\ms-sys\ms-sys.lib \ .\syslinux\libfat\libfat.lib \ .\syslinux\libinstaller\libinstaller.lib \ diff --git a/src/Makefile.am b/src/Makefile.am index 914dd9ef..39ff50c7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,4 +13,4 @@ rufus_SOURCES = drive.c icon.c parser.c localization.c iso.c net.c dos.c dos_loc rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \ - libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet + libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet -lshlwapi diff --git a/src/Makefile.in b/src/Makefile.in index e7dbe8d9..dda0c84a 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -191,7 +191,7 @@ rufus_SOURCES = drive.c icon.c parser.c localization.c iso.c net.c dos.c dos_loc rufus_CFLAGS = -I./ms-sys/inc -I./syslinux/libfat -I./syslinux/libinstaller -I./libcdio $(AM_CFLAGS) rufus_LDFLAGS = $(AM_LDFLAGS) -mwindows rufus_LDADD = rufus_rc.o ms-sys/libmssys.a syslinux/libfat/libfat.a syslinux/libinstaller/libinstaller.a \ - libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet + libcdio/iso9660/libiso9660.a libcdio/udf/libudf.a libcdio/driver/libdriver.a -lsetupapi -lole32 -lgdi32 -lwininet -lshlwapi all: all-recursive diff --git a/src/format.c b/src/format.c index b4bbdddf..e78261d7 100644 --- a/src/format.c +++ b/src/format.c @@ -1264,6 +1264,14 @@ DWORD WINAPI FormatThread(void* param) // Do it in reverse so that we always end on the first volume letter for (i=(int)safe_strlen(drive_letters); i>0; i--) { drive_name[0] = drive_letters[i-1]; + if (IsChecked(IDC_BOOT) && ((dt == DT_ISO) || (dt == DT_IMG))) { + // If we are using an image, check that it isn't located on the drive we are trying to format + if ((PathGetDriveNumberU(image_path) + 'A') == drive_letters[i-1]) { + uprintf("ABORTED: Cannot use an image that is located on the target drive!\n"); + FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_ACCESS_DENIED; + goto out; + } + } if (!DeleteVolumeMountPointA(drive_name)) { uprintf("Failed to delete mountpoint %s: %s\n", drive_name, WindowsErrorString()); // Try to continue. We will bail out if this causes an issue. @@ -1368,7 +1376,7 @@ DWORD WINAPI FormatThread(void* param) } // Write an image file - if (dt == DT_IMG) { + if (IsChecked(IDC_BOOT) && (dt == DT_IMG)) { char fs_type[32]; // We poked the MBR and other stuff, so we need to rewind li.QuadPart = 0; diff --git a/src/localization.h b/src/localization.h index cdf3bf58..c6a9d19a 100644 --- a/src/localization.h +++ b/src/localization.h @@ -24,7 +24,7 @@ // Number of concurrent localization messages (i.e. messages we can concurrently // reference at the same time). Must be a power of 2. -#define LOC_MESSAGE_NB 8 +#define LOC_MESSAGE_NB 16 #define LOC_MESSAGE_SIZE 2048 #define LOC_HTAB_SIZE 1031 // Using a prime speeds up the hash table init diff --git a/src/msapi_utf8.h b/src/msapi_utf8.h index a5a5e800..091a4f35 100644 --- a/src/msapi_utf8.h +++ b/src/msapi_utf8.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -350,6 +351,18 @@ static __inline BOOL DeleteFileU(const char* lpFileName) return ret; } +static __inline int PathGetDriveNumberU(char* lpPath) +{ + int ret = 0; + DWORD err = ERROR_INVALID_DATA; + wconvert(lpPath); + ret = PathGetDriveNumberW(wlpPath); + err = GetLastError(); + wfree(lpPath); + SetLastError(err); + return ret; +} + // This function differs from regular GetTextExtentPoint in that it uses a zero terminated string static __inline BOOL GetTextExtentPointU(HDC hdc, const char* lpString, LPSIZE lpSize) { diff --git a/src/rufus.c b/src/rufus.c index b6e18330..a222bf14 100644 --- a/src/rufus.c +++ b/src/rufus.c @@ -1358,10 +1358,11 @@ void InitDialog(HWND hDlg) } IGNORE_RETVAL(ComboBox_SetCurSel(hNBPasses, 1)); SetPassesTooltip(); - // Fill up the DOS type dropdown + // Fill up the boot type dropdown IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), DT_WINME)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), DT_FREEDOS)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_036)), DT_ISO)); + IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_095)), DT_IMG)); IGNORE_RETVAL(ComboBox_SetCurSel(hBootType, selection_default)); // Fill up the MBR masqueraded disk IDs ("8 disks should be enough for anybody") IGNORE_RETVAL(ComboBox_SetItemData(hDiskID, ComboBox_AddStringU(hDiskID, lmprintf(MSG_030, LEFT_TO_RIGHT_MARK "0x80")), 0x80)); @@ -2040,7 +2041,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA SendMessage(hProgress, PBM_SETSTATE, (WPARAM)PBST_ERROR, 0); SetTaskbarProgressState(TASKBAR_ERROR); PrintStatus(0, FALSE, MSG_212); - Notification(MSG_ERROR, NULL, lmprintf(MSG_042), lmprintf(MSG_043, StrError(FormatStatus, FALSE)), StrError(FormatStatus, FALSE)); + Notification(MSG_ERROR, NULL, lmprintf(MSG_042), lmprintf(MSG_043, StrError(FormatStatus, FALSE))); } FormatStatus = 0; format_op_in_progress = FALSE; diff --git a/src/rufus.rc b/src/rufus.rc index bf20e0b7..898981c3 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Rufus 1.4.10.511" +CAPTION "Rufus 1.4.10.512" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -165,7 +165,7 @@ END RTL_IDD_DIALOG DIALOGEX 12, 12, 206, 329 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL -CAPTION "Rufus 1.4.10.511" +CAPTION "Rufus 1.4.10.512" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,291,50,14 @@ -428,8 +428,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,10,511 - PRODUCTVERSION 1,4,10,511 + FILEVERSION 1,4,10,512 + PRODUCTVERSION 1,4,10,512 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -446,13 +446,13 @@ BEGIN BEGIN VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.4.10.511" + VALUE "FileVersion", "1.4.10.512" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.4.10.511" + VALUE "ProductVersion", "1.4.10.512" END END BLOCK "VarFileInfo" diff --git a/src/usb.c b/src/usb.c index fbeba0b9..122271df 100644 --- a/src/usb.c +++ b/src/usb.c @@ -389,10 +389,10 @@ BOOL GetUSBDevices(DWORD devnum) if (right_to_left_mode) safe_strcat(entry_msg, sizeof(entry_msg), RIGHT_TO_LEFT_MARK); safe_strcat(entry_msg, sizeof(entry_msg), letter_name); - if (drive_letters[k] == app_dir[0]) break; + if (drive_letters[k] == (PathGetDriveNumberU(app_dir) + 'A')) break; } // Repeat as we need to break the outside loop - if (drive_letters[k] == app_dir[0]) { + if (drive_letters[k] == (PathGetDriveNumberU(app_dir) + 'A')) { uprintf("Removing %c: from the list: This is the disk from which " APPLICATION_NAME " is running!\n", app_dir[0]); safe_closehandle(hDrive); safe_free(devint_detail_data);