[misc] fix broken DOS, fix invalid labels and UI improvements

* DOS creation was broken due to missing unlock + close
* added label validation to prevent errors
* added ellipsis to status bar
* also bumped version to rufus next and fixed f/non-f
This commit is contained in:
Pete Batard 2012-02-15 00:52:40 +00:00
parent e17de3312f
commit f4ed6e4650
9 changed files with 95 additions and 35 deletions

View File

@ -1,9 +1,9 @@
#!/bin/sh #!/bin/sh
rm -f rufus*.exe rm -f rufus*.exe
./configure --without-freedos --without-syslinux ./configure --without-freedos
make clean make clean
make release -j2 make release -j2
./configure --with-freedos --without-syslinux ./configure --with-freedos
# The only difference between FreeDOS and non FreeDOS is with the RC # The only difference between FreeDOS and non FreeDOS is with the RC
# => instead of invoking 'make clean, just remove the RC object # => instead of invoking 'make clean, just remove the RC object
rm src/rufus_rc.o rm src/rufus_rc.o

21
configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.68 for rufus 1.1.0. # Generated by GNU Autoconf 2.68 for rufus 1.1.1.
# #
# Report bugs to <https://github.com/pbatard/rufus/issues>. # Report bugs to <https://github.com/pbatard/rufus/issues>.
# #
@ -559,8 +559,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='rufus' PACKAGE_NAME='rufus'
PACKAGE_TARNAME='rufus' PACKAGE_TARNAME='rufus'
PACKAGE_VERSION='1.1.0' PACKAGE_VERSION='1.1.1'
PACKAGE_STRING='rufus 1.1.0' PACKAGE_STRING='rufus 1.1.1'
PACKAGE_BUGREPORT='https://github.com/pbatard/rufus/issues' PACKAGE_BUGREPORT='https://github.com/pbatard/rufus/issues'
PACKAGE_URL='http://rufus.akeo.ie' PACKAGE_URL='http://rufus.akeo.ie'
@ -1205,7 +1205,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures rufus 1.1.0 to adapt to many kinds of systems. \`configure' configures rufus 1.1.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1271,7 +1271,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of rufus 1.1.0:";; short | recursive ) echo "Configuration of rufus 1.1.1:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1365,7 +1365,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
rufus configure 1.1.0 rufus configure 1.1.1
generated by GNU Autoconf 2.68 generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc. Copyright (C) 2010 Free Software Foundation, Inc.
@ -1420,7 +1420,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by rufus $as_me 1.1.0, which was It was created by rufus $as_me 1.1.1, which was
generated by GNU Autoconf 2.68. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@ $ $0 $@
@ -2235,7 +2235,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='rufus' PACKAGE='rufus'
VERSION='1.1.0' VERSION='1.1.1'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -3475,7 +3475,6 @@ fi
if test "x$with_syslinux" != "xno" ; then if test "x$with_syslinux" != "xno" ; then
AM_RCFLAGS="${AM_RCFLAGS} -DWITH_SYSLINUX" AM_RCFLAGS="${AM_RCFLAGS} -DWITH_SYSLINUX"
EXESUFFIX="f"
fi fi
# Debug symbols # Debug symbols
@ -4105,7 +4104,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by rufus $as_me 1.1.0, which was This file was extended by rufus $as_me 1.1.1, which was
generated by GNU Autoconf 2.68. Invocation command line was generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -4159,7 +4158,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
rufus config.status 1.1.0 rufus config.status 1.1.1
configured by $0, generated by GNU Autoconf 2.68, configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -1,4 +1,4 @@
AC_INIT([rufus], [1.1.0], [https://github.com/pbatard/rufus/issues], [rufus], [http://rufus.akeo.ie]) AC_INIT([rufus], [1.1.1], [https://github.com/pbatard/rufus/issues], [rufus], [http://rufus.akeo.ie])
AM_INIT_AUTOMAKE([-Wno-portability foreign no-dist no-dependencies]) AM_INIT_AUTOMAKE([-Wno-portability foreign no-dist no-dependencies])
AC_CONFIG_SRCDIR([src/rufus.c]) AC_CONFIG_SRCDIR([src/rufus.c])
AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_MACRO_DIR([m4])
@ -38,7 +38,6 @@ AC_ARG_WITH([syslinux],
[with_freedos=yes]) [with_freedos=yes])
if test "x$with_syslinux" != "xno" ; then if test "x$with_syslinux" != "xno" ; then
AM_RCFLAGS="${AM_RCFLAGS} -DWITH_SYSLINUX" AM_RCFLAGS="${AM_RCFLAGS} -DWITH_SYSLINUX"
EXESUFFIX="f"
fi fi
# Debug symbols # Debug symbols

View File

@ -161,6 +161,11 @@ static BOOL FormatDrive(char DriveLetter)
} }
} }
GetWindowTextW(hLabel, wLabel, ARRAYSIZE(wLabel)); GetWindowTextW(hLabel, wLabel, ARRAYSIZE(wLabel));
// If using FAT/FAT32, truncate the label to 11 characters
// TODO: use a wchar_t to_valid_label() here
if ((wFSType[0] == 'F') && (wFSType[1] == 'A') && (wFSType[2] == 'T')) {
wLabel[11] = 0;
}
uprintf("Using cluster size: %d bytes\n", ComboBox_GetItemData(hClusterSize, ComboBox_GetCurSel(hClusterSize))); uprintf("Using cluster size: %d bytes\n", ComboBox_GetItemData(hClusterSize, ComboBox_GetCurSel(hClusterSize)));
format_percent = 0.0f; format_percent = 0.0f;
task_number = 0; task_number = 0;
@ -533,6 +538,8 @@ DWORD WINAPI FormatThread(LPVOID param)
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_WRITE_FAULT;
goto out; goto out;
} }
// We must close and unlock the volume to write files to it
safe_unlockclose(hLogicalVolume);
break; break;
case DT_ISO_FAT: case DT_ISO_FAT:
PrintStatus(0, TRUE, "Installing Syslinux..."); PrintStatus(0, TRUE, "Installing Syslinux...");
@ -546,7 +553,6 @@ DWORD WINAPI FormatThread(LPVOID param)
// We issue a complete remount of the filesystem at on account of: // We issue a complete remount of the filesystem at on account of:
// - Ensuring the file explorer properly detects that the volume was updated // - Ensuring the file explorer properly detects that the volume was updated
// - Ensuring that an NTFS system will be reparsed so that it becomes bootable // - Ensuring that an NTFS system will be reparsed so that it becomes bootable
// TODO: on cancellation, this can leave the drive unmounted!
if (GetVolumeNameForVolumeMountPointA(drive_name, drive_guid, sizeof(drive_guid))) { if (GetVolumeNameForVolumeMountPointA(drive_name, drive_guid, sizeof(drive_guid))) {
if (DeleteVolumeMountPointA(drive_name)) { if (DeleteVolumeMountPointA(drive_name)) {
Sleep(200); Sleep(200);

View File

@ -109,7 +109,7 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
BOOL r; BOOL r;
int i_length; int i_length;
size_t i, nul_pos; size_t i, nul_pos;
char* psz_fullpath; char* psz_fullpath = NULL;
const char* psz_basename; const char* psz_basename;
udf_dirent_t *p_udf_dirent2; udf_dirent_t *p_udf_dirent2;
uint8_t buf[UDF_BLOCKSIZE]; uint8_t buf[UDF_BLOCKSIZE];

View File

@ -127,6 +127,18 @@ static __inline LRESULT SendMessageLU(HWND hWnd, UINT Msg, WPARAM wParam, const
return ret; return ret;
} }
static __inline int DrawTextExU(HDC hDC, LPCSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams)
{
int ret;
DWORD err = ERROR_INVALID_DATA;
wconvert(lpchText);
ret = DrawTextExW(hDC, wlpchText, nCount, lpRect, uFormat, lpDTParams);
err = GetLastError();
wfree(lpchText);
SetLastError(err);
return ret;
}
static __inline BOOL SHGetPathFromIDListU(LPCITEMIDLIST pidl, char* pszPath) static __inline BOOL SHGetPathFromIDListU(LPCITEMIDLIST pidl, char* pszPath)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;

View File

@ -59,6 +59,7 @@ int default_fs;
HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses; HWND hDeviceList, hCapacity, hFileSystem, hClusterSize, hLabel, hDOSType, hNBPasses;
HWND hISOProgressDlg = NULL, hISOProgressBar, hISOFileName; HWND hISOProgressDlg = NULL, hISOProgressBar, hISOFileName;
BOOL bWithFreeDOS, bWithSyslinux; BOOL bWithFreeDOS, bWithSyslinux;
extern char szStatusMessage[256];
static HANDLE format_thid = NULL; static HANDLE format_thid = NULL;
static HWND hDeviceTooltip = NULL, hFSTooltip = NULL, hProgress = NULL; static HWND hDeviceTooltip = NULL, hFSTooltip = NULL, hProgress = NULL;
@ -951,6 +952,41 @@ BOOL CALLBACK ISOProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
return FALSE; return FALSE;
} }
/*
* Converts a name + ext UTF-8 pair to a valid MS filename.
* Returned string is allocated and needs to be freed manually
*/
void to_valid_label(char* name)
{
size_t i, j, k;
BOOL found;
char unauthorized[] = "*?.,;:/\\|+=<>[]";
char to_underscore[] = "\t";
if (name == NULL)
return;
for (i=0, k=0; i<strlen(name); i++) {
found = FALSE;
for (j=0; j<strlen(unauthorized); j++) {
if (name[i] == unauthorized[j]) {
found = TRUE; break;
}
}
if (found) continue;
found = FALSE;
for (j=0; j<strlen(to_underscore); j++) {
if (name[i] == to_underscore[j]) {
name[k++] = '_';
found = TRUE; break;
}
}
if (found) continue;
name[k++] = name[i];
}
name[k] = 0;
}
// The scanning process can be blocking for message processing => use a thread // The scanning process can be blocking for message processing => use a thread
DWORD WINAPI ISOScanThread(LPVOID param) DWORD WINAPI ISOScanThread(LPVOID param)
{ {
@ -973,10 +1009,11 @@ DWORD WINAPI ISOScanThread(LPVOID param)
safe_free(iso_path); safe_free(iso_path);
} else { } else {
for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--); for (i=(int)safe_strlen(iso_path); (i>0)&&(iso_path[i]!='\\'); i--);
PrintStatus(0, TRUE, "Using ISO: '%s'\n", &iso_path[i+1]); PrintStatus(0, TRUE, "Using ISO: %s\n", &iso_path[i+1]);
// Some Linux distros, such as Arch Linux, require the USB drive to have // Some Linux distros, such as Arch Linux, require the USB drive to have
// a specific label => copy the one we got from the ISO image // a specific label => copy the one we got from the ISO image
if (iso_report.label[0] != 0) { if (iso_report.label[0] != 0) {
to_valid_label(iso_report.label);
SetWindowTextU(hLabel, iso_report.label); SetWindowTextU(hLabel, iso_report.label);
} }
} }
@ -1122,16 +1159,23 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
GetUSBDevices(); GetUSBDevices();
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
// Change the colour of the version text in the status bar // The things one must do to get an ellipsis on the status bar...
case WM_DRAWITEM: case WM_DRAWITEM:
if (wParam == IDC_STATUS) { if (wParam == IDC_STATUS) {
pDI = (DRAWITEMSTRUCT*)lParam; pDI = (DRAWITEMSTRUCT*)lParam;
SetBkMode(pDI->hDC, TRANSPARENT);
SetTextColor(pDI->hDC, GetSysColor(COLOR_3DSHADOW));
pDI->rcItem.top += (int)(2.0f * fScale); pDI->rcItem.top += (int)(2.0f * fScale);
pDI->rcItem.left += (int)(4.0f * fScale); pDI->rcItem.left += (int)(4.0f * fScale);
DrawTextExA(pDI->hDC, szTimer, -1, &pDI->rcItem, DT_LEFT, NULL); SetBkMode(pDI->hDC, TRANSPARENT);
return (INT_PTR)TRUE; switch(pDI->itemID) {
case 0: // left part
DrawTextExU(pDI->hDC, szStatusMessage, -1, &pDI->rcItem,
DT_LEFT|DT_END_ELLIPSIS, NULL);
return (INT_PTR)TRUE;
case 1: // right part
SetTextColor(pDI->hDC, GetSysColor(COLOR_3DSHADOW));
DrawTextExA(pDI->hDC, szTimer, -1, &pDI->rcItem, DT_LEFT, NULL);
return (INT_PTR)TRUE;
}
} }
break; break;
@ -1246,9 +1290,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
break; break;
} }
ShowWindow(hSelectISO, SW_SHOW); ShowWindow(hSelectISO, SW_SHOW);
// Fall through if no ISO is selected break;
if ((iso_path != NULL) || (LOWORD(wParam) == IDC_FILESYSTEM))
break;
case IDC_SELECT_ISO: case IDC_SELECT_ISO:
DestroyTooltip(hISOToolTip); DestroyTooltip(hISOToolTip);
safe_free(iso_path); safe_free(iso_path);

View File

@ -33,7 +33,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 206, 278 IDD_DIALOG DIALOGEX 12, 12, 206, 278
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW EXSTYLE WS_EX_APPWINDOW
CAPTION "Rufus v1.1.0.133" CAPTION "Rufus v1.1.1.134"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,94,236,50,14 DEFPUSHBUTTON "Start",IDC_START,94,236,50,14
@ -71,7 +71,7 @@ BEGIN
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL, CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL,
"SysLink",WS_TABSTOP,46,47,114,9 "SysLink",WS_TABSTOP,46,47,114,9
LTEXT "Version 1.1.0 (Build 133)",IDC_STATIC,46,19,78,8 LTEXT "Version 1.1.1 (Build 134)",IDC_STATIC,46,19,78,8
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP
EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL
LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
@ -222,8 +222,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,1,0,133 FILEVERSION 1,1,1,134
PRODUCTVERSION 1,1,0,133 PRODUCTVERSION 1,1,1,134
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -240,13 +240,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "akeo.ie" VALUE "CompanyName", "akeo.ie"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.1.0.133" VALUE "FileVersion", "1.1.1.134"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
VALUE "OriginalFilename", "rufus.exe" VALUE "OriginalFilename", "rufus.exe"
VALUE "ProductName", "Rufus" VALUE "ProductName", "Rufus"
VALUE "ProductVersion", "1.1.0.133" VALUE "ProductVersion", "1.1.1.134"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -128,12 +128,13 @@ static char err_string[256];
* message * message
*/ */
static BOOL bStatusTimerArmed = FALSE; static BOOL bStatusTimerArmed = FALSE;
static char szStatusMessage[256] = { 0 }; char szStatusMessage[256] = { 0 };
static void CALLBACK PrintStatusTimeout(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) static void CALLBACK PrintStatusTimeout(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{ {
bStatusTimerArmed = FALSE; bStatusTimerArmed = FALSE;
// potentially display lower priority message that was overridden // potentially display lower priority message that was overridden
SetDlgItemTextU(hMainDialog, IDC_STATUS, szStatusMessage); SendMessageLU(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTW,
SBT_OWNERDRAW | 0, szStatusMessage);
KillTimer(hMainDialog, TID_MESSAGE); KillTimer(hMainDialog, TID_MESSAGE);
} }
@ -158,7 +159,8 @@ void PrintStatus(unsigned int duration, BOOL debug, const char *format, ...)
uprintf("%s\n", szStatusMessage); uprintf("%s\n", szStatusMessage);
if ((duration) || (!bStatusTimerArmed)) { if ((duration) || (!bStatusTimerArmed)) {
SetDlgItemTextU(hMainDialog, IDC_STATUS, szStatusMessage); SendMessageLU(GetDlgItem(hMainDialog, IDC_STATUS), SB_SETTEXTA,
SBT_OWNERDRAW | 0, szStatusMessage);
} }
if (duration) { if (duration) {