From f5939d18abbe9d9630de19cbea8cf64417572898 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Tue, 21 Feb 2012 00:08:31 +0000 Subject: [PATCH] [iso] Syslinux support improvements * Allow the use of vanilla Syslinux by creating a /syslinux.cfg that references isolinux.cfg * Fix #40 and #42 * Workaround for #44 by search and replace of ISO label in .cfg * ISO9660 Joliet fixes --- src/format.c | 56 ++++--- src/iso.c | 123 +++++++++++++-- src/libcdio/driver/utf8.c | 16 +- src/libcdio/iso9660/iso9660_fs.c | 251 +++++++++++-------------------- src/rufus.h | 9 +- src/rufus.rc | 12 +- 6 files changed, 259 insertions(+), 208 deletions(-) diff --git a/src/format.c b/src/format.c index 5e6dcdb3..54f7bda0 100644 --- a/src/format.c +++ b/src/format.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "msapi_utf8.h" #include "rufus.h" @@ -167,7 +168,7 @@ static void ToValidLabel(WCHAR* name, BOOL bFAT) } } if (found) continue; - name[k++] = name[i]; + name[k++] = bFAT?toupper(name[i]):name[i]; } name[k] = 0; if (bFAT) { @@ -175,6 +176,8 @@ static void ToValidLabel(WCHAR* name, BOOL bFAT) } else { name[32] = 0; } + /* Needed for disk by label isolinux.cfg workaround */ + wchar_to_utf8_no_alloc(name, iso_report.usb_label, sizeof(iso_report.usb_label)); } /* @@ -426,6 +429,34 @@ static BOOL WritePBR(HANDLE hLogicalVolume) return FALSE; } +/* + * Issue a complete remount of the volume + */ +static BOOL RemountVolume(char drive_letter) +{ + char drive_guid[50]; + char drive_name[] = "?:\\"; + + drive_name[0] = drive_letter; + if (GetVolumeNameForVolumeMountPointA(drive_name, drive_guid, sizeof(drive_guid))) { + if (DeleteVolumeMountPointA(drive_name)) { + Sleep(200); + if (SetVolumeMountPointA(drive_name, drive_guid)) { + uprintf("Successfully remounted %s on %s\n", drive_guid, drive_name); + } else { + uprintf("Failed to remount %s on %s\n", drive_guid, drive_name); + // This will leave the drive unaccessible and must be flagged as an error + FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_REMOUNT_VOLUME); + return FALSE; + } + } else { + uprintf("Could not remount %s %s\n", drive_name, WindowsErrorString()); + // Try to continue regardless + } + } + return TRUE; +} + /* * Standalone thread for the formatting operation */ @@ -436,7 +467,6 @@ DWORD WINAPI FormatThread(LPVOID param) HANDLE hLogicalVolume = INVALID_HANDLE_VALUE; SYSTEMTIME lt; char drive_name[] = "?:\\"; - char drive_guid[50]; char bb_msg[512]; char logfile[MAX_PATH], *userdir; FILE* log_fd; @@ -591,22 +621,8 @@ DWORD WINAPI FormatThread(LPVOID param) // We issue a complete remount of the filesystem at on account of: // - Ensuring the file explorer properly detects that the volume was updated // - Ensuring that an NTFS system will be reparsed so that it becomes bootable - if (GetVolumeNameForVolumeMountPointA(drive_name, drive_guid, sizeof(drive_guid))) { - if (DeleteVolumeMountPointA(drive_name)) { - Sleep(200); - if (SetVolumeMountPointA(drive_name, drive_guid)) { - uprintf("Successfully remounted %s on %s\n", drive_guid, drive_name); - } else { - uprintf("Failed to remount %s on %s\n", drive_guid, drive_name); - // This will leave the drive unaccessible and must be flagged as an error - FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_REMOUNT_VOLUME); - goto out; - } - } else { - uprintf("Could not remount %s %s\n", drive_name, WindowsErrorString()); - // Try to continue regardless - } - } + if (!RemountVolume(drive_name[0])) + goto out; if (IsChecked(IDC_DOS)) { UpdateProgress(OP_DOS, -1.0f); @@ -622,7 +638,6 @@ DWORD WINAPI FormatThread(LPVOID param) break; case DT_ISO_NTFS: case DT_ISO_FAT: - // TODO: ISO_FAT: ensure the ISO doesn't have ldlinux.sys as it will break the existing one if (iso_path != NULL) { PrintStatus(0, TRUE, "Copying ISO files..."); drive_name[2] = 0; @@ -630,10 +645,11 @@ DWORD WINAPI FormatThread(LPVOID param) FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_CANNOT_COPY; goto out; } - // TODO: ISO_FAT: create menu and stuff } break; } + // Issue another complete remount before we exit, to ensure we're clean + RemountVolume(drive_name[0]); } out: diff --git a/src/iso.c b/src/iso.c index c11dd40d..ba9d7eb9 100644 --- a/src/iso.c +++ b/src/iso.c @@ -69,6 +69,7 @@ static const char *isolinux_name[] = { "isolinux.cfg", "syslinux.cfg", "extlinux static uint8_t i_joliet_level = 0; static uint64_t total_blocks, nb_blocks; static BOOL scan_only = FALSE; +static StrArray config_path; // TODO: Timestamp & permissions preservation @@ -101,12 +102,61 @@ static void log_handler (cdio_log_level_t level, const char *message) } } +/* + * Workaround for isolinux config files requiring an ISO label for kernel + * append that may be different from our USB label. + * NB: this is intended as a quick-and-dirty workaround, because it is the + * distro creator's job to make their config and labels also work with USB. + * As such, this process may fail if: + * - the label is on the block size limit, for cfg files of more than 2KB + * - the user changed the label to one that is larger than the one from the cfg + * - the cfg is weird (more than one label on the same line, etc.) + */ +static void process_config(char* buf, size_t buf_size, const char* cfg_name) +{ + char last_char, eol_char, *label; + size_t i, j, k; + + // Don't apply workaround if USB label is the same or longer than ISO + if ( (strcmp(iso_report.label, iso_report.usb_label) == 0) + || (strlen(iso_report.label) < strlen(iso_report.usb_label)) ) + return; + + // Make sure our buffer is NUL terminated + if (buf_size >= UDF_BLOCKSIZE) // UDF_BLOCKSIZE = ISO_BLOCKSIZE = 2048 + buf_size = UDF_BLOCKSIZE-1; + last_char = buf[buf_size]; + buf[buf_size] = 0; + + for (i=0; i= FOUR_GIGABYTES) iso_report.has_4GB_file = TRUE; @@ -186,6 +241,8 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha goto out; } buf_size = (DWORD)MIN(i_file_length, i_read); + if (cfg_file) + process_config((char*)buf, (size_t)buf_size, psz_fullpath); ISO_BLOCKING(r = WriteFile(file_handle, buf, buf_size, &wr_size, NULL)); if ((!r) || (buf_size != wr_size)) { uprintf(" Error writing file: %s\n", WindowsErrorString()); @@ -220,7 +277,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) { HANDLE file_handle = NULL; DWORD buf_size, wr_size; - BOOL s; + BOOL s, cfg_file; int i_length, r = 1; char psz_fullpath[1024], *psz_basename; const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)]; @@ -260,14 +317,19 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) goto out; } else { i_file_length = p_statbuf->size; + // Check for an isolinux config file anywhere + cfg_file = FALSE; + for (i=0; i= FOUR_GIGABYTES) iso_report.has_4GB_file = TRUE; @@ -307,6 +369,8 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path) goto out; } buf_size = (DWORD)MIN(i_file_length, ISO_BLOCKSIZE); + if (cfg_file) + process_config((char*)buf, (size_t)buf_size, psz_fullpath); ISO_BLOCKING(s = WriteFile(file_handle, buf, buf_size, &wr_size, NULL)); if ((!s) || (buf_size != wr_size)) { uprintf(" Error writing file: %s\n", WindowsErrorString()); @@ -330,13 +394,16 @@ out: BOOL ExtractISO(const char* src_iso, const char* dest_dir, bool scan) { + size_t i; + FILE* fd; BOOL r = FALSE; iso9660_t* p_iso = NULL; udf_t* p_udf = NULL; udf_dirent_t* p_udf_root; LONG progress_style; char* vol_id; - const char* scan_text = "Scanning ISO image...\n"; + char syslinux_path[64]; + const char* scan_text = "Scanning ISO image..."; if ((src_iso == NULL) || (dest_dir == NULL)) return FALSE; @@ -351,6 +418,8 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, bool scan) iso_report.has_4GB_file = FALSE; iso_report.has_bootmgr = FALSE; iso_report.has_isolinux = FALSE; + // String array of all isolinux/syslinux locations + StrArrayCreate(&config_path, 8); // Change the Window title and static text SetWindowTextU(hISOProgressDlg, scan_text); SetWindowTextU(hISOFileName, scan_text); @@ -412,6 +481,38 @@ out: if (scan_only) { // We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here iso_report.projected_size = total_blocks * ISO_BLOCKSIZE; + // We will link the existing isolinux.cfg from a syslinux.cfg we create + // If multiple config file exist, choose the one with the shortest path + if (iso_report.has_isolinux) { + safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.Table[0]); + for (i=1; i safe_strlen(config_path.Table[i])) + safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.Table[i]); + } + uprintf("Will use %s for Syslinux\n", iso_report.cfg_path); + } + StrArrayDestroy(&config_path); + } else if (iso_report.has_isolinux) { + safe_sprintf(syslinux_path, sizeof(syslinux_path), "%s\\syslinux.cfg", dest_dir); + // Create a /syslinux.cfg (if none exists) that points to the existing isolinux cfg + fd = fopen(syslinux_path, "r"); + if (fd == NULL) { + fd = fopen(syslinux_path, "w"); // No "/syslinux.cfg" => create a new one + if (fd == NULL) { + uprintf("Unable to create %s - booting from USB will not work\n", syslinux_path); + r = 1; + } else { + uprintf("Creating: %s\n", syslinux_path); + fprintf(fd, "DEFAULT loadconfig\n\nLABEL loadconfig\n CONFIG %s\n", iso_report.cfg_path); + for (i=safe_strlen(iso_report.cfg_path); (i>0)&&(iso_report.cfg_path[i]!='/'); i--); + if (i>0) { + iso_report.cfg_path[i] = 0; + fprintf(fd, " APPEND %s/\n", iso_report.cfg_path); + iso_report.cfg_path[i] = '/'; + } + } + } + fclose(fd); } SendMessage(hISOProgressDlg, UM_ISO_EXIT, 0, 0); if (p_iso != NULL) diff --git a/src/libcdio/driver/utf8.c b/src/libcdio/driver/utf8.c index a27bd53d..3b32bda0 100644 --- a/src/libcdio/driver/utf8.c +++ b/src/libcdio/driver/utf8.c @@ -303,24 +303,26 @@ bool cdio_charset_to_utf8(char *src, size_t src_len, cdio_utf8_t **dst, if (src == NULL || dst == NULL || src_charset == NULL || strcmp(src_charset, "UCS-2BE") != 0) return false; + /* Compute UCS-2 src length */ if (src_len == (size_t)-1) { for (src_len = 0; ((uint16_t*)src)[src_len] !=0; src_len++); - src_len <<=2; + } else { + src_len >>=1; } /* Eliminate empty strings */ - if ((src_len < 2) || ((src[0] == 0) && (src[1] == 0))) { + if ((src_len < 1) || ((src[0] == 0) && (src[1] == 0))) { *dst = NULL; return false; } /* Perform byte reversal */ - le_src = (wchar_t*)malloc(src_len+2); - for (i=0; i= 0; j--) - { - if ((*str)[j] != ' ') - break; - - (*str)[j] = '\0'; - } - - if ((*str)[0] == 0) - { - free(*str); - *str = NULL; - } -} - static long int iso9660_seek_read_framesize (const iso9660_t *p_iso, void *ptr, lsn_t start, long int size, @@ -299,6 +272,72 @@ check_pvd (const iso9660_pvd_t *p_pvd, cdio_log_level_t log_level) return true; } + +/*! + Core procedure for the iso9660_ifs_get_###_id() calls. + pvd_member/svd_member is a pointer to an achar_t or dchar_t + ID string which we can superset as char. + If the Joliet converted string is the same as the achar_t/dchar_t + one, we fall back to using the latter, as it may be longer. +*/ +static inline bool +get_member_id(iso9660_t *p_iso, cdio_utf8_t **p_psz_member_id, + char* pvd_member, char* svd_member, size_t max_size) +{ + int j; + bool strip; + + if (!p_iso) { + *p_psz_member_id = NULL; + return false; + } +#ifdef HAVE_JOLIET + if (p_iso->i_joliet_level) { + /* Translate USC-2 string from Secondary Volume Descriptor */ + if (cdio_charset_to_utf8(svd_member, max_size, + p_psz_member_id, "UCS-2BE")) { + /* NB: *p_psz_member_id is never NULL on success. */ + if (strncmp(*p_psz_member_id, pvd_member, + strlen(*p_psz_member_id)) != 0) { + /* Strip trailing spaces */ + for (j = strlen(*p_psz_member_id)-1; j >= 0; j--) { + if ((*p_psz_member_id)[j] != ' ') + break; + (*p_psz_member_id)[j] = '\0'; + } + if ((*p_psz_member_id)[0] != 0) { + /* Joliet string is not empty and differs from + non Joliet one => use it */ + return true; + } + } + /* Joliet string was either empty or same */ + free(*p_psz_member_id); + } + } +#endif /*HAVE_JOLIET*/ + *p_psz_member_id = calloc(max_size+1, sizeof(cdio_utf8_t)); + if (!*p_psz_member_id) { + cdio_warn("Memory allocation error"); + return false; + } + /* Copy string while removing trailing spaces */ + (*p_psz_member_id)[max_size] = 0; + for (strip=true, j=max_size-1; j>=0; j--) { + if (strip && (pvd_member[j] == ' ')) + continue; + strip = false; + (*p_psz_member_id)[j] = pvd_member[j]; + } + if (strlen(*p_psz_member_id) == 0) { + free(*p_psz_member_id); + *p_psz_member_id = NULL; + return false; + } + return true; +} + + /*! Return the application ID. NULL is returned in psz_app_id if there is some problem in getting this. @@ -307,32 +346,14 @@ bool iso9660_ifs_get_application_id(iso9660_t *p_iso, /*out*/ cdio_utf8_t **p_psz_app_id) { - if (!p_iso) { - *p_psz_app_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( cdio_charset_to_utf8(p_iso->svd.application_id, - ISO_MAX_APPLICATION_ID, - p_psz_app_id, "UCS-2BE")) { - strip_trail(p_psz_app_id); - return (*p_psz_app_id != NULL); - } - } -#endif /*HAVE_JOLIET*/ - *p_psz_app_id = iso9660_get_application_id( &(p_iso->pvd) ); - return *p_psz_app_id != NULL && strlen(*p_psz_app_id); + return get_member_id(p_iso, p_psz_app_id, + (char*)p_iso->pvd.application_id, + (char*)p_iso->svd.application_id, + ISO_MAX_APPLICATION_ID); } /*! - Return the Joliet level recognaized for p_iso. + Return the Joliet level recognized for p_iso. */ uint8_t iso9660_ifs_get_joliet_level(iso9660_t *p_iso) { @@ -348,27 +369,10 @@ bool iso9660_ifs_get_preparer_id(iso9660_t *p_iso, /*out*/ cdio_utf8_t **p_psz_preparer_id) { - if (!p_iso) { - *p_psz_preparer_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( cdio_charset_to_utf8(p_iso->svd.preparer_id, ISO_MAX_PREPARER_ID, - p_psz_preparer_id, "UCS-2BE") ) { - strip_trail(p_psz_preparer_id); - return (*p_psz_preparer_id != NULL); - } - } -#endif /*HAVE_JOLIET*/ - *p_psz_preparer_id = iso9660_get_preparer_id( &(p_iso->pvd) ); - return *p_psz_preparer_id != NULL && strlen(*p_psz_preparer_id); + return get_member_id(p_iso, p_psz_preparer_id, + (char*)p_iso->pvd.preparer_id, + (char*)p_iso->svd.preparer_id, + ISO_MAX_PREPARER_ID); } /*! @@ -378,30 +382,12 @@ iso9660_ifs_get_preparer_id(iso9660_t *p_iso, bool iso9660_ifs_get_publisher_id(iso9660_t *p_iso, /*out*/ cdio_utf8_t **p_psz_publisher_id) { - if (!p_iso) { - *p_psz_publisher_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if( cdio_charset_to_utf8(p_iso->svd.publisher_id, ISO_MAX_PUBLISHER_ID, - p_psz_publisher_id, "UCS-2BE") ) { - strip_trail(p_psz_publisher_id); - return (*p_psz_publisher_id != NULL); - } - } -#endif /*HAVE_JOLIET*/ - *p_psz_publisher_id = iso9660_get_publisher_id( &(p_iso->pvd) ); - return *p_psz_publisher_id != NULL && strlen(*p_psz_publisher_id); + return get_member_id(p_iso, p_psz_publisher_id, + (char*)p_iso->pvd.publisher_id, + (char*)p_iso->svd.publisher_id, + ISO_MAX_PUBLISHER_ID); } - /*! Return a string containing the PVD's publisher id with trailing blanks removed. @@ -409,30 +395,12 @@ bool iso9660_ifs_get_publisher_id(iso9660_t *p_iso, bool iso9660_ifs_get_system_id(iso9660_t *p_iso, /*out*/ cdio_utf8_t **p_psz_system_id) { - if (!p_iso) { - *p_psz_system_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( cdio_charset_to_utf8(p_iso->svd.system_id, ISO_MAX_SYSTEM_ID, - p_psz_system_id, "UCS-2BE") ) { - strip_trail(p_psz_system_id); - return (*p_psz_system_id != NULL); - } - } -#endif /*HAVE_JOLIET*/ - *p_psz_system_id = iso9660_get_system_id( &(p_iso->pvd) ); - return *p_psz_system_id != NULL && strlen(*p_psz_system_id); + return get_member_id(p_iso, p_psz_system_id, + (char*)p_iso->pvd.system_id, + (char*)p_iso->svd.system_id, + ISO_MAX_SYSTEM_ID); } - /*! Return a string containing the PVD's publisher id with trailing blanks removed. @@ -440,30 +408,12 @@ bool iso9660_ifs_get_system_id(iso9660_t *p_iso, bool iso9660_ifs_get_volume_id(iso9660_t *p_iso, /*out*/ cdio_utf8_t **p_psz_volume_id) { - if (!p_iso) { - *p_psz_volume_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( cdio_charset_to_utf8(p_iso->svd.volume_id, ISO_MAX_VOLUME_ID, - p_psz_volume_id, "UCS-2BE") ) { - strip_trail(p_psz_volume_id); - return (*p_psz_volume_id != NULL); - } - } -#endif /*HAVE_JOLIET*/ - *p_psz_volume_id = iso9660_get_volume_id( &(p_iso->pvd) ); - return *p_psz_volume_id != NULL && strlen(*p_psz_volume_id); + return get_member_id(p_iso, p_psz_volume_id, + (char*)p_iso->pvd.volume_id, + (char*)p_iso->svd.volume_id, + ISO_MAX_VOLUME_ID); } - /*! Return a string containing the PVD's publisher id with trailing blanks removed. @@ -471,29 +421,10 @@ bool iso9660_ifs_get_volume_id(iso9660_t *p_iso, bool iso9660_ifs_get_volumeset_id(iso9660_t *p_iso, /*out*/ cdio_utf8_t **p_psz_volumeset_id) { - if (!p_iso) { - *p_psz_volumeset_id = NULL; - return false; - } - -#ifdef HAVE_JOLIET - if (p_iso->i_joliet_level) { - /* TODO: check that we haven't reached the maximum size. - If we have, perhaps we've truncated and if we can get - longer results *and* have the same character using - the PVD, do that. - */ - if ( cdio_charset_to_utf8(p_iso->svd.volume_set_id, - ISO_MAX_VOLUMESET_ID, - p_psz_volumeset_id, - "UCS-2BE") ) { - strip_trail(p_psz_volumeset_id); - return (*p_psz_volumeset_id != NULL); - } - } -#endif /*HAVE_JOLIET*/ - *p_psz_volumeset_id = iso9660_get_volumeset_id( &(p_iso->pvd) ); - return *p_psz_volumeset_id != NULL && strlen(*p_psz_volumeset_id); + return get_member_id(p_iso, p_psz_volumeset_id, + (char*)p_iso->pvd.volume_set_id, + (char*)p_iso->svd.volume_set_id, + ISO_MAX_VOLUMESET_ID); } diff --git a/src/rufus.h b/src/rufus.h index 7d97ecb3..a302287f 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -145,7 +145,9 @@ typedef struct { /* ISO details that the application may want */ typedef struct { - char label[64]; + char label[192]; /* 3*64 to account for UTF-8 */ + char usb_label[192]; /* converted USB label for workaround */ + char cfg_path[128]; /* path to the ISO's isolinux.cfg */ uint64_t projected_size; BOOL has_4GB_file; BOOL has_bootmgr; @@ -204,9 +206,8 @@ __inline static BOOL UnlockDrive(HANDLE hDrive) /* Basic String Array */ typedef struct { char** Table; - size_t Size; - size_t Index; - size_t Max; + size_t Index; // Current array size + size_t Max; // Maximum array size } StrArray; extern void StrArrayCreate(StrArray* arr, size_t initial_size); extern void StrArrayAdd(StrArray* arr, const char* str); diff --git a/src/rufus.rc b/src/rufus.rc index db7138ff..d9a1ac61 100644 --- a/src/rufus.rc +++ b/src/rufus.rc @@ -33,7 +33,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL IDD_DIALOG DIALOGEX 12, 12, 206, 278 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_APPWINDOW -CAPTION "Rufus v1.1.1.140" +CAPTION "Rufus v1.1.1.141" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Start",IDC_START,94,236,50,14 @@ -71,7 +71,7 @@ BEGIN DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP CONTROL "http://rufus.akeo.ie",IDC_ABOUT_RUFUS_URL, "SysLink",WS_TABSTOP,46,47,114,9 - LTEXT "Version 1.1.1 (Build 140)",IDC_STATIC,46,19,78,8 + LTEXT "Version 1.1.1 (Build 141)",IDC_STATIC,46,19,78,8 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 LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8 @@ -220,8 +220,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,1,1,140 - PRODUCTVERSION 1,1,1,140 + FILEVERSION 1,1,1,141 + PRODUCTVERSION 1,1,1,141 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -238,13 +238,13 @@ BEGIN BEGIN VALUE "CompanyName", "akeo.ie" VALUE "FileDescription", "Rufus" - VALUE "FileVersion", "1.1.1.140" + VALUE "FileVersion", "1.1.1.141" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" VALUE "OriginalFilename", "rufus.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "1.1.1.140" + VALUE "ProductVersion", "1.1.1.141" END END BLOCK "VarFileInfo"