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);