1
1
Fork 0
mirror of https://github.com/pbatard/rufus.git synced 2024-08-14 23:57:05 +00:00

[grub] switch to the more compatible Grub 2.00-22

* Also enable Old BIOS fixes with Syslinux, Grub installation and fix related UI issues
* Also add a check to confirm that Grub SBR will fit
This commit is contained in:
Pete Batard 2014-11-18 23:49:29 +00:00
parent b3947fc026
commit 8b47e95eb5
7 changed files with 96 additions and 60 deletions

View file

@ -1,10 +1,12 @@
grldr.mbr was compiled on Linux Debian 7.7.0 x64, using gcc-multilib 4.7.2, This directory contains the Grub4DOS boot records that are used by Rufus
from https://github.com/chenall/grub4dos/commit/8549aae.
Note that, for convenience reasons, the first 512 bytes from this grldr.mbr are * grldr.mbr was compiled on Linux Debian 7.7.0 x64, using gcc-multilib 4.7.2, from
*not* the ones that Rufus processes when writing the actual MBR (first 512 bytes). https://github.com/chenall/grub4dos/commit/8549aae.
Instead, the byte array from src/ms-sys/inc/mbr_grub.h (whose content is identical)
is what Rufus uses. If you have modified this file, and the MBR section is
altered, be mindful that you also need to update the array in mbr_grub.h.
For details, see src/format.c. * Note that, for convenience reasons, the first 512 bytes from this grldr.mbr are
*not* the ones that Rufus processes when writing the actual MBR (first 512 bytes).
Instead, the byte array from src/ms-sys/inc/mbr_grub.h (whose content is identical)
is what Rufus uses. If you have modified this file, and the MBR section is altered,
be mindful that you also need to update the array in mbr_grub.h.
* For details, see src/format.c, src/msys/br.c and src/msys/inc/mbr_grub.h.

Binary file not shown.

View file

@ -1,16 +1,25 @@
boot.img and core.img were compiled from git://git.savannah.gnu.org/grub.git, This directory contains the Grub 2.0 boot records that are used by Rufus
commit 72ec399ad8d6348b6c74ea63d80c79784c8b84ae, on a Debian 7.7.0 x64 system.
This was done following the guide from:
http://pete.akeo.ie/2014/05/compiling-and-installing-grub2-for.html.
boot.img has been modified to nop the jump @ 0x66 as per grub2's setup.c comments: * boot.img was compiled from git://git.savannah.gnu.org/grub.git at commit:
72ec399ad8d6348b6c74ea63d80c79784c8b84ae.
/* If DEST_DRIVE is a hard disk, enable the workaround, which is * core.img was compiled from grub 2.00-22 using the tarballs found at
for buggy BIOSes which don't pass boot drive correctly. Instead, https://launchpad.net/ubuntu/+source/grub2/2.00-22.
they pass 0x00 or 0x01 even when booted from 0x80. */ The use of the 2.00-22 source is done for compatibility reasons.
Note that, for convenience reasons, the content of boot.img is *not* the one that * This was done on a Debian 7.7.0 x64 system using gcc-multilib 4.7.2, following
Rufus processes when writing the MBR. the guide from http://pete.akeo.ie/2014/05/compiling-and-installing-grub2-for.html
Instead, the byte array from src/ms-sys/inc/mbr_grub2.h (whose content is identical) Note that exFAT was not included in core.img in order to keep it under 31.5 KB.
is what Rufus uses. If you modify these files, be mindful that you may also need
to update the array in mbr_grub2.h. * boot.img has been modified to nop the jump @ 0x66 as per grub2's setup.c comments:
/* If DEST_DRIVE is a hard disk, enable the workaround, which is
for buggy BIOSes which don't pass boot drive correctly. Instead,
they pass 0x00 or 0x01 even when booted from 0x80. */
* Note that, for convenience reasons, the content of boot.img is *not* the one that
Rufus processes when writing the MBR.
Instead, the byte array from src/ms-sys/inc/mbr_grub2.h (whose content is identical)
is what Rufus uses. If you modify these files, be mindful that you may also need
to update the array in mbr_grub2.h.
* For details, see src/format.c, src/msys/br.c and src/msys/inc/mbr_grub2.h.

View file

@ -890,7 +890,8 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
} }
if (IsChecked(IDC_BOOT)) { if (IsChecked(IDC_BOOT)) {
// Set first partition bootable - masquerade as per the DiskID selected // Set first partition bootable - masquerade as per the DiskID selected
buf[0x1be] = (IsChecked(IDC_RUFUS_MBR))?(BYTE)ComboBox_GetItemData(hDiskID, ComboBox_GetCurSel(hDiskID)):0x80; buf[0x1be] = (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && IsChecked(IDC_RUFUS_MBR)) ?
(BYTE)ComboBox_GetItemData(hDiskID, ComboBox_GetCurSel(hDiskID)):0x80;
uprintf("Set bootable USB partition as 0x%02X\n", buf[0x1be]); uprintf("Set bootable USB partition as 0x%02X\n", buf[0x1be]);
} }
@ -947,34 +948,51 @@ out:
*/ */
static BOOL WriteSBR(HANDLE hPhysicalDrive) static BOOL WriteSBR(HANDLE hPhysicalDrive)
{ {
BOOL r = FALSE; // TODO: Do we need anything special for 4K sectors?
DWORD size; DWORD size, max_size, mbr_size = 0x200;
int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
unsigned char* buf = NULL; unsigned char* buf = NULL;
FILE fake_fd = { 0 }; FILE fake_fd = { 0 };
const char* using_msg = "Using %s SBR\n";
fake_fd._ptr = (char*)hPhysicalDrive; fake_fd._ptr = (char*)hPhysicalDrive;
fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector; fake_fd._bufsiz = SelectedDrive.Geometry.BytesPerSector;
if ((dt == DT_GRUB4DOS) || ((dt == DT_ISO) && (iso_report.has_grub4dos))) { // Ensure that we have sufficient space for the SBR
max_size = IsChecked(IDC_EXTRA_PARTITION) ?
(DWORD)(SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack) : 1024 * 1024;
max_size -= mbr_size;
if ((dt == DT_ISO) && (iso_report.has_grub4dos))
dt = DT_GRUB4DOS;
if ((dt == DT_ISO) && (iso_report.has_grub2))
dt = DT_GRUB2;
switch (dt) {
case DT_GRUB4DOS:
buf = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_GR_GRUB_GRLDR_MBR), _RT_RCDATA, "grldr.mbr", &size, FALSE); buf = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_GR_GRUB_GRLDR_MBR), _RT_RCDATA, "grldr.mbr", &size, FALSE);
if ((buf != NULL) && (size > 0x200)) { if ((buf == NULL) || (size <= mbr_size)) {
uprintf(using_msg, "Grub4DOS"); uprintf("grldr.mbr is either not present or too small");
// -0x200 to remove the MBR part return FALSE;
r = (write_data(&fake_fd, 512, &buf[0x200], (uint64_t)(size - 0x200)) != 0);
} }
} else if ((dt == DT_GRUB2) || ((dt == DT_ISO) && (iso_report.has_grub2))) { buf = &buf[mbr_size];
size -= mbr_size;
break;
case DT_GRUB2:
buf = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_GR_GRUB2_CORE_IMG), _RT_RCDATA, "core.img", &size, FALSE); buf = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_GR_GRUB2_CORE_IMG), _RT_RCDATA, "core.img", &size, FALSE);
if (buf != NULL) { if (buf == NULL) {
uprintf(using_msg, "Grub 2.0"); uprintf("Could not access core.img");
// TODO: test what happens for 4096 bytes sectors return FALSE;
r = (write_data(&fake_fd, 512, buf, (uint64_t)size) != 0);
} }
} else { break;
default:
// No need to write secondary block // No need to write secondary block
r = TRUE; return TRUE;
} }
return r;
uprintf("Writing SBR (Secondary Boot record)");
if (size > max_size) {
uprintf(" SBR size is too large - You may need to uncheck 'Add fixes for old BIOSes'.");
return FALSE;
}
return (write_data(&fake_fd, mbr_size, buf, (uint64_t)size) != 0);
} }
/* /*
@ -984,7 +1002,7 @@ static __inline const char* dt_to_name(int dt) {
switch (dt) { switch (dt) {
case DT_FREEDOS: return "FreeDOS"; case DT_FREEDOS: return "FreeDOS";
case DT_REACTOS: return "ReactOS"; case DT_REACTOS: return "ReactOS";
default: default:
return ((dt==DT_ISO)&&(iso_report.has_kolibrios))?"KolibriOS":"Standard"; return ((dt==DT_ISO)&&(iso_report.has_kolibrios))?"KolibriOS":"Standard";
} }
} }

View file

@ -66,8 +66,8 @@
#define IDR_FD_EGA18_CPX 326 #define IDR_FD_EGA18_CPX 326
#define IDR_SL_LDLINUX_V4_BSS 400 #define IDR_SL_LDLINUX_V4_BSS 400
#define IDR_SL_LDLINUX_V4_SYS 401 #define IDR_SL_LDLINUX_V4_SYS 401
#define IDR_SL_LDLINUX_V6_BSS 402 #define IDR_SL_LDLINUX_V6_BSS 402
#define IDR_SL_LDLINUX_V6_SYS 403 #define IDR_SL_LDLINUX_V6_SYS 403
#define IDR_SL_MBOOT_C32 404 #define IDR_SL_MBOOT_C32 404
#define IDR_GR_GRUB_GRLDR_MBR 450 #define IDR_GR_GRUB_GRLDR_MBR 450
#define IDR_GR_GRUB2_CORE_IMG 451 #define IDR_GR_GRUB2_CORE_IMG 451

View file

@ -43,6 +43,7 @@
#include "localization.h" #include "localization.h"
/* Redefinitions for WDK and MinGW */ /* Redefinitions for WDK and MinGW */
// TODO: these would be better in a 'missing.h' file
#ifndef PBM_SETSTATE #ifndef PBM_SETSTATE
#define PBM_SETSTATE (WM_USER+16) #define PBM_SETSTATE (WM_USER+16)
#endif #endif
@ -487,7 +488,7 @@ static void SetMBRProps(void)
int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); int dt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
BOOL needs_masquerading = (IS_WINPE(iso_report.winpe) && (!iso_report.uses_minint)); BOOL needs_masquerading = (IS_WINPE(iso_report.winpe) && (!iso_report.uses_minint));
if ((!mbr_selected_by_user) && ((image_path == NULL) || (dt != DT_ISO) || (fs != FS_NTFS))) { if ((!mbr_selected_by_user) && ((image_path == NULL) || (dt != DT_ISO) || (fs != FS_NTFS) || IS_GRUB(iso_report))) {
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, BST_UNCHECKED); CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, BST_UNCHECKED);
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0)); IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, 0));
return; return;
@ -502,25 +503,30 @@ static void SetMBRProps(void)
static void EnableAdvancedBootOptions(BOOL enable, BOOL remove_checkboxes) static void EnableAdvancedBootOptions(BOOL enable, BOOL remove_checkboxes)
{ {
int bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); int bt = GETBIOSTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
BOOL actual_enable = ((bt==BT_UEFI)||(selection_default>=DT_IMG)||!IsChecked(IDC_BOOT))?FALSE:enable; BOOL actual_enable_mbr = ((bt==BT_UEFI)||(selection_default>=DT_IMG)||!IsChecked(IDC_BOOT))?FALSE:enable;
BOOL actual_enable_fix = ((bt==BT_UEFI)||(selection_default==DT_IMG)||!IsChecked(IDC_BOOT))?FALSE:enable;
static UINT uXPartChecked = BST_UNCHECKED; static UINT uXPartChecked = BST_UNCHECKED;
if ((selection_default == DT_ISO) && (iso_report.has_kolibrios || IS_GRUB(iso_report) || IS_REACTOS(iso_report) || HAS_SYSLINUX(iso_report))) {
actual_enable_mbr = FALSE;
mbr_selected_by_user = FALSE;
}
if (remove_checkboxes) { if (remove_checkboxes) {
// Store/Restore the checkbox states // Store/Restore the checkbox states
if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && !actual_enable) { if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && !actual_enable_mbr) {
uMBRChecked = IsChecked(IDC_RUFUS_MBR); uMBRChecked = IsChecked(IDC_RUFUS_MBR);
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, BST_UNCHECKED); CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, BST_UNCHECKED);
uXPartChecked = IsChecked(IDC_EXTRA_PARTITION); uXPartChecked = IsChecked(IDC_EXTRA_PARTITION);
CheckDlgButton(hMainDialog, IDC_EXTRA_PARTITION, BST_UNCHECKED); CheckDlgButton(hMainDialog, IDC_EXTRA_PARTITION, BST_UNCHECKED);
} else if (!IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && actual_enable) { } else if (!IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)) && actual_enable_mbr) {
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, uMBRChecked); CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, uMBRChecked);
CheckDlgButton(hMainDialog, IDC_EXTRA_PARTITION, uXPartChecked); CheckDlgButton(hMainDialog, IDC_EXTRA_PARTITION, uXPartChecked);
} }
} }
EnableWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), actual_enable); EnableWindow(GetDlgItem(hMainDialog, IDC_EXTRA_PARTITION), actual_enable_fix);
EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), actual_enable); EnableWindow(GetDlgItem(hMainDialog, IDC_RUFUS_MBR), actual_enable_mbr);
EnableWindow(hDiskID, actual_enable); EnableWindow(hDiskID, actual_enable_mbr);
} }
static void EnableBootOptions(BOOL enable, BOOL remove_checkboxes) static void EnableBootOptions(BOOL enable, BOOL remove_checkboxes)
@ -556,7 +562,8 @@ static void SetTargetSystem(void)
if (SelectedDrive.PartitionType == PARTITION_STYLE_GPT) { if (SelectedDrive.PartitionType == PARTITION_STYLE_GPT) {
ts = 2; // GPT/UEFI ts = 2; // GPT/UEFI
} else if (SelectedDrive.has_protective_mbr || SelectedDrive.has_mbr_uefi_marker || (IS_EFI(iso_report) && } else if (SelectedDrive.has_protective_mbr || SelectedDrive.has_mbr_uefi_marker || (IS_EFI(iso_report) &&
(!HAS_SYSLINUX(iso_report)) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe))) ) { (!HAS_SYSLINUX(iso_report)) && (!iso_report.has_bootmgr) && (!IS_REACTOS(iso_report)) &&
(!iso_report.has_kolibrios) && (!IS_GRUB(iso_report)) && (!IS_WINPE(iso_report.winpe))) ) {
ts = 1; // MBR/UEFI ts = 1; // MBR/UEFI
} else { } else {
ts = 0; // MBR/BIOS|UEFI ts = 0; // MBR/BIOS|UEFI
@ -714,7 +721,7 @@ void UpdateProgress(int op, float percent)
return; return;
} }
if (percent > 100.1f) { if (percent > 100.1f) {
duprintf("UpdateProgress(%d): invalid percentage %0.2f\n", op, percent); // duprintf("UpdateProgress(%d): invalid percentage %0.2f\n", op, percent);
return; return;
} }
if ((percent < 0.0f) && (nb_slots[op] <= 0)) { if ((percent < 0.0f) && (nb_slots[op] <= 0)) {
@ -1556,7 +1563,7 @@ void SetBoot(int fs, int bt)
static_sprintf(tmp, "Syslinux %s", embedded_sl_version_str[1]); static_sprintf(tmp, "Syslinux %s", embedded_sl_version_str[1]);
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, tmp), DT_SYSLINUX_V6)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, tmp), DT_SYSLINUX_V6));
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ReactOS"), DT_REACTOS)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "ReactOS"), DT_REACTOS));
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Grub 2.0"), DT_GRUB2)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Grub 2.00-22"), DT_GRUB2));
IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Grub4DOS"), DT_GRUB4DOS)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "Grub4DOS"), DT_GRUB4DOS));
} }
if ((!advanced_mode) && (selection_default >= DT_SYSLINUX_V4)) { if ((!advanced_mode) && (selection_default >= DT_SYSLINUX_V4)) {

View file

@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 227, 329 IDD_DIALOG DIALOGEX 12, 12, 227, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Rufus 1.5.0.543" CAPTION "Rufus 1.5.0.544"
FONT 8, "Segoe UI", 400, 0, 0x1 FONT 8, "Segoe UI", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,113,291,50,14 DEFPUSHBUTTON "Start",IDC_START,113,291,50,14
@ -164,7 +164,7 @@ END
IDD_DIALOG_XP DIALOGEX 12, 12, 227, 329 IDD_DIALOG_XP DIALOGEX 12, 12, 227, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Rufus 1.5.0.543" CAPTION "Rufus 1.5.0.544"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,113,291,50,14 DEFPUSHBUTTON "Start",IDC_START,113,291,50,14
@ -297,7 +297,7 @@ END
IDD_DIALOG_RTL DIALOGEX 12, 12, 227, 329 IDD_DIALOG_RTL DIALOGEX 12, 12, 227, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL
CAPTION "Rufus 1.5.0.543" CAPTION "Rufus 1.5.0.544"
FONT 8, "Segoe UI", 400, 0, 0x1 FONT 8, "Segoe UI", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,113,291,50,14 DEFPUSHBUTTON "Start",IDC_START,113,291,50,14
@ -437,7 +437,7 @@ END
IDD_DIALOG_RTL_XP DIALOGEX 12, 12, 227, 329 IDD_DIALOG_RTL_XP DIALOGEX 12, 12, 227, 329
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL EXSTYLE WS_EX_RTLREADING | WS_EX_APPWINDOW | WS_EX_LAYOUTRTL
CAPTION "Rufus 1.5.0.543" CAPTION "Rufus 1.5.0.544"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
DEFPUSHBUTTON "Start",IDC_START,113,291,50,14 DEFPUSHBUTTON "Start",IDC_START,113,291,50,14
@ -701,8 +701,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,5,0,543 FILEVERSION 1,5,0,544
PRODUCTVERSION 1,5,0,543 PRODUCTVERSION 1,5,0,544
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -719,13 +719,13 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
VALUE "FileDescription", "Rufus" VALUE "FileDescription", "Rufus"
VALUE "FileVersion", "1.5.0.543" VALUE "FileVersion", "1.5.0.544"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2014 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2014 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.5.0.543" VALUE "ProductVersion", "1.5.0.544"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"