[internal] refactor iso_report -> img_report

* Also set rufus-next to 2.4
This commit is contained in:
Pete Batard 2015-09-02 23:20:00 +01:00
parent 102e17699a
commit 5024e7f65e
10 changed files with 241 additions and 240 deletions

20
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.69 for rufus 2.3. # Generated by GNU Autoconf 2.69 for rufus 2.4.
# #
# Report bugs to <https://github.com/pbatard/rufus/issues>. # Report bugs to <https://github.com/pbatard/rufus/issues>.
# #
@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='rufus' PACKAGE_NAME='rufus'
PACKAGE_TARNAME='rufus' PACKAGE_TARNAME='rufus'
PACKAGE_VERSION='2.3' PACKAGE_VERSION='2.4'
PACKAGE_STRING='rufus 2.3' PACKAGE_STRING='rufus 2.4'
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'
@ -1228,7 +1228,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 2.3 to adapt to many kinds of systems. \`configure' configures rufus 2.4 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1294,7 +1294,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 2.3:";; short | recursive ) echo "Configuration of rufus 2.4:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1385,7 +1385,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 2.3 rufus configure 2.4
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -1440,7 +1440,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 2.3, which was It was created by rufus $as_me 2.4, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -2303,7 +2303,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='rufus' PACKAGE='rufus'
VERSION='2.3' VERSION='2.4'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -4480,7 +4480,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 2.3, which was This file was extended by rufus $as_me 2.4, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -4534,7 +4534,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 2.3 rufus config.status 2.4
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -1,4 +1,4 @@
AC_INIT([rufus], [2.3], [https://github.com/pbatard/rufus/issues], [rufus], [http://rufus.akeo.ie]) AC_INIT([rufus], [2.4], [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])

View File

@ -626,10 +626,10 @@ DWORD WINAPI SumThread(void* param)
for (rb = 0; ; rb += rSize) { for (rb = 0; ; rb += rSize) {
if (GetTickCount() > LastRefresh + 25) { if (GetTickCount() > LastRefresh + 25) {
LastRefresh = GetTickCount(); LastRefresh = GetTickCount();
format_percent = (100.0f*rb) / (1.0f*iso_report.projected_size); format_percent = (100.0f*rb) / (1.0f*img_report.projected_size);
PrintInfo(0, MSG_271, format_percent); PrintInfo(0, MSG_271, format_percent);
SendMessage(hProgress, PBM_SETPOS, (WPARAM)((format_percent/100.0f)*MAX_PROGRESS), 0); SendMessage(hProgress, PBM_SETPOS, (WPARAM)((format_percent/100.0f)*MAX_PROGRESS), 0);
SetTaskbarProgressValue(rb, iso_report.projected_size); SetTaskbarProgressValue(rb, img_report.projected_size);
} }
CHECK_FOR_USER_CANCEL; CHECK_FOR_USER_CANCEL;
if (!ReadFile(h, buffer, sizeof(buffer), &rSize, NULL)) { if (!ReadFile(h, buffer, sizeof(buffer), &rSize, NULL)) {

View File

@ -303,7 +303,7 @@ static void ToValidLabel(WCHAR* name, BOOL bFAT)
} }
// Needed for disk by label isolinux.cfg workaround // Needed for disk by label isolinux.cfg workaround
wchar_to_utf8_no_alloc(name, iso_report.usb_label, sizeof(iso_report.usb_label)); wchar_to_utf8_no_alloc(name, img_report.usb_label, sizeof(img_report.usb_label));
} }
/* /*
@ -929,21 +929,21 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
// Syslinux // Syslinux
if ( (bt == BT_SYSLINUX_V4) || (bt == BT_SYSLINUX_V6) || if ( (bt == BT_SYSLINUX_V4) || (bt == BT_SYSLINUX_V6) ||
((bt == BT_ISO) && (HAS_SYSLINUX(iso_report)) && (IS_FAT(fs))) ) { ((bt == BT_ISO) && (HAS_SYSLINUX(img_report)) && (IS_FAT(fs))) ) {
uprintf(using_msg, "Syslinux"); uprintf(using_msg, "Syslinux");
r = write_syslinux_mbr(fp); r = write_syslinux_mbr(fp);
goto notify; goto notify;
} }
// Grub 2.0 // Grub 2.0
if ( ((bt == BT_ISO) && (iso_report.has_grub2)) || (bt == BT_GRUB2) ) { if ( ((bt == BT_ISO) && (img_report.has_grub2)) || (bt == BT_GRUB2) ) {
uprintf(using_msg, "Grub 2.0"); uprintf(using_msg, "Grub 2.0");
r = write_grub2_mbr(fp); r = write_grub2_mbr(fp);
goto notify; goto notify;
} }
// Grub4DOS // Grub4DOS
if ( ((bt == BT_ISO) && (iso_report.has_grub4dos)) || (bt == BT_GRUB4DOS) ) { if ( ((bt == BT_ISO) && (img_report.has_grub4dos)) || (bt == BT_GRUB4DOS) ) {
uprintf(using_msg, "Grub4DOS"); uprintf(using_msg, "Grub4DOS");
r = write_grub_mbr(fp); r = write_grub_mbr(fp);
goto notify; goto notify;
@ -957,7 +957,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
} }
// KolibriOS // KolibriOS
if ( (bt == BT_ISO) && (iso_report.has_kolibrios) && (IS_FAT(fs))) { if ( (bt == BT_ISO) && (img_report.has_kolibrios) && (IS_FAT(fs))) {
uprintf(using_msg, "KolibriOS"); uprintf(using_msg, "KolibriOS");
r = write_kolibri_mbr(fp); r = write_kolibri_mbr(fp);
goto notify; goto notify;
@ -965,7 +965,7 @@ static BOOL WriteMBR(HANDLE hPhysicalDrive)
// If everything else failed, fall back to a conventional Windows/Rufus MBR // If everything else failed, fall back to a conventional Windows/Rufus MBR
windows_mbr: windows_mbr:
if ((IS_WINPE(iso_report.winpe) && !iso_report.uses_minint) || (IsChecked(IDC_RUFUS_MBR))) { if ((IS_WINPE(img_report.winpe) && !img_report.uses_minint) || (IsChecked(IDC_RUFUS_MBR))) {
uprintf(using_msg, APPLICATION_NAME); uprintf(using_msg, APPLICATION_NAME);
r = write_rufus_mbr(fp); r = write_rufus_mbr(fp);
} else { } else {
@ -1002,10 +1002,10 @@ static BOOL WriteSBR(HANDLE hPhysicalDrive)
(DWORD)(SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack) : 1024 * 1024; (DWORD)(SelectedDrive.Geometry.BytesPerSector * SelectedDrive.Geometry.SectorsPerTrack) : 1024 * 1024;
max_size -= mbr_size; max_size -= mbr_size;
// Syslinux has precedence over Grub // Syslinux has precedence over Grub
if ((bt == BT_ISO) && (!HAS_SYSLINUX(iso_report))) { if ((bt == BT_ISO) && (!HAS_SYSLINUX(img_report))) {
if (iso_report.has_grub4dos) if (img_report.has_grub4dos)
bt = BT_GRUB4DOS; bt = BT_GRUB4DOS;
if (iso_report.has_grub2) if (img_report.has_grub2)
bt = BT_GRUB2; bt = BT_GRUB2;
} }
@ -1056,7 +1056,7 @@ static __inline const char* bt_to_name(int bt) {
case BT_FREEDOS: return "FreeDOS"; case BT_FREEDOS: return "FreeDOS";
case BT_REACTOS: return "ReactOS"; case BT_REACTOS: return "ReactOS";
default: default:
return ((bt==BT_ISO)&&(iso_report.has_kolibrios))?"KolibriOS":"Standard"; return ((bt==BT_ISO)&&(img_report.has_kolibrios))?"KolibriOS":"Standard";
} }
} }
static BOOL WritePBR(HANDLE hLogicalVolume) static BOOL WritePBR(HANDLE hLogicalVolume)
@ -1082,7 +1082,7 @@ static BOOL WritePBR(HANDLE hLogicalVolume)
if (!write_fat_16_fd_br(fp, 0)) break; if (!write_fat_16_fd_br(fp, 0)) break;
} else if (bt == BT_REACTOS) { } else if (bt == BT_REACTOS) {
if (!write_fat_16_ros_br(fp, 0)) break; if (!write_fat_16_ros_br(fp, 0)) break;
} else if ((bt == BT_ISO) && (iso_report.has_kolibrios)) { } else if ((bt == BT_ISO) && (img_report.has_kolibrios)) {
uprintf("FAT16 is not supported for KolibriOS\n"); break; uprintf("FAT16 is not supported for KolibriOS\n"); break;
} else { } else {
if (!write_fat_16_br(fp, 0)) break; if (!write_fat_16_br(fp, 0)) break;
@ -1104,7 +1104,7 @@ static BOOL WritePBR(HANDLE hLogicalVolume)
if (!write_fat_32_fd_br(fp, 0)) break; if (!write_fat_32_fd_br(fp, 0)) break;
} else if (bt == BT_REACTOS) { } else if (bt == BT_REACTOS) {
if (!write_fat_32_ros_br(fp, 0)) break; if (!write_fat_32_ros_br(fp, 0)) break;
} else if ((bt == BT_ISO) && (iso_report.has_kolibrios)) { } else if ((bt == BT_ISO) && (img_report.has_kolibrios)) {
if (!write_fat_32_kos_br(fp, 0)) break; if (!write_fat_32_kos_br(fp, 0)) break;
} else { } else {
if (!write_fat_32_br(fp, 0)) break; if (!write_fat_32_br(fp, 0)) break;
@ -1152,7 +1152,7 @@ static BOOL SetupWinPE(char drive_letter)
BOOL r = FALSE; BOOL r = FALSE;
char* buf = NULL; char* buf = NULL;
index = ((iso_report.winpe&WINPE_I386) == WINPE_I386)?0:1; index = ((img_report.winpe&WINPE_I386) == WINPE_I386)?0:1;
// Allow other values than harddisk 1, as per user choice for disk ID // Allow other values than harddisk 1, as per user choice for disk ID
safe_sprintf(setupsrcdev, sizeof(setupsrcdev), safe_sprintf(setupsrcdev, sizeof(setupsrcdev),
"SetupSourceDevice = \"\\device\\harddisk%d\\partition1\"", ComboBox_GetCurSel(hDiskID)); "SetupSourceDevice = \"\\device\\harddisk%d\\partition1\"", ComboBox_GetCurSel(hDiskID));
@ -1160,7 +1160,7 @@ static BOOL SetupWinPE(char drive_letter)
safe_sprintf(src, sizeof(src), "%c:\\%s\\ntdetect.com", drive_letter, basedir[index]); safe_sprintf(src, sizeof(src), "%c:\\%s\\ntdetect.com", drive_letter, basedir[index]);
safe_sprintf(dst, sizeof(dst), "%c:\\ntdetect.com", drive_letter); safe_sprintf(dst, sizeof(dst), "%c:\\ntdetect.com", drive_letter);
CopyFileA(src, dst, TRUE); CopyFileA(src, dst, TRUE);
if (!iso_report.uses_minint) { if (!img_report.uses_minint) {
// Create a copy of txtsetup.sif, as we want to keep the i386 files unmodified // Create a copy of txtsetup.sif, as we want to keep the i386 files unmodified
safe_sprintf(src, sizeof(src), "%c:\\%s\\txtsetup.sif", drive_letter, basedir[index]); safe_sprintf(src, sizeof(src), "%c:\\%s\\txtsetup.sif", drive_letter, basedir[index]);
safe_sprintf(dst, sizeof(dst), "%c:\\txtsetup.sif", drive_letter); safe_sprintf(dst, sizeof(dst), "%c:\\txtsetup.sif", drive_letter);
@ -1182,11 +1182,11 @@ static BOOL SetupWinPE(char drive_letter)
// \minint with /minint option doesn't require further processing => return true // \minint with /minint option doesn't require further processing => return true
// \minint and no \i386 without /minint is unclear => return error // \minint and no \i386 without /minint is unclear => return error
if (iso_report.winpe&WINPE_MININT) { if (img_report.winpe&WINPE_MININT) {
if (iso_report.uses_minint) { if (img_report.uses_minint) {
uprintf("Detected \\minint directory with /minint option: nothing to patch\n"); uprintf("Detected \\minint directory with /minint option: nothing to patch\n");
r = TRUE; r = TRUE;
} else if (!(iso_report.winpe&WINPE_I386)) { } else if (!(img_report.winpe&WINPE_I386)) {
uprintf("Detected \\minint directory only but no /minint option: not sure what to do\n"); uprintf("Detected \\minint directory only but no /minint option: not sure what to do\n");
} }
goto out; goto out;
@ -1231,7 +1231,7 @@ static BOOL SetupWinPE(char drive_letter)
} }
} }
if (!iso_report.uses_minint) { if (!img_report.uses_minint) {
// Additional setupldr.bin/bootmgr patching // Additional setupldr.bin/bootmgr patching
for (i=0; i<size-32; i++) { for (i=0; i<size-32; i++) {
// rdisk(0) -> rdisk(#) disk masquerading // rdisk(0) -> rdisk(#) disk masquerading
@ -1310,7 +1310,7 @@ BOOL SetupWinToGo(const char* drive_name, BOOL use_ms_efi)
uprintf("Mounted ISO as '%s'", mounted_iso); uprintf("Mounted ISO as '%s'", mounted_iso);
// Now we use the WIM API to apply that image // Now we use the WIM API to apply that image
static_sprintf(image, "%s%s", mounted_iso, &iso_report.install_wim_path[2]); static_sprintf(image, "%s%s", mounted_iso, &img_report.install_wim_path[2]);
if (!WimApplyImage(image, 1, drive_name)) { if (!WimApplyImage(image, 1, drive_name)) {
uprintf("Failed to apply Windows To Go image"); uprintf("Failed to apply Windows To Go image");
if (!IS_ERROR(FormatStatus)) if (!IS_ERROR(FormatStatus))
@ -1460,7 +1460,7 @@ void update_progress(const uint64_t processed_bytes)
{ {
if (GetTickCount() > LastRefresh + 25) { if (GetTickCount() > LastRefresh + 25) {
LastRefresh = GetTickCount(); LastRefresh = GetTickCount();
format_percent = (100.0f*processed_bytes)/(1.0f*iso_report.projected_size); format_percent = (100.0f*processed_bytes)/(1.0f*img_report.projected_size);
PrintInfo(0, MSG_261, format_percent); PrintInfo(0, MSG_261, format_percent);
UpdateProgress(OP_FORMAT, format_percent); UpdateProgress(OP_FORMAT, format_percent);
} }
@ -1509,14 +1509,14 @@ DWORD WINAPI FormatThread(void* param)
pt = GETPARTTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); pt = GETPARTTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
tt = GETTARGETTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); tt = GETTARGETTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
use_large_fat32 = (fs == FS_FAT32) && ((SelectedDrive.DiskSize > LARGE_FAT32_SIZE) || (force_large_fat32)); use_large_fat32 = (fs == FS_FAT32) && ((SelectedDrive.DiskSize > LARGE_FAT32_SIZE) || (force_large_fat32));
windows_to_go = (togo_mode) && HAS_TOGO(iso_report) && (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED); windows_to_go = (togo_mode) && HAS_TOGO(img_report) && (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED);
// Find out if we need to add any extra partitions // Find out if we need to add any extra partitions
if ((windows_to_go) && (tt == TT_UEFI) && (pt == PARTITION_STYLE_GPT)) if ((windows_to_go) && (tt == TT_UEFI) && (pt == PARTITION_STYLE_GPT))
// According to Microsoft, every GPT disk (we RUN Windows from) must have an MSR due to not having hidden sectors // According to Microsoft, every GPT disk (we RUN Windows from) must have an MSR due to not having hidden sectors
// http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535.aspx#gpt_faq_what_disk_require_msr // http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535.aspx#gpt_faq_what_disk_require_msr
extra_partitions = XP_MSR | XP_EFI; extra_partitions = XP_MSR | XP_EFI;
else if ( (fs == FS_NTFS) && ((bt == BT_UEFI_NTFS) || else if ( (fs == FS_NTFS) && ((bt == BT_UEFI_NTFS) ||
((bt == BT_ISO) && (iso_report.has_efi) && ((tt == TT_UEFI) || (windows_to_go) || (allow_dual_uefi_bios)))) ) ((bt == BT_ISO) && (img_report.has_efi) && ((tt == TT_UEFI) || (windows_to_go) || (allow_dual_uefi_bios)))) )
extra_partitions = XP_UEFI_NTFS; extra_partitions = XP_UEFI_NTFS;
else if (IsChecked(IDC_EXTRA_PARTITION)) else if (IsChecked(IDC_EXTRA_PARTITION))
extra_partitions = XP_COMPAT; extra_partitions = XP_COMPAT;
@ -1674,10 +1674,10 @@ DWORD WINAPI FormatThread(void* param)
} }
LastRefresh = 0; LastRefresh = 0;
if (iso_report.compression_type != BLED_COMPRESSION_NONE) { if (img_report.compression_type != BLED_COMPRESSION_NONE) {
uprintf("Writing Compressed Image..."); uprintf("Writing Compressed Image...");
bled_init(_uprintf, update_progress, &FormatStatus); bled_init(_uprintf, update_progress, &FormatStatus);
bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, iso_report.compression_type); bled_uncompress_with_handles(hSourceImage, hPhysicalDrive, img_report.compression_type);
bled_exit(); bled_exit();
} else { } else {
uprintf("Writing Image..."); uprintf("Writing Image...");
@ -1706,13 +1706,13 @@ DWORD WINAPI FormatThread(void* param)
break; break;
if (GetTickCount() > LastRefresh + 25) { if (GetTickCount() > LastRefresh + 25) {
LastRefresh = GetTickCount(); LastRefresh = GetTickCount();
format_percent = (100.0f*wb)/(1.0f*iso_report.projected_size); format_percent = (100.0f*wb)/(1.0f*img_report.projected_size);
PrintInfo(0, MSG_261, format_percent); PrintInfo(0, MSG_261, format_percent);
UpdateProgress(OP_FORMAT, format_percent); UpdateProgress(OP_FORMAT, format_percent);
} }
// Don't overflow our projected size (mostly for VHDs) // Don't overflow our projected size (mostly for VHDs)
if (wb + rSize > iso_report.projected_size) { if (wb + rSize > img_report.projected_size) {
rSize = (DWORD)(iso_report.projected_size - wb); rSize = (DWORD)(img_report.projected_size - wb);
} }
// WriteFile fails unless the size is a multiple of sector size // WriteFile fails unless the size is a multiple of sector size
if (rSize % SectorSize != 0) if (rSize % SectorSize != 0)
@ -1826,13 +1826,13 @@ DWORD WINAPI FormatThread(void* param)
// All good // All good
} else if (tt == TT_UEFI) { } else if (tt == TT_UEFI) {
// For once, no need to do anything - just check our sanity // For once, no need to do anything - just check our sanity
if ( (bt != BT_ISO) || (!iso_report.has_efi) || (fs > FS_NTFS) ) { if ( (bt != BT_ISO) || (!img_report.has_efi) || (fs > FS_NTFS) ) {
uprintf("Spock gone crazy error!\n"); uprintf("Spock gone crazy error!\n");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE;
goto out; goto out;
} }
} else if ( (bt == BT_SYSLINUX_V4) || (bt == BT_SYSLINUX_V6) || } else if ( (bt == BT_SYSLINUX_V4) || (bt == BT_SYSLINUX_V6) ||
((bt == BT_ISO) && (HAS_SYSLINUX(iso_report) || IS_REACTOS(iso_report)) && ((bt == BT_ISO) && (HAS_SYSLINUX(img_report) || IS_REACTOS(img_report)) &&
(!allow_dual_uefi_bios) && (IS_FAT(fs))) ) { (!allow_dual_uefi_bios) && (IS_FAT(fs))) ) {
if (!InstallSyslinux(DriveIndex, drive_name[0], fs)) { if (!InstallSyslinux(DriveIndex, drive_name[0], fs)) {
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE; FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|ERROR_INSTALL_FAILURE;
@ -1902,7 +1902,7 @@ DWORD WINAPI FormatThread(void* param)
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_EXTRACT); FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_ISO_EXTRACT);
goto out; goto out;
} }
if (iso_report.has_kolibrios) { if (img_report.has_kolibrios) {
kolibri_dst[0] = drive_name[0]; kolibri_dst[0] = drive_name[0];
uprintf("Installing: %s (KolibriOS loader)\n", kolibri_dst); uprintf("Installing: %s (KolibriOS loader)\n", kolibri_dst);
if (ExtractISOFile(image_path, "HD_Load/USB_Boot/MTLD_F32", kolibri_dst, if (ExtractISOFile(image_path, "HD_Load/USB_Boot/MTLD_F32", kolibri_dst,
@ -1911,9 +1911,9 @@ DWORD WINAPI FormatThread(void* param)
} }
} }
// EFI mode selected, with no 'boot###.efi' but Windows 7 x64's 'bootmgr.efi' (bit #0) // EFI mode selected, with no 'boot###.efi' but Windows 7 x64's 'bootmgr.efi' (bit #0)
if ((tt == TT_UEFI) && IS_WIN7_EFI(iso_report)) { if ((tt == TT_UEFI) && IS_WIN7_EFI(img_report)) {
PrintInfoDebug(0, MSG_232); PrintInfoDebug(0, MSG_232);
iso_report.install_wim_path[0] = drive_name[0]; img_report.install_wim_path[0] = drive_name[0];
efi_dst[0] = drive_name[0]; efi_dst[0] = drive_name[0];
efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = 0; efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = 0;
if (!CreateDirectoryA(efi_dst, 0)) { if (!CreateDirectoryA(efi_dst, 0)) {
@ -1921,13 +1921,13 @@ DWORD WINAPI FormatThread(void* param)
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH); FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH);
} else { } else {
efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = '\\'; efi_dst[sizeof(efi_dst) - sizeof("\\bootx64.efi")] = '\\';
if (!WimExtractFile(iso_report.install_wim_path, 1, "Windows\\Boot\\EFI\\bootmgfw.efi", efi_dst)) { if (!WimExtractFile(img_report.install_wim_path, 1, "Windows\\Boot\\EFI\\bootmgfw.efi", efi_dst)) {
uprintf("Failed to setup Win7 EFI boot\n"); uprintf("Failed to setup Win7 EFI boot\n");
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH); FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH);
} }
} }
} }
if ( (tt == TT_BIOS) && (IS_WINPE(iso_report.winpe)) ) { if ( (tt == TT_BIOS) && (IS_WINPE(img_report.winpe)) ) {
// Apply WinPe fixup // Apply WinPe fixup
if (!SetupWinPE(drive_name[0])) if (!SetupWinPE(drive_name[0]))
FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH); FormatStatus = ERROR_SEVERITY_ERROR|FAC(FACILITY_STORAGE)|APPERR(ERROR_CANT_PATCH);

152
src/iso.c
View File

@ -60,7 +60,7 @@ typedef struct {
BOOLEAN is_old_c32[NB_OLD_C32]; BOOLEAN is_old_c32[NB_OLD_C32];
} EXTRACT_PROPS; } EXTRACT_PROPS;
RUFUS_ISO_REPORT iso_report; RUFUS_IMG_REPORT img_report;
int64_t iso_blocking_status = -1; int64_t iso_blocking_status = -1;
BOOL enable_iso = TRUE, enable_joliet = TRUE, enable_rockridge = TRUE, preserve_timestamps = FALSE, has_ldlinux_c32; BOOL enable_iso = TRUE, enable_joliet = TRUE, enable_rockridge = TRUE, preserve_timestamps = FALSE, has_ldlinux_c32;
#define ISO_BLOCKING(x) do {x; iso_blocking_status++; } while(0) #define ISO_BLOCKING(x) do {x; iso_blocking_status++; } while(0)
@ -144,7 +144,7 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
if (safe_stricmp(psz_basename, syslinux_cfg[i]) == 0) { if (safe_stricmp(psz_basename, syslinux_cfg[i]) == 0) {
props->is_syslinux_cfg = TRUE; props->is_syslinux_cfg = TRUE;
if ((scan_only) && (i == 1) && (safe_stricmp(psz_dirname, efi_dirname) == 0)) if ((scan_only) && (i == 1) && (safe_stricmp(psz_dirname, efi_dirname) == 0))
iso_report.has_efi_syslinux = TRUE; img_report.has_efi_syslinux = TRUE;
} }
} }
@ -157,7 +157,7 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
// Check for the Grub config file // Check for the Grub config file
if (scan_only) { if (scan_only) {
if ((safe_stricmp(psz_dirname, grub_dirname) == 0) && (safe_stricmp(psz_basename, grub_cfg) == 0)) if ((safe_stricmp(psz_dirname, grub_dirname) == 0) && (safe_stricmp(psz_basename, grub_cfg) == 0))
iso_report.has_grub2 = TRUE; img_report.has_grub2 = TRUE;
} else if (safe_stricmp(psz_basename, grub_cfg) == 0) { } else if (safe_stricmp(psz_basename, grub_cfg) == 0) {
props->is_grub_cfg = TRUE; props->is_grub_cfg = TRUE;
} }
@ -171,35 +171,35 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
// Check for various files in root (psz_dirname = "") // Check for various files in root (psz_dirname = "")
if (*psz_dirname == 0) { if (*psz_dirname == 0) {
if (safe_strnicmp(psz_basename, bootmgr_efi_name, safe_strlen(bootmgr_efi_name)-5) == 0) { if (safe_strnicmp(psz_basename, bootmgr_efi_name, safe_strlen(bootmgr_efi_name)-5) == 0) {
iso_report.has_bootmgr = TRUE; img_report.has_bootmgr = TRUE;
} }
if (safe_stricmp(psz_basename, grldr_name) == 0) { if (safe_stricmp(psz_basename, grldr_name) == 0) {
iso_report.has_grub4dos = TRUE; img_report.has_grub4dos = TRUE;
} }
if (safe_stricmp(psz_basename, kolibri_name) == 0) { if (safe_stricmp(psz_basename, kolibri_name) == 0) {
iso_report.has_kolibrios = TRUE; img_report.has_kolibrios = TRUE;
} }
if (safe_stricmp(psz_basename, bootmgr_efi_name) == 0) { if (safe_stricmp(psz_basename, bootmgr_efi_name) == 0) {
iso_report.has_efi |= 1; img_report.has_efi |= 1;
} }
} }
// Check for ReactOS' setupldr.sys anywhere // Check for ReactOS' setupldr.sys anywhere
if ((iso_report.reactos_path[0] == 0) && (safe_stricmp(psz_basename, reactos_name) == 0)) if ((img_report.reactos_path[0] == 0) && (safe_stricmp(psz_basename, reactos_name) == 0))
safe_strcpy(iso_report.reactos_path, sizeof(iso_report.reactos_path), psz_fullpath); safe_strcpy(img_report.reactos_path, sizeof(img_report.reactos_path), psz_fullpath);
// Check for the EFI boot entries // Check for the EFI boot entries
if (safe_stricmp(psz_dirname, efi_dirname) == 0) { if (safe_stricmp(psz_dirname, efi_dirname) == 0) {
for (i=0; i<ARRAYSIZE(efi_bootname); i++) for (i=0; i<ARRAYSIZE(efi_bootname); i++)
if (safe_stricmp(psz_basename, efi_bootname[i]) == 0) if (safe_stricmp(psz_basename, efi_bootname[i]) == 0)
iso_report.has_efi |= (2<<i); // start at 2 since "bootmgr.efi" is bit 0 img_report.has_efi |= (2<<i); // start at 2 since "bootmgr.efi" is bit 0
} }
// Check for "install.wim" or "install.swm" in "/sources" // Check for "install.wim" or "install.swm" in "/sources"
if ((install_wim_path != NULL) && (safe_stricmp(psz_dirname, install_wim_path) == 0)) { if ((install_wim_path != NULL) && (safe_stricmp(psz_dirname, install_wim_path) == 0)) {
for (i=0; i<ARRAYSIZE(install_wim_name); i++) for (i=0; i<ARRAYSIZE(install_wim_name); i++)
if (safe_stricmp(psz_basename, install_wim_name[i]) == 0) if (safe_stricmp(psz_basename, install_wim_name[i]) == 0)
static_sprintf(iso_report.install_wim_path, "?:\\%s\\%s", &install_wim_path[1], install_wim_name[i]); static_sprintf(img_report.install_wim_path, "?:\\%s\\%s", &install_wim_path[1], install_wim_name[i]);
} }
// Check for PE (XP) specific files in "/i386" or "/minint" // Check for PE (XP) specific files in "/i386" or "/minint"
@ -207,7 +207,7 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
if (safe_stricmp(psz_dirname, pe_dirname[i]) == 0) if (safe_stricmp(psz_dirname, pe_dirname[i]) == 0)
for (j=0; j<ARRAYSIZE(pe_file); j++) for (j=0; j<ARRAYSIZE(pe_file); j++)
if (safe_stricmp(psz_basename, pe_file[j]) == 0) if (safe_stricmp(psz_basename, pe_file[j]) == 0)
iso_report.winpe |= (1<<i)<<(ARRAYSIZE(pe_dirname)*j); img_report.winpe |= (1<<i)<<(ARRAYSIZE(pe_dirname)*j);
if (props->is_syslinux_cfg) { if (props->is_syslinux_cfg) {
// Maintain a list of all the isolinux/syslinux configs identified so far // Maintain a list of all the isolinux/syslinux configs identified so far
@ -220,10 +220,10 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
for (i=0; i<NB_OLD_C32; i++) { for (i=0; i<NB_OLD_C32; i++) {
if (props->is_old_c32[i]) if (props->is_old_c32[i])
iso_report.has_old_c32[i] = TRUE; img_report.has_old_c32[i] = TRUE;
} }
if (i_file_length >= FOUR_GIGABYTES) if (i_file_length >= FOUR_GIGABYTES)
iso_report.has_4GB_file = TRUE; img_report.has_4GB_file = TRUE;
// Compute projected size needed // Compute projected size needed
total_blocks += i_file_length/UDF_BLOCKSIZE; total_blocks += i_file_length/UDF_BLOCKSIZE;
// NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE // NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE
@ -255,8 +255,8 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
// Workaround for config files requiring an ISO label for kernel append that may be // Workaround for config files requiring an ISO label for kernel append that may be
// different from our USB label. Oh, and these labels must have spaces converted to \x20. // different from our USB label. Oh, and these labels must have spaces converted to \x20.
if ((props->is_syslinux_cfg) || (props->is_grub_cfg)) { if ((props->is_syslinux_cfg) || (props->is_grub_cfg)) {
iso_label = replace_char(iso_report.label, ' ', "\\x20"); iso_label = replace_char(img_report.label, ' ', "\\x20");
usb_label = replace_char(iso_report.usb_label, ' ', "\\x20"); usb_label = replace_char(img_report.usb_label, ' ', "\\x20");
if ((iso_label != NULL) && (usb_label != NULL)) { if ((iso_label != NULL) && (usb_label != NULL)) {
if (replace_in_token_data(src, (props->is_syslinux_cfg) ? "append" : "linuxefi", iso_label, usb_label, TRUE) != NULL) if (replace_in_token_data(src, (props->is_syslinux_cfg) ? "append" : "linuxefi", iso_label, usb_label, TRUE) != NULL)
uprintf(" Patched %s: '%s' ⇨ '%s'\n", src, iso_label, usb_label); uprintf(" Patched %s: '%s' ⇨ '%s'\n", src, iso_label, usb_label);
@ -268,7 +268,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
// Fix dual BIOS + EFI support for tails and other ISOs // Fix dual BIOS + EFI support for tails and other ISOs
if ( (props->is_syslinux_cfg) && (safe_stricmp(psz_path, efi_dirname) == 0) && if ( (props->is_syslinux_cfg) && (safe_stricmp(psz_path, efi_dirname) == 0) &&
(safe_stricmp(psz_basename, syslinux_cfg[0]) == 0) && (safe_stricmp(psz_basename, syslinux_cfg[0]) == 0) &&
(!iso_report.has_efi_syslinux) && (dst = safe_strdup(src)) ) { (!img_report.has_efi_syslinux) && (dst = safe_strdup(src)) ) {
dst[nul_pos-12] = 's'; dst[nul_pos-11] = 'y'; dst[nul_pos-10] = 's'; dst[nul_pos-12] = 's'; dst[nul_pos-11] = 'y'; dst[nul_pos-10] = 's';
CopyFileA(src, dst, TRUE); CopyFileA(src, dst, TRUE);
uprintf("Duplicated %s to %s\n", src, dst); uprintf("Duplicated %s to %s\n", src, dst);
@ -280,8 +280,8 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
iso_label = malloc(MAX_PATH); iso_label = malloc(MAX_PATH);
usb_label = malloc(MAX_PATH); usb_label = malloc(MAX_PATH);
if ((iso_label != NULL) && (usb_label != NULL)) { if ((iso_label != NULL) && (usb_label != NULL)) {
safe_sprintf(iso_label, MAX_PATH, "cd9660:/dev/iso9660/%s", iso_report.label); safe_sprintf(iso_label, MAX_PATH, "cd9660:/dev/iso9660/%s", img_report.label);
safe_sprintf(usb_label, MAX_PATH, "msdosfs:/dev/msdosfs/%s", iso_report.usb_label); safe_sprintf(usb_label, MAX_PATH, "msdosfs:/dev/msdosfs/%s", img_report.usb_label);
if (replace_in_token_data(src, "set", iso_label, usb_label, TRUE) != NULL) if (replace_in_token_data(src, "set", iso_label, usb_label, TRUE) != NULL)
uprintf(" Patched %s: '%s' ⇨ '%s'\n", src, iso_label, usb_label); uprintf(" Patched %s: '%s' ⇨ '%s'\n", src, iso_label, usb_label);
} }
@ -513,12 +513,12 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
if ((p_statbuf->rr.b3_rock == yep) && enable_rockridge) { if ((p_statbuf->rr.b3_rock == yep) && enable_rockridge) {
safe_strcpy(psz_basename, sizeof(psz_fullpath)-i_length-1, p_statbuf->filename); safe_strcpy(psz_basename, sizeof(psz_fullpath)-i_length-1, p_statbuf->filename);
if (safe_strlen(p_statbuf->filename) > 64) if (safe_strlen(p_statbuf->filename) > 64)
iso_report.has_long_filename = TRUE; img_report.has_long_filename = TRUE;
// libcdio has a memleak for Rock Ridge symlinks. It doesn't look like there's an easy fix there as // libcdio has a memleak for Rock Ridge symlinks. It doesn't look like there's an easy fix there as
// a generic list that's unaware of RR extensions is being used, so we prevent that memleak ourselves // a generic list that's unaware of RR extensions is being used, so we prevent that memleak ourselves
is_symlink = (p_statbuf->rr.psz_symlink != NULL); is_symlink = (p_statbuf->rr.psz_symlink != NULL);
if (is_symlink) if (is_symlink)
iso_report.has_symlinks = TRUE; img_report.has_symlinks = TRUE;
if (scan_only) if (scan_only)
safe_free(p_statbuf->rr.psz_symlink); safe_free(p_statbuf->rr.psz_symlink);
} else { } else {
@ -623,12 +623,12 @@ void GetGrubVersion(char* buf, size_t buf_size)
for (i=0; i<buf_size; i++) { for (i=0; i<buf_size; i++) {
if (memcmp(&buf[i], grub_version_str, sizeof(grub_version_str)) == 0) { if (memcmp(&buf[i], grub_version_str, sizeof(grub_version_str)) == 0) {
safe_strcpy(iso_report.grub2_version, sizeof(iso_report.grub2_version), &buf[i + sizeof(grub_version_str)]); safe_strcpy(img_report.grub2_version, sizeof(img_report.grub2_version), &buf[i + sizeof(grub_version_str)]);
break; break;
} }
} }
// Sanitize the string // Sanitize the string
for (p = &iso_report.grub2_version[0]; *p; p++) { for (p = &img_report.grub2_version[0]; *p; p++) {
for (i=0; i<sizeof(unauthorized); i++) { for (i=0; i<sizeof(unauthorized); i++) {
if (*p == unauthorized[i]) if (*p == unauthorized[i])
*p = '_'; *p = '_';
@ -636,8 +636,8 @@ void GetGrubVersion(char* buf, size_t buf_size)
} }
// <Shakes fist angrily> "KASPERSKYYYYYY!!!..." (https://github.com/pbatard/rufus/issues/467) // <Shakes fist angrily> "KASPERSKYYYYYY!!!..." (https://github.com/pbatard/rufus/issues/467)
// But seriously, these guys should know better than "security" through obscurity... // But seriously, these guys should know better than "security" through obscurity...
if (iso_report.grub2_version[0] == '0') if (img_report.grub2_version[0] == '0')
iso_report.grub2_version[0] = 0; img_report.grub2_version[0] = 0;
} }
BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan) BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
@ -670,7 +670,7 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
uprintf("ISO analysis:"); uprintf("ISO analysis:");
SendMessage(hMainDialog, UM_PROGRESS_INIT, PBS_MARQUEE, 0); SendMessage(hMainDialog, UM_PROGRESS_INIT, PBS_MARQUEE, 0);
total_blocks = 0; total_blocks = 0;
memset(&iso_report, 0, sizeof(iso_report)); memset(&img_report, 0, sizeof(img_report));
has_ldlinux_c32 = FALSE; has_ldlinux_c32 = FALSE;
// String array of all isolinux/syslinux locations // String array of all isolinux/syslinux locations
StrArrayCreate(&config_path, 8); StrArrayCreate(&config_path, 8);
@ -701,8 +701,8 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
goto out; goto out;
} }
if (scan_only) { if (scan_only) {
if (udf_get_logical_volume_id(p_udf, iso_report.label, sizeof(iso_report.label)) <= 0) if (udf_get_logical_volume_id(p_udf, img_report.label, sizeof(img_report.label)) <= 0)
iso_report.label[0] = 0; img_report.label[0] = 0;
} }
r = udf_extract_files(p_udf, p_udf_root, ""); r = udf_extract_files(p_udf, p_udf_root, "");
goto out; goto out;
@ -711,7 +711,7 @@ try_iso:
// Perform our first scan with Joliet disabled (if Rock Ridge is enabled), so that we can find if // Perform our first scan with Joliet disabled (if Rock Ridge is enabled), so that we can find if
// there exists a Rock Ridge file with a name > 64 chars or if there are symlinks. If that is the // there exists a Rock Ridge file with a name > 64 chars or if there are symlinks. If that is the
// case then we also disable Joliet during the extract phase. // case then we also disable Joliet during the extract phase.
if ((!enable_joliet) || (enable_rockridge && (scan_only || iso_report.has_long_filename || iso_report.has_symlinks))) { if ((!enable_joliet) || (enable_rockridge && (scan_only || img_report.has_long_filename || img_report.has_symlinks))) {
iso_extension_mask &= ~ISO_EXTENSION_JOLIET; iso_extension_mask &= ~ISO_EXTENSION_JOLIET;
} }
if (!enable_rockridge) { if (!enable_rockridge) {
@ -728,10 +728,10 @@ try_iso:
i_joliet_level = iso9660_ifs_get_joliet_level(p_iso); i_joliet_level = iso9660_ifs_get_joliet_level(p_iso);
if (scan_only) { if (scan_only) {
if (iso9660_ifs_get_volume_id(p_iso, &tmp)) { if (iso9660_ifs_get_volume_id(p_iso, &tmp)) {
safe_strcpy(iso_report.label, sizeof(iso_report.label), tmp); safe_strcpy(img_report.label, sizeof(img_report.label), tmp);
safe_free(tmp); safe_free(tmp);
} else } else
iso_report.label[0] = 0; img_report.label[0] = 0;
} else { } else {
if (iso_extension_mask & (ISO_EXTENSION_JOLIET|ISO_EXTENSION_ROCK_RIDGE)) if (iso_extension_mask & (ISO_EXTENSION_JOLIET|ISO_EXTENSION_ROCK_RIDGE))
uprintf("%sThis image will be extracted using %s extensions (if present)", spacing, uprintf("%sThis image will be extracted using %s extensions (if present)", spacing,
@ -745,18 +745,18 @@ out:
iso_blocking_status = -1; iso_blocking_status = -1;
if (scan_only) { if (scan_only) {
// Remove trailing spaces from the label // Remove trailing spaces from the label
for (j=(int)safe_strlen(iso_report.label)-1; ((j>=0)&&(isspaceU(iso_report.label[j]))); j--) for (j=(int)safe_strlen(img_report.label)-1; ((j>=0)&&(isspaceU(img_report.label[j]))); j--)
iso_report.label[j] = 0; img_report.label[j] = 0;
// We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here // We use the fact that UDF_BLOCKSIZE and ISO_BLOCKSIZE are the same here
iso_report.projected_size = total_blocks * ISO_BLOCKSIZE; img_report.projected_size = total_blocks * ISO_BLOCKSIZE;
// We will link the existing isolinux.cfg from a syslinux.cfg we create // We will link the existing isolinux.cfg from a syslinux.cfg we create
// If multiple config files exist, choose the one with the shortest path // If multiple config files exist, choose the one with the shortest path
// (so that a '/syslinux.cfg' is preferred over a '/isolinux/isolinux.cfg') // (so that a '/syslinux.cfg' is preferred over a '/isolinux/isolinux.cfg')
if (!IsStrArrayEmpty(config_path)) { if (!IsStrArrayEmpty(config_path)) {
// Set the iso_report.cfg_path string to maximum length, so that we don't have to // Set the img_report.cfg_path string to maximum length, so that we don't have to
// do a special case for StrArray entry 0. // do a special case for StrArray entry 0.
memset(iso_report.cfg_path, '_', sizeof(iso_report.cfg_path)-1); memset(img_report.cfg_path, '_', sizeof(img_report.cfg_path)-1);
iso_report.cfg_path[sizeof(iso_report.cfg_path)-1] = 0; img_report.cfg_path[sizeof(img_report.cfg_path)-1] = 0;
for (i=0; i<config_path.Index; i++) { for (i=0; i<config_path.Index; i++) {
// OpenSuse based Live image have a /syslinux.cfg that doesn't work, so we enforce // OpenSuse based Live image have a /syslinux.cfg that doesn't work, so we enforce
// the use of the one in '/boot/[i386|x86_64]/loader/isolinux.cfg' if present. // the use of the one in '/boot/[i386|x86_64]/loader/isolinux.cfg' if present.
@ -765,8 +765,8 @@ out:
// See https://github.com/openSUSE/kiwi/issues/354 // See https://github.com/openSUSE/kiwi/issues/354
if ( (_stricmp(config_path.String[i], "/boot/i386/loader/isolinux.cfg") == 0) || if ( (_stricmp(config_path.String[i], "/boot/i386/loader/isolinux.cfg") == 0) ||
(_stricmp(config_path.String[i], "/boot/x86_64/loader/isolinux.cfg") == 0)) { (_stricmp(config_path.String[i], "/boot/x86_64/loader/isolinux.cfg") == 0)) {
safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.String[i]); safe_strcpy(img_report.cfg_path, sizeof(img_report.cfg_path), config_path.String[i]);
iso_report.needs_syslinux_overwrite = TRUE; img_report.needs_syslinux_overwrite = TRUE;
break; break;
} }
// Tails uses an '/EFI/BOOT/isolinux.cfg' along with a '/isolinux/isolinux.cfg' // Tails uses an '/EFI/BOOT/isolinux.cfg' along with a '/isolinux/isolinux.cfg'
@ -774,10 +774,10 @@ out:
// so for now, at equal length, always pick the latest. // so for now, at equal length, always pick the latest.
// We may have to revisit this and prefer a path that contains '/isolinux' if // We may have to revisit this and prefer a path that contains '/isolinux' if
// this hack is not enough for other images. // this hack is not enough for other images.
if (safe_strlen(iso_report.cfg_path) >= safe_strlen(config_path.String[i])) if (safe_strlen(img_report.cfg_path) >= safe_strlen(config_path.String[i]))
safe_strcpy(iso_report.cfg_path, sizeof(iso_report.cfg_path), config_path.String[i]); safe_strcpy(img_report.cfg_path, sizeof(img_report.cfg_path), config_path.String[i]);
} }
uprintf(" Will use '%s' for Syslinux", iso_report.cfg_path); uprintf(" Will use '%s' for Syslinux", img_report.cfg_path);
// Extract all of the isolinux.bin files we found to identify their versions // Extract all of the isolinux.bin files we found to identify their versions
for (i=0; i<isolinux_path.Index; i++) { for (i=0; i<isolinux_path.Index; i++) {
size = (size_t)ExtractISOFile(src_iso, isolinux_path.String[i], dot_isolinux_bin, FILE_ATTRIBUTE_NORMAL); size = (size_t)ExtractISOFile(src_iso, isolinux_path.String[i], dot_isolinux_bin, FILE_ATTRIBUTE_NORMAL);
@ -794,59 +794,59 @@ out:
fread(buf, 1, size, fd); fread(buf, 1, size, fd);
fclose(fd); fclose(fd);
sl_version = GetSyslinuxVersion(buf, size, &ext); sl_version = GetSyslinuxVersion(buf, size, &ext);
if (iso_report.sl_version == 0) { if (img_report.sl_version == 0) {
safe_strcpy(iso_report.sl_version_ext, sizeof(iso_report.sl_version_ext), ext); safe_strcpy(img_report.sl_version_ext, sizeof(img_report.sl_version_ext), ext);
iso_report.sl_version = sl_version; img_report.sl_version = sl_version;
j = (int)i; j = (int)i;
} else if ((iso_report.sl_version != sl_version) || (safe_strcmp(iso_report.sl_version_ext, ext) != 0)) { } else if ((img_report.sl_version != sl_version) || (safe_strcmp(img_report.sl_version_ext, ext) != 0)) {
uprintf(" Found conflicting %s versions:\n '%s' (%d.%02d%s) vs '%s' (%d.%02d%s)", isolinux_bin, uprintf(" Found conflicting %s versions:\n '%s' (%d.%02d%s) vs '%s' (%d.%02d%s)", isolinux_bin,
isolinux_path.String[j], SL_MAJOR(iso_report.sl_version), SL_MINOR(iso_report.sl_version), isolinux_path.String[j], SL_MAJOR(img_report.sl_version), SL_MINOR(img_report.sl_version),
iso_report.sl_version_ext, isolinux_path.String[i], SL_MAJOR(sl_version), SL_MINOR(sl_version), ext); img_report.sl_version_ext, isolinux_path.String[i], SL_MAJOR(sl_version), SL_MINOR(sl_version), ext);
} }
free(buf); free(buf);
_unlink(dot_isolinux_bin); _unlink(dot_isolinux_bin);
} }
} }
if (iso_report.sl_version != 0) { if (img_report.sl_version != 0) {
static_sprintf(iso_report.sl_version_str, "%d.%02d", static_sprintf(img_report.sl_version_str, "%d.%02d",
SL_MAJOR(iso_report.sl_version), SL_MINOR(iso_report.sl_version)); SL_MAJOR(img_report.sl_version), SL_MINOR(img_report.sl_version));
uprintf(" Detected Syslinux version: %s%s (from '%s')", uprintf(" Detected Syslinux version: %s%s (from '%s')",
iso_report.sl_version_str, iso_report.sl_version_ext, isolinux_path.String[j]); img_report.sl_version_str, img_report.sl_version_ext, isolinux_path.String[j]);
if ( (has_ldlinux_c32 && (SL_MAJOR(iso_report.sl_version) < 5)) if ( (has_ldlinux_c32 && (SL_MAJOR(img_report.sl_version) < 5))
|| (!has_ldlinux_c32 && (SL_MAJOR(iso_report.sl_version) >= 5)) ) || (!has_ldlinux_c32 && (SL_MAJOR(img_report.sl_version) >= 5)) )
uprintf(" Warning: Conflict between Isolinux version and the presence of ldlinux.c32..."); uprintf(" Warning: Conflict between Isolinux version and the presence of ldlinux.c32...");
} else { } else {
// Couldn't find a version from isolinux.bin. Force set to the versions we embed // Couldn't find a version from isolinux.bin. Force set to the versions we embed
iso_report.sl_version = embedded_sl_version[has_ldlinux_c32?1:0]; img_report.sl_version = embedded_sl_version[has_ldlinux_c32?1:0];
static_sprintf(iso_report.sl_version_str, "%d.%02d", static_sprintf(img_report.sl_version_str, "%d.%02d",
SL_MAJOR(iso_report.sl_version), SL_MINOR(iso_report.sl_version)); SL_MAJOR(img_report.sl_version), SL_MINOR(img_report.sl_version));
uprintf(" Warning: Could not detect Isolinux version - Forcing to %s (embedded)", uprintf(" Warning: Could not detect Isolinux version - Forcing to %s (embedded)",
iso_report.sl_version_str); img_report.sl_version_str);
} }
} }
if (IS_WINPE(iso_report.winpe)) { if (IS_WINPE(img_report.winpe)) {
// In case we have a WinPE 1.x based iso, we extract and parse txtsetup.sif // In case we have a WinPE 1.x based iso, we extract and parse txtsetup.sif
// during scan, to see if /minint was provided for OsLoadOptions, as it decides // during scan, to see if /minint was provided for OsLoadOptions, as it decides
// whether we should use 0x80 or 0x81 as the disk ID in the MBR // whether we should use 0x80 or 0x81 as the disk ID in the MBR
safe_sprintf(path, sizeof(path), "/%s/txtsetup.sif", safe_sprintf(path, sizeof(path), "/%s/txtsetup.sif",
basedir[((iso_report.winpe&WINPE_I386) == WINPE_I386)?0:1]); basedir[((img_report.winpe&WINPE_I386) == WINPE_I386)?0:1]);
ExtractISOFile(src_iso, path, tmp_sif, FILE_ATTRIBUTE_NORMAL); ExtractISOFile(src_iso, path, tmp_sif, FILE_ATTRIBUTE_NORMAL);
tmp = get_token_data_file("OsLoadOptions", tmp_sif); tmp = get_token_data_file("OsLoadOptions", tmp_sif);
if (tmp != NULL) { if (tmp != NULL) {
for (i=0; i<strlen(tmp); i++) for (i=0; i<strlen(tmp); i++)
tmp[i] = (char)tolower(tmp[i]); tmp[i] = (char)tolower(tmp[i]);
uprintf(" Checking txtsetup.sif:\n OsLoadOptions = %s", tmp); uprintf(" Checking txtsetup.sif:\n OsLoadOptions = %s", tmp);
iso_report.uses_minint = (strstr(tmp, "/minint") != NULL); img_report.uses_minint = (strstr(tmp, "/minint") != NULL);
} }
_unlink(tmp_sif); _unlink(tmp_sif);
safe_free(tmp); safe_free(tmp);
} }
if (HAS_INSTALL_WIM(iso_report)) { if (HAS_INSTALL_WIM(img_report)) {
iso_report.install_wim_version = GetInstallWimVersion(src_iso); img_report.install_wim_version = GetInstallWimVersion(src_iso);
} }
if (iso_report.has_grub2) { if (img_report.has_grub2) {
// In case we have a GRUB2 based iso, we extract boot/grub/i386-pc/normal.mod to parse its version // In case we have a GRUB2 based iso, we extract boot/grub/i386-pc/normal.mod to parse its version
iso_report.grub2_version[0] = 0; img_report.grub2_version[0] = 0;
if ((GetTempPathU(sizeof(path), path) != 0) && (GetTempFileNameU(path, APPLICATION_NAME, 0, path) != 0)) { if ((GetTempPathU(sizeof(path), path) != 0) && (GetTempFileNameU(path, APPLICATION_NAME, 0, path) != 0)) {
size = (size_t)ExtractISOFile(src_iso, "boot/grub/i386-pc/normal.mod", path, FILE_ATTRIBUTE_NORMAL); size = (size_t)ExtractISOFile(src_iso, "boot/grub/i386-pc/normal.mod", path, FILE_ATTRIBUTE_NORMAL);
buf = (char*)calloc(size, 1); buf = (char*)calloc(size, 1);
@ -861,21 +861,21 @@ out:
free(buf); free(buf);
_unlink(path); _unlink(path);
} }
if (iso_report.grub2_version[0] != 0) if (img_report.grub2_version[0] != 0)
uprintf(" Detected Grub version: %s", iso_report.grub2_version); uprintf(" Detected Grub version: %s", img_report.grub2_version);
else { else {
uprintf(" Could not detect Grub version"); uprintf(" Could not detect Grub version");
iso_report.has_grub2 = FALSE; img_report.has_grub2 = FALSE;
} }
} }
StrArrayDestroy(&config_path); StrArrayDestroy(&config_path);
StrArrayDestroy(&isolinux_path); StrArrayDestroy(&isolinux_path);
SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0); SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0);
} else if (HAS_SYSLINUX(iso_report)) { } else if (HAS_SYSLINUX(img_report)) {
safe_sprintf(path, sizeof(path), "%s\\syslinux.cfg", dest_dir); safe_sprintf(path, sizeof(path), "%s\\syslinux.cfg", dest_dir);
// Create a /syslinux.cfg (if none exists) that points to the existing isolinux cfg // Create a /syslinux.cfg (if none exists) that points to the existing isolinux cfg
fd = fopen(path, "r"); fd = fopen(path, "r");
if (fd != NULL && iso_report.needs_syslinux_overwrite) { if (fd != NULL && img_report.needs_syslinux_overwrite) {
fclose(fd); fclose(fd);
fd = NULL; fd = NULL;
safe_sprintf(path2, sizeof(path2), "%s\\syslinux.org", dest_dir); safe_sprintf(path2, sizeof(path2), "%s\\syslinux.org", dest_dir);
@ -888,12 +888,12 @@ out:
uprintf("Unable to create %s - booting from USB will not work", path); uprintf("Unable to create %s - booting from USB will not work", path);
r = 1; r = 1;
} else { } else {
fprintf(fd, "DEFAULT loadconfig\n\nLABEL loadconfig\n CONFIG %s\n", iso_report.cfg_path); fprintf(fd, "DEFAULT loadconfig\n\nLABEL loadconfig\n CONFIG %s\n", img_report.cfg_path);
for (i=safe_strlen(iso_report.cfg_path); (i>0)&&(iso_report.cfg_path[i]!='/'); i--); for (i=safe_strlen(img_report.cfg_path); (i>0)&&(img_report.cfg_path[i]!='/'); i--);
if (i>0) { if (i>0) {
iso_report.cfg_path[i] = 0; img_report.cfg_path[i] = 0;
fprintf(fd, " APPEND %s/\n", iso_report.cfg_path); fprintf(fd, " APPEND %s/\n", img_report.cfg_path);
iso_report.cfg_path[i] = '/'; img_report.cfg_path[i] = '/';
} }
uprintf("Created: %s", path); uprintf("Created: %s", path);
} }
@ -1022,7 +1022,7 @@ uint32_t GetInstallWimVersion(const char* iso)
udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL; udf_dirent_t *p_udf_root = NULL, *p_udf_file = NULL;
iso9660_stat_t *p_statbuf = NULL; iso9660_stat_t *p_statbuf = NULL;
wim_path = safe_strdup(&iso_report.install_wim_path[2]); wim_path = safe_strdup(&img_report.install_wim_path[2]);
for (p = wim_path; p != 0; p++) for (p = wim_path; p != 0; p++)
if (*p == '\\') *p = '/'; if (*p == '\\') *p = '/';

View File

@ -415,7 +415,7 @@ static void SetMBRForUEFI(BOOL replace)
return; return;
if (image_path != NULL) { if (image_path != NULL) {
if ( (!iso_report.has_efi) || ((iso_report.has_bootmgr) && (!allow_dual_uefi_bios) && if ( (!img_report.has_efi) || ((img_report.has_bootmgr) && (!allow_dual_uefi_bios) &&
(Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) != BST_CHECKED)) ) (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) != BST_CHECKED)) )
useCSM = TRUE; useCSM = TRUE;
} }
@ -501,7 +501,7 @@ static void SetFSFromISO(void)
int i, fs, selected_fs = FS_UNKNOWN; int i, fs, selected_fs = FS_UNKNOWN;
uint32_t fs_mask = 0; uint32_t fs_mask = 0;
int tt = GETTARGETTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); int tt = GETTARGETTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
BOOL windows_to_go = (togo_mode) && HAS_TOGO(iso_report) && BOOL windows_to_go = (togo_mode) && HAS_TOGO(img_report) &&
(Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED); (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED);
if (image_path == NULL) if (image_path == NULL)
@ -514,14 +514,14 @@ static void SetFSFromISO(void)
} }
// Syslinux and EFI have precedence over bootmgr (unless the user selected BIOS as target type) // Syslinux and EFI have precedence over bootmgr (unless the user selected BIOS as target type)
if ((HAS_SYSLINUX(iso_report)) || (IS_REACTOS(iso_report)) || (iso_report.has_kolibrios) || if ((HAS_SYSLINUX(img_report)) || (IS_REACTOS(img_report)) || (img_report.has_kolibrios) ||
((iso_report.has_efi) && (tt == TT_UEFI) && (!iso_report.has_4GB_file) && (!windows_to_go))) { ((img_report.has_efi) && (tt == TT_UEFI) && (!img_report.has_4GB_file) && (!windows_to_go))) {
if (fs_mask & (1<<FS_FAT32)) { if (fs_mask & (1<<FS_FAT32)) {
selected_fs = FS_FAT32; selected_fs = FS_FAT32;
} else if ((fs_mask & (1<<FS_FAT16)) && (!iso_report.has_kolibrios)) { } else if ((fs_mask & (1<<FS_FAT16)) && (!img_report.has_kolibrios)) {
selected_fs = FS_FAT16; selected_fs = FS_FAT16;
} }
} else if ((windows_to_go) || (iso_report.has_bootmgr) || (IS_WINPE(iso_report.winpe))) { } else if ((windows_to_go) || (img_report.has_bootmgr) || (IS_WINPE(img_report.winpe))) {
if (fs_mask & (1<<FS_NTFS)) { if (fs_mask & (1<<FS_NTFS)) {
selected_fs = FS_NTFS; selected_fs = FS_NTFS;
} }
@ -542,16 +542,16 @@ static void SetMBRProps(void)
{ {
int fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); int fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
BOOL needs_masquerading = (IS_WINPE(iso_report.winpe) && (!iso_report.uses_minint)); BOOL needs_masquerading = (IS_WINPE(img_report.winpe) && (!img_report.uses_minint));
if ((!mbr_selected_by_user) && ((image_path == NULL) || (bt != BT_ISO) || (fs != FS_NTFS) || IS_GRUB(iso_report) || if ((!mbr_selected_by_user) && ((image_path == NULL) || (bt != BT_ISO) || (fs != FS_NTFS) || IS_GRUB(img_report) ||
((togo_mode) && (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED)) )) { ((togo_mode) && (Button_GetCheck(GetDlgItem(hMainDialog, IDC_WINDOWS_TO_GO)) == BST_CHECKED)) )) {
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;
} }
uMBRChecked = (needs_masquerading || iso_report.has_bootmgr || mbr_selected_by_user)?BST_CHECKED:BST_UNCHECKED; uMBRChecked = (needs_masquerading || img_report.has_bootmgr || mbr_selected_by_user)?BST_CHECKED:BST_UNCHECKED;
if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR))) if (IsWindowEnabled(GetDlgItem(hMainDialog, IDC_RUFUS_MBR)))
CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, uMBRChecked); CheckDlgButton(hMainDialog, IDC_RUFUS_MBR, uMBRChecked);
IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, needs_masquerading?1:0)); IGNORE_RETVAL(ComboBox_SetCurSel(hDiskID, needs_masquerading?1:0));
@ -560,7 +560,7 @@ static void SetMBRProps(void)
static void SetToGo(void) static void SetToGo(void)
{ {
int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
if ( ((bt != BT_ISO) && (togo_mode)) || ((bt == BT_ISO) && (HAS_TOGO(iso_report)) && (!togo_mode)) ) if ( ((bt != BT_ISO) && (togo_mode)) || ((bt == BT_ISO) && (HAS_TOGO(img_report)) && (!togo_mode)) )
ToggleToGo(); ToggleToGo();
} }
@ -571,7 +571,7 @@ static void EnableAdvancedBootOptions(BOOL enable, BOOL remove_checkboxes)
BOOL actual_enable_fix = ((tt==TT_UEFI)||(selection_default==BT_IMG)||!IsChecked(IDC_BOOT))?FALSE:enable; BOOL actual_enable_fix = ((tt==TT_UEFI)||(selection_default==BT_IMG)||!IsChecked(IDC_BOOT))?FALSE:enable;
static UINT uXPartChecked = BST_UNCHECKED; static UINT uXPartChecked = BST_UNCHECKED;
if ((selection_default == BT_ISO) && (iso_report.has_kolibrios || IS_GRUB(iso_report) || IS_REACTOS(iso_report) || HAS_SYSLINUX(iso_report))) { if ((selection_default == BT_ISO) && (img_report.has_kolibrios || IS_GRUB(img_report) || IS_REACTOS(img_report) || HAS_SYSLINUX(img_report))) {
actual_enable_mbr = FALSE; actual_enable_mbr = FALSE;
mbr_selected_by_user = FALSE; mbr_selected_by_user = FALSE;
} }
@ -628,9 +628,9 @@ static void SetTargetSystem(void)
SetMBRForUEFI(TRUE); SetMBRForUEFI(TRUE);
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 || ((iso_report.has_efi) && } else if (SelectedDrive.has_protective_mbr || SelectedDrive.has_mbr_uefi_marker || ((img_report.has_efi) &&
(!HAS_SYSLINUX(iso_report)) && (!iso_report.has_bootmgr) && (!IS_REACTOS(iso_report)) && (!HAS_SYSLINUX(img_report)) && (!img_report.has_bootmgr) && (!IS_REACTOS(img_report)) &&
(!iso_report.has_kolibrios) && (!IS_GRUB(iso_report)) && (!IS_WINPE(iso_report.winpe))) ) { (!img_report.has_kolibrios) && (!IS_GRUB(img_report)) && (!IS_WINPE(img_report.winpe))) ) {
ts = 1; // MBR/UEFI ts = 1; // MBR/UEFI
} else { } else {
ts = 0; // MBR/BIOS|UEFI ts = 0; // MBR/BIOS|UEFI
@ -677,7 +677,7 @@ static BOOL PopulateProperties(int ComboIndex)
} }
// If no existing label is available and no ISO is selected, propose one according to the size (eg: "256MB", "8GB") // If no existing label is available and no ISO is selected, propose one according to the size (eg: "256MB", "8GB")
if ((image_path == NULL) || (iso_report.label[0] == 0)) { if ((image_path == NULL) || (img_report.label[0] == 0)) {
if ( (safe_stricmp(no_label, DriveLabel.String[ComboIndex]) == 0) if ( (safe_stricmp(no_label, DriveLabel.String[ComboIndex]) == 0)
|| (safe_stricmp(lmprintf(MSG_207), DriveLabel.String[ComboIndex]) == 0) ) { || (safe_stricmp(lmprintf(MSG_207), DriveLabel.String[ComboIndex]) == 0) ) {
SetWindowTextU(hLabel, SelectedDrive.proposed_label); SetWindowTextU(hLabel, SelectedDrive.proposed_label);
@ -685,7 +685,7 @@ static BOOL PopulateProperties(int ComboIndex)
SetWindowTextU(hLabel, DriveLabel.String[ComboIndex]); SetWindowTextU(hLabel, DriveLabel.String[ComboIndex]);
} }
} else { } else {
SetWindowTextU(hLabel, iso_report.label); SetWindowTextU(hLabel, img_report.label);
} }
return TRUE; return TRUE;
@ -979,42 +979,42 @@ static void DisplayISOProps(void)
int i; int i;
char isolinux_str[16] = "No"; char isolinux_str[16] = "No";
if (HAS_SYSLINUX(iso_report)) { if (HAS_SYSLINUX(img_report)) {
safe_sprintf(isolinux_str, sizeof(isolinux_str), "Yes (%s)", iso_report.sl_version_str); safe_sprintf(isolinux_str, sizeof(isolinux_str), "Yes (%s)", img_report.sl_version_str);
} }
// TODO: Only report features that are present // TODO: Only report features that are present
uprintf("ISO label: '%s'", iso_report.label); uprintf("ISO label: '%s'", img_report.label);
uprintf(" Size: %" PRIu64 " bytes", iso_report.projected_size); uprintf(" Size: %" PRIu64 " bytes", img_report.projected_size);
uprintf(" Has a >64 chars filename: %s", YesNo(iso_report.has_long_filename)); uprintf(" Has a >64 chars filename: %s", YesNo(img_report.has_long_filename));
uprintf(" Has Symlinks: %s", YesNo(iso_report.has_symlinks)); uprintf(" Has Symlinks: %s", YesNo(img_report.has_symlinks));
uprintf(" Has a >4GB file: %s", YesNo(iso_report.has_4GB_file)); uprintf(" Has a >4GB file: %s", YesNo(img_report.has_4GB_file));
uprintf(" Uses Bootmgr: %s", YesNo(iso_report.has_bootmgr)); uprintf(" Uses Bootmgr: %s", YesNo(img_report.has_bootmgr));
uprintf(" Uses EFI: %s%s", YesNo(iso_report.has_efi), IS_WIN7_EFI(iso_report) ? " (win7_x64)" : ""); uprintf(" Uses EFI: %s%s", YesNo(img_report.has_efi), IS_WIN7_EFI(img_report) ? " (win7_x64)" : "");
uprintf(" Uses Grub 2: %s", YesNo(iso_report.has_grub2)); uprintf(" Uses Grub 2: %s", YesNo(img_report.has_grub2));
uprintf(" Uses Grub4DOS: %s", YesNo(iso_report.has_grub4dos)); uprintf(" Uses Grub4DOS: %s", YesNo(img_report.has_grub4dos));
uprintf(" Uses isolinux: %s", isolinux_str); uprintf(" Uses isolinux: %s", isolinux_str);
if (HAS_SYSLINUX(iso_report) && (SL_MAJOR(iso_report.sl_version) < 5)) { if (HAS_SYSLINUX(img_report) && (SL_MAJOR(img_report.sl_version) < 5)) {
for (i = 0; i<NB_OLD_C32; i++) { for (i = 0; i<NB_OLD_C32; i++) {
uprintf(" With an old %s: %s\n", old_c32_name[i], iso_report.has_old_c32[i] ? "Yes" : "No"); uprintf(" With an old %s: %s\n", old_c32_name[i], img_report.has_old_c32[i] ? "Yes" : "No");
} }
} }
uprintf(" Uses KolibriOS: %s", YesNo(iso_report.has_kolibrios)); uprintf(" Uses KolibriOS: %s", YesNo(img_report.has_kolibrios));
uprintf(" Uses ReactOS: %s", YesNo(IS_REACTOS(iso_report))); uprintf(" Uses ReactOS: %s", YesNo(IS_REACTOS(img_report)));
uprintf(" Uses WinPE: %s%s", YesNo(IS_WINPE(iso_report.winpe)), (iso_report.uses_minint) ? " (with /minint)" : ""); uprintf(" Uses WinPE: %s%s", YesNo(IS_WINPE(img_report.winpe)), (img_report.uses_minint) ? " (with /minint)" : "");
if (HAS_INSTALL_WIM(iso_report)) { if (HAS_INSTALL_WIM(img_report)) {
uprintf(" Uses Install.wim: Yes (version %d.%d.%d)", (iso_report.install_wim_version >> 24) & 0xff, uprintf(" Uses Install.wim: Yes (version %d.%d.%d)", (img_report.install_wim_version >> 24) & 0xff,
(iso_report.install_wim_version >> 16) & 0xff, (iso_report.install_wim_version >> 8) & 0xff); (img_report.install_wim_version >> 16) & 0xff, (img_report.install_wim_version >> 8) & 0xff);
// Microsoft somehow managed to make their ESD WIMs incompatible with their own APIs // Microsoft somehow managed to make their ESD WIMs incompatible with their own APIs
// (yes, EVEN the Windows 10 APIs), so we must filter them out... // (yes, EVEN the Windows 10 APIs), so we must filter them out...
if (iso_report.install_wim_version >= MAX_WIM_VERSION) if (img_report.install_wim_version >= MAX_WIM_VERSION)
uprintf(" Note: This WIM version is NOT compatible with Windows To Go"); uprintf(" Note: This WIM version is NOT compatible with Windows To Go");
} }
// We don't support ToGo on Windows 7 or earlier, for lack of ISO mount capabilities // We don't support ToGo on Windows 7 or earlier, for lack of ISO mount capabilities
// TODO: add install.wim extraction workaround for Windows 7 // TODO: add install.wim extraction workaround for Windows 7
if (nWindowsVersion >= WINDOWS_8) if (nWindowsVersion >= WINDOWS_8)
if ( ((!togo_mode) && (HAS_TOGO(iso_report))) || ((togo_mode) && (!HAS_TOGO(iso_report))) ) if ( ((!togo_mode) && (HAS_TOGO(img_report))) || ((togo_mode) && (!HAS_TOGO(img_report))) )
ToggleToGo(); ToggleToGo();
} }
@ -1022,16 +1022,15 @@ static void DisplayISOProps(void)
DWORD WINAPI ISOScanThread(LPVOID param) DWORD WINAPI ISOScanThread(LPVOID param)
{ {
int i; int i;
BOOL is_iso, is_img;
if (image_path == NULL) if (image_path == NULL)
goto out; goto out;
PrintInfoDebug(0, MSG_202); PrintInfoDebug(0, MSG_202);
user_notified = FALSE; user_notified = FALSE;
EnableControls(FALSE); EnableControls(FALSE);
is_iso = ExtractISO(image_path, "", TRUE); img_report.is_iso = ExtractISO(image_path, "", TRUE);
is_img = IsHDImage(image_path); img_report.is_bootable_img = IsBootableImage(image_path);
if (!is_iso && !is_img) { if (!img_report.is_iso && !img_report.is_bootable_img) {
SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0); SendMessage(hMainDialog, UM_PROGRESS_EXIT, 0, 0);
PrintInfoDebug(0, MSG_203); PrintInfoDebug(0, MSG_203);
safe_free(image_path); safe_free(image_path);
@ -1042,20 +1041,20 @@ DWORD WINAPI ISOScanThread(LPVOID param)
goto out; goto out;
} }
if (is_img) { if (img_report.is_bootable_img) {
uprintf(" Image is a %sbootable %s image", uprintf(" Image is a %sbootable %s image",
(iso_report.compression_type != BLED_COMPRESSION_NONE) ? "compressed " : "", iso_report.is_vhd ? "VHD" : "disk"); (img_report.compression_type != BLED_COMPRESSION_NONE) ? "compressed " : "", img_report.is_vhd ? "VHD" : "disk");
selection_default = BT_IMG; selection_default = BT_IMG;
} }
if (is_iso) { if (img_report.is_iso) {
// Will override BT_IMG above for ISOHybrid // Will override BT_IMG above for ISOHybrid
selection_default = BT_ISO; selection_default = BT_ISO;
DisplayISOProps(); DisplayISOProps();
} }
// Only enable AFTER we have determined the image type // Only enable AFTER we have determined the image type
EnableControls(TRUE); EnableControls(TRUE);
if ( (!iso_report.has_bootmgr) && (!HAS_SYSLINUX(iso_report)) && (!IS_WINPE(iso_report.winpe)) && (!IS_GRUB(iso_report)) if ( (!img_report.has_bootmgr) && (!HAS_SYSLINUX(img_report)) && (!IS_WINPE(img_report.winpe)) && (!IS_GRUB(img_report))
&& (!iso_report.has_efi) && (!IS_REACTOS(iso_report) && (!iso_report.has_kolibrios) && (!iso_report.is_bootable_img)) ) { && (!img_report.has_efi) && (!IS_REACTOS(img_report) && (!img_report.has_kolibrios) && (!img_report.is_bootable_img)) ) {
PrintInfo(0, MSG_081); PrintInfo(0, MSG_081);
safe_free(image_path); safe_free(image_path);
EnableWindow(hStatusToolbar, FALSE); EnableWindow(hStatusToolbar, FALSE);
@ -1065,14 +1064,14 @@ DWORD WINAPI ISOScanThread(LPVOID param)
} else { } else {
// Enable bootable and set Target System and FS accordingly // Enable bootable and set Target System and FS accordingly
CheckDlgButton(hMainDialog, IDC_BOOT, BST_CHECKED); CheckDlgButton(hMainDialog, IDC_BOOT, BST_CHECKED);
if (!iso_report.is_bootable_img) { if (!img_report.is_bootable_img) {
SetTargetSystem(); SetTargetSystem();
SetFSFromISO(); SetFSFromISO();
SetMBRProps(); SetMBRProps();
// 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 (img_report.label[0] != 0) {
SetWindowTextU(hLabel, iso_report.label); SetWindowTextU(hLabel, img_report.label);
} }
} else { } else {
SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_FILESYSTEM, SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_FILESYSTEM,
@ -1289,16 +1288,16 @@ static BOOL BootCheck(void)
MessageBoxU(hMainDialog, lmprintf(MSG_087), lmprintf(MSG_086), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_087), lmprintf(MSG_086), MB_OK|MB_ICONERROR|MB_IS_RTL);
return FALSE; return FALSE;
} }
if ((size_check) && (iso_report.projected_size > (uint64_t)SelectedDrive.DiskSize)) { if ((size_check) && (img_report.projected_size > (uint64_t)SelectedDrive.DiskSize)) {
// This ISO image is too big for the selected target // This ISO image is too big for the selected target
MessageBoxU(hMainDialog, lmprintf(MSG_089), lmprintf(MSG_088), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_089), lmprintf(MSG_088), MB_OK|MB_ICONERROR|MB_IS_RTL);
return FALSE; return FALSE;
} }
if (bt == BT_IMG) { if (bt == BT_IMG) {
if (!iso_report.is_bootable_img) if (!img_report.is_bootable_img)
// The selected image doesn't match the boot option selected. // The selected image doesn't match the boot option selected.
MessageBoxU(hMainDialog, lmprintf(MSG_188), lmprintf(MSG_187), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_188), lmprintf(MSG_187), MB_OK|MB_ICONERROR|MB_IS_RTL);
return (iso_report.is_bootable_img); return (img_report.is_bootable_img);
} }
fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem)); fs = (int)ComboBox_GetItemData(hFileSystem, ComboBox_GetCurSel(hFileSystem));
tt = GETTARGETTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme))); tt = GETTARGETTYPE((int)ComboBox_GetItemData(hPartitionScheme, ComboBox_GetCurSel(hPartitionScheme)));
@ -1320,46 +1319,46 @@ static BOOL BootCheck(void)
return FALSE; return FALSE;
} }
} else if (tt == TT_UEFI) { } else if (tt == TT_UEFI) {
if (!iso_report.has_efi) { if (!img_report.has_efi) {
// Unsupported ISO // Unsupported ISO
MessageBoxU(hMainDialog, lmprintf(MSG_091), lmprintf(MSG_090), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_091), lmprintf(MSG_090), MB_OK|MB_ICONERROR|MB_IS_RTL);
return FALSE; return FALSE;
} }
if (IS_WIN7_EFI(iso_report) && (!WimExtractCheck())) { if (IS_WIN7_EFI(img_report) && (!WimExtractCheck())) {
// Your platform cannot extract files from WIM archives => download 7-zip? // Your platform cannot extract files from WIM archives => download 7-zip?
if (MessageBoxU(hMainDialog, lmprintf(MSG_102), lmprintf(MSG_101), MB_YESNO|MB_ICONERROR|MB_IS_RTL) == IDYES) if (MessageBoxU(hMainDialog, lmprintf(MSG_102), lmprintf(MSG_101), MB_YESNO|MB_ICONERROR|MB_IS_RTL) == IDYES)
ShellExecuteA(hMainDialog, "open", SEVENZIP_URL, NULL, NULL, SW_SHOWNORMAL); ShellExecuteA(hMainDialog, "open", SEVENZIP_URL, NULL, NULL, SW_SHOWNORMAL);
return FALSE; return FALSE;
} }
} else if ( ((fs == FS_NTFS) && (!iso_report.has_bootmgr) && (!IS_WINPE(iso_report.winpe)) && (!IS_GRUB(iso_report))) } else if ( ((fs == FS_NTFS) && (!img_report.has_bootmgr) && (!IS_WINPE(img_report.winpe)) && (!IS_GRUB(img_report)))
|| ((IS_FAT(fs)) && (!HAS_SYSLINUX(iso_report)) && (!allow_dual_uefi_bios) && || ((IS_FAT(fs)) && (!HAS_SYSLINUX(img_report)) && (!allow_dual_uefi_bios) &&
(!IS_REACTOS(iso_report)) && (!iso_report.has_kolibrios) && (!IS_GRUB(iso_report))) ) { (!IS_REACTOS(img_report)) && (!img_report.has_kolibrios) && (!IS_GRUB(img_report))) ) {
// Incompatible FS and ISO // Incompatible FS and ISO
MessageBoxU(hMainDialog, lmprintf(MSG_096), lmprintf(MSG_092), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_096), lmprintf(MSG_092), MB_OK|MB_ICONERROR|MB_IS_RTL);
return FALSE; return FALSE;
} else if ((fs == FS_FAT16) && (iso_report.has_kolibrios)) { } else if ((fs == FS_FAT16) && (img_report.has_kolibrios)) {
// KolibriOS doesn't support FAT16 // KolibriOS doesn't support FAT16
MessageBoxU(hMainDialog, lmprintf(MSG_189), lmprintf(MSG_099), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_189), lmprintf(MSG_099), MB_OK|MB_ICONERROR|MB_IS_RTL);
return FALSE; return FALSE;
} }
if ((IS_FAT(fs)) && (iso_report.has_4GB_file)) { if ((IS_FAT(fs)) && (img_report.has_4GB_file)) {
// This ISO image contains a file larger than 4GB file (FAT32) // This ISO image contains a file larger than 4GB file (FAT32)
MessageBoxU(hMainDialog, lmprintf(MSG_100), lmprintf(MSG_099), MB_OK|MB_ICONERROR|MB_IS_RTL); MessageBoxU(hMainDialog, lmprintf(MSG_100), lmprintf(MSG_099), MB_OK|MB_ICONERROR|MB_IS_RTL);
return FALSE; return FALSE;
} }
if ((iso_report.has_grub2) && (iso_report.grub2_version[0] != 0) && if ((img_report.has_grub2) && (img_report.grub2_version[0] != 0) &&
(strcmp(iso_report.grub2_version, GRUB2_PACKAGE_VERSION) != 0)) { (strcmp(img_report.grub2_version, GRUB2_PACKAGE_VERSION) != 0)) {
// We may have to download a different Grub2 version if we can find one // We may have to download a different Grub2 version if we can find one
IGNORE_RETVAL(_chdirU(app_dir)); IGNORE_RETVAL(_chdirU(app_dir));
IGNORE_RETVAL(_mkdir(FILES_DIR)); IGNORE_RETVAL(_mkdir(FILES_DIR));
IGNORE_RETVAL(_chdir(FILES_DIR)); IGNORE_RETVAL(_chdir(FILES_DIR));
static_sprintf(tmp, "%s-%s/%s", grub, iso_report.grub2_version, core_img); static_sprintf(tmp, "%s-%s/%s", grub, img_report.grub2_version, core_img);
fd = fopen(tmp, "rb"); fd = fopen(tmp, "rb");
if (fd != NULL) { if (fd != NULL) {
// If a file already exists in the current directory, use that one // If a file already exists in the current directory, use that one
uprintf("Will reuse '%s' from './" FILES_DIR "/%s-%s/' for Grub 2.x installation\n", uprintf("Will reuse '%s' from './" FILES_DIR "/%s-%s/' for Grub 2.x installation\n",
core_img, grub, iso_report.grub2_version); core_img, grub, img_report.grub2_version);
fseek(fd, 0, SEEK_END); fseek(fd, 0, SEEK_END);
grub2_len = ftell(fd); grub2_len = ftell(fd);
fseek(fd, 0, SEEK_SET); fseek(fd, 0, SEEK_SET);
@ -1373,14 +1372,14 @@ static BOOL BootCheck(void)
} }
fclose(fd); fclose(fd);
} else { } else {
r = MessageBoxU(hMainDialog, lmprintf(MSG_116, iso_report.grub2_version, GRUB2_PACKAGE_VERSION), r = MessageBoxU(hMainDialog, lmprintf(MSG_116, img_report.grub2_version, GRUB2_PACKAGE_VERSION),
lmprintf(MSG_115), MB_YESNOCANCEL|MB_ICONWARNING|MB_IS_RTL); lmprintf(MSG_115), MB_YESNOCANCEL|MB_ICONWARNING|MB_IS_RTL);
if (r == IDCANCEL) if (r == IDCANCEL)
return FALSE; return FALSE;
else if (r == IDYES) { else if (r == IDYES) {
static_sprintf(tmp, "%s-%s", grub, iso_report.grub2_version); static_sprintf(tmp, "%s-%s", grub, img_report.grub2_version);
IGNORE_RETVAL(_mkdir(tmp)); IGNORE_RETVAL(_mkdir(tmp));
static_sprintf(tmp, "%s/%s-%s/%s", FILES_URL, grub, iso_report.grub2_version, core_img); static_sprintf(tmp, "%s/%s-%s/%s", FILES_URL, grub, img_report.grub2_version, core_img);
PrintInfoDebug(0, MSG_085, tmp); PrintInfoDebug(0, MSG_085, tmp);
PromptOnError = FALSE; PromptOnError = FALSE;
grub2_len = (long)DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hMainDialog); grub2_len = (long)DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hMainDialog);
@ -1403,11 +1402,11 @@ static BOOL BootCheck(void)
} }
} }
if (HAS_SYSLINUX(iso_report)) { if (HAS_SYSLINUX(img_report)) {
if (SL_MAJOR(iso_report.sl_version) < 5) { if (SL_MAJOR(img_report.sl_version) < 5) {
IGNORE_RETVAL(_chdirU(app_dir)); IGNORE_RETVAL(_chdirU(app_dir));
for (i=0; i<NB_OLD_C32; i++) { for (i=0; i<NB_OLD_C32; i++) {
if (iso_report.has_old_c32[i]) { if (img_report.has_old_c32[i]) {
if (!in_files_dir) { if (!in_files_dir) {
IGNORE_RETVAL(_mkdir(FILES_DIR)); IGNORE_RETVAL(_mkdir(FILES_DIR));
IGNORE_RETVAL(_chdir(FILES_DIR)); IGNORE_RETVAL(_chdir(FILES_DIR));
@ -1438,16 +1437,16 @@ static BOOL BootCheck(void)
} }
} }
} }
} else if ((iso_report.sl_version != embedded_sl_version[1]) || } else if ((img_report.sl_version != embedded_sl_version[1]) ||
(safe_strcmp(iso_report.sl_version_ext, embedded_sl_version_ext[1]) != 0)) { (safe_strcmp(img_report.sl_version_ext, embedded_sl_version_ext[1]) != 0)) {
// Unlike what was the case for v4 and earlier, Syslinux v5+ versions are INCOMPATIBLE with one another! // Unlike what was the case for v4 and earlier, Syslinux v5+ versions are INCOMPATIBLE with one another!
IGNORE_RETVAL(_chdirU(app_dir)); IGNORE_RETVAL(_chdirU(app_dir));
IGNORE_RETVAL(_mkdir(FILES_DIR)); IGNORE_RETVAL(_mkdir(FILES_DIR));
IGNORE_RETVAL(_chdir(FILES_DIR)); IGNORE_RETVAL(_chdir(FILES_DIR));
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
// Check if we already have the relevant ldlinux_v#.##.sys & ldlinux_v#.##.bss files // Check if we already have the relevant ldlinux_v#.##.sys & ldlinux_v#.##.bss files
static_sprintf(tmp, "%s-%s%s/%s.%s", syslinux, iso_report.sl_version_str, static_sprintf(tmp, "%s-%s%s/%s.%s", syslinux, img_report.sl_version_str,
iso_report.sl_version_ext, ldlinux, ldlinux_ext[i]); img_report.sl_version_ext, ldlinux, ldlinux_ext[i]);
fd = fopen(tmp, "rb"); fd = fopen(tmp, "rb");
if (fd != NULL) { if (fd != NULL) {
fseek(fd, 0, SEEK_END); fseek(fd, 0, SEEK_END);
@ -1458,39 +1457,39 @@ static BOOL BootCheck(void)
if ((syslinux_ldlinux_len[0] != 0) && (syslinux_ldlinux_len[1] != 0)) { if ((syslinux_ldlinux_len[0] != 0) && (syslinux_ldlinux_len[1] != 0)) {
uprintf("Will reuse '%s.%s' and '%s.%s' from './" FILES_DIR "/%s/%s-%s%s/' for Syslinux installation\n", uprintf("Will reuse '%s.%s' and '%s.%s' from './" FILES_DIR "/%s/%s-%s%s/' for Syslinux installation\n",
ldlinux, ldlinux_ext[0], ldlinux, ldlinux_ext[1], FILES_DIR, syslinux, ldlinux, ldlinux_ext[0], ldlinux, ldlinux_ext[1], FILES_DIR, syslinux,
iso_report.sl_version_str, iso_report.sl_version_ext); img_report.sl_version_str, img_report.sl_version_ext);
} else { } else {
r = MessageBoxU(hMainDialog, lmprintf(MSG_114, iso_report.sl_version_str, iso_report.sl_version_ext, r = MessageBoxU(hMainDialog, lmprintf(MSG_114, img_report.sl_version_str, img_report.sl_version_ext,
embedded_sl_version_str[1], embedded_sl_version_ext[1]), embedded_sl_version_str[1], embedded_sl_version_ext[1]),
lmprintf(MSG_115), MB_YESNO|MB_ICONWARNING|MB_IS_RTL); lmprintf(MSG_115), MB_YESNO|MB_ICONWARNING|MB_IS_RTL);
if (r != IDYES) if (r != IDYES)
return FALSE; return FALSE;
for (i=0; i<2; i++) { for (i=0; i<2; i++) {
static_sprintf(tmp, "%s-%s", syslinux, iso_report.sl_version_str); static_sprintf(tmp, "%s-%s", syslinux, img_report.sl_version_str);
IGNORE_RETVAL(_mkdir(tmp)); IGNORE_RETVAL(_mkdir(tmp));
if (*iso_report.sl_version_ext != 0) { if (*img_report.sl_version_ext != 0) {
IGNORE_RETVAL(_chdir(tmp)); IGNORE_RETVAL(_chdir(tmp));
IGNORE_RETVAL(_mkdir(&iso_report.sl_version_ext[1])); IGNORE_RETVAL(_mkdir(&img_report.sl_version_ext[1]));
IGNORE_RETVAL(_chdir("..")); IGNORE_RETVAL(_chdir(".."));
} }
static_sprintf(tmp, "%s/%s-%s%s/%s.%s", FILES_URL, syslinux, iso_report.sl_version_str, static_sprintf(tmp, "%s/%s-%s%s/%s.%s", FILES_URL, syslinux, img_report.sl_version_str,
iso_report.sl_version_ext, ldlinux, ldlinux_ext[i]); img_report.sl_version_ext, ldlinux, ldlinux_ext[i]);
PrintInfo(0, MSG_085, tmp); PrintInfo(0, MSG_085, tmp);
PromptOnError = (*iso_report.sl_version_ext == 0); PromptOnError = (*img_report.sl_version_ext == 0);
syslinux_ldlinux_len[i] = DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hMainDialog); syslinux_ldlinux_len[i] = DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hMainDialog);
PromptOnError = TRUE; PromptOnError = TRUE;
if ((syslinux_ldlinux_len[i] == 0) && (DownloadStatus == 404) && (*iso_report.sl_version_ext != 0)) { if ((syslinux_ldlinux_len[i] == 0) && (DownloadStatus == 404) && (*img_report.sl_version_ext != 0)) {
// Couldn't locate the file on the server => try to download without the version extra // Couldn't locate the file on the server => try to download without the version extra
uprintf("Extended version was not found, trying main version\n"); uprintf("Extended version was not found, trying main version\n");
static_sprintf(tmp, "%s/%s-%s/%s.%s", FILES_URL, syslinux, iso_report.sl_version_str, static_sprintf(tmp, "%s/%s-%s/%s.%s", FILES_URL, syslinux, img_report.sl_version_str,
ldlinux, ldlinux_ext[i]); ldlinux, ldlinux_ext[i]);
PrintInfo(0, MSG_085, tmp); PrintInfo(0, MSG_085, tmp);
syslinux_ldlinux_len[i] = DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hMainDialog); syslinux_ldlinux_len[i] = DownloadFile(tmp, &tmp[sizeof(FILES_URL)], hMainDialog);
if (syslinux_ldlinux_len[i] != 0) { if (syslinux_ldlinux_len[i] != 0) {
// Duplicate the file so that the user won't be prompted to download again // Duplicate the file so that the user won't be prompted to download again
static_sprintf(tmp, "%s-%s\\%s.%s", syslinux, iso_report.sl_version_str, ldlinux, ldlinux_ext[i]); static_sprintf(tmp, "%s-%s\\%s.%s", syslinux, img_report.sl_version_str, ldlinux, ldlinux_ext[i]);
static_sprintf(tmp2, "%s-%s\\%s\\%s.%s", syslinux, iso_report.sl_version_str, static_sprintf(tmp2, "%s-%s\\%s\\%s.%s", syslinux, img_report.sl_version_str,
&iso_report.sl_version_ext[1], ldlinux, ldlinux_ext[i]); &img_report.sl_version_ext[1], ldlinux, ldlinux_ext[i]);
CopyFileA(tmp, tmp2, FALSE); CopyFileA(tmp, tmp2, FALSE);
} }
} }
@ -2365,9 +2364,9 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
ToggleImage(!IsChecked(IDC_BOOT) || (selection_default != BT_IMG)); ToggleImage(!IsChecked(IDC_BOOT) || (selection_default != BT_IMG));
SetToGo(); SetToGo();
if ((selection_default == BT_ISO) || (selection_default == BT_IMG)) { if ((selection_default == BT_ISO) || (selection_default == BT_IMG)) {
if ((image_path != NULL) && (iso_report.label[0] != 0)) { if ((image_path != NULL) && (img_report.label[0] != 0)) {
// Some distros (eg. Arch Linux) want to see a specific label => ignore user one // Some distros (eg. Arch Linux) want to see a specific label => ignore user one
SetWindowTextU(hLabel, iso_report.label); SetWindowTextU(hLabel, img_report.label);
} }
} else { } else {
if (selection_default == BT_UEFI_NTFS) { if (selection_default == BT_UEFI_NTFS) {
@ -2462,7 +2461,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
} }
// Ask users how they want to write ISOHybrid images // Ask users how they want to write ISOHybrid images
if ((IsChecked(IDC_BOOT)) && (iso_report.is_bootable_img) && if ((IsChecked(IDC_BOOT)) && (img_report.is_bootable_img) &&
(ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == BT_ISO)) { (ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)) == BT_ISO)) {
char* iso_image = lmprintf(MSG_036); char* iso_image = lmprintf(MSG_036);
char* dd_image = lmprintf(MSG_095); char* dd_image = lmprintf(MSG_095);

View File

@ -260,6 +260,8 @@ typedef struct {
char install_wim_path[64]; /* path to install.wim or install.swm */ char install_wim_path[64]; /* path to install.wim or install.swm */
uint64_t projected_size; uint64_t projected_size;
uint32_t install_wim_version; uint32_t install_wim_version;
BOOLEAN is_iso;
BOOLEAN is_bootable_img;
uint8_t winpe; uint8_t winpe;
uint8_t has_efi; uint8_t has_efi;
BOOLEAN has_4GB_file; BOOLEAN has_4GB_file;
@ -275,14 +277,13 @@ typedef struct {
BOOLEAN has_grub2; BOOLEAN has_grub2;
BOOLEAN has_kolibrios; BOOLEAN has_kolibrios;
BOOLEAN uses_minint; BOOLEAN uses_minint;
BOOLEAN is_bootable_img;
BOOLEAN compression_type; BOOLEAN compression_type;
BOOLEAN is_vhd; BOOLEAN is_vhd;
uint16_t sl_version; // Syslinux/Isolinux version uint16_t sl_version; // Syslinux/Isolinux version
char sl_version_str[12]; char sl_version_str[12];
char sl_version_ext[32]; char sl_version_ext[32];
char grub2_version[32]; char grub2_version[32];
} RUFUS_ISO_REPORT; } RUFUS_IMG_REPORT;
/* Isolate the Syslinux version numbers */ /* Isolate the Syslinux version numbers */
#define SL_MAJOR(x) ((uint8_t)((x)>>8)) #define SL_MAJOR(x) ((uint8_t)((x)>>8))
@ -366,7 +367,7 @@ extern RUFUS_DRIVE_INFO SelectedDrive;
extern const int nb_steps[FS_MAX]; extern const int nb_steps[FS_MAX];
extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress, right_to_left_mode; extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op_in_progress, right_to_left_mode;
extern BOOL allow_dual_uefi_bios, togo_mode; extern BOOL allow_dual_uefi_bios, togo_mode;
extern RUFUS_ISO_REPORT iso_report; extern RUFUS_IMG_REPORT img_report;
extern int64_t iso_blocking_status; extern int64_t iso_blocking_status;
extern uint16_t rufus_version[3], embedded_sl_version[2]; extern uint16_t rufus_version[3], embedded_sl_version[2];
extern int nWindowsVersion; extern int nWindowsVersion;
@ -442,7 +443,7 @@ extern void parse_update(char* buf, size_t len);
extern uint8_t WimExtractCheck(void); extern uint8_t WimExtractCheck(void);
extern BOOL WimExtractFile(const char* wim_image, int index, const char* src, const char* dst); extern BOOL WimExtractFile(const char* wim_image, int index, const char* src, const char* dst);
extern BOOL WimApplyImage(const char* image, int index, const char* dst); extern BOOL WimApplyImage(const char* image, int index, const char* dst);
extern BOOL IsHDImage(const char* path); extern BOOL IsBootableImage(const char* path);
extern BOOL AppendVHDFooter(const char* vhd_path); extern BOOL AppendVHDFooter(const char* vhd_path);
extern int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid); extern int IsHDD(DWORD DriveIndex, uint16_t vid, uint16_t pid, const char* strid);
extern void LostTranslatorCheck(void); extern void LostTranslatorCheck(void);

View File

@ -32,7 +32,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_DIALOG DIALOGEX 12, 12, 242, 376 IDD_DIALOG DIALOGEX 12, 12, 242, 376
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Rufus 2.3.711" CAPTION "Rufus 2.4.712"
FONT 8, "Segoe UI Symbol", 400, 0, 0x0 FONT 8, "Segoe UI Symbol", 400, 0, 0x0
BEGIN BEGIN
LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8 LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8
@ -317,8 +317,8 @@ END
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 2,3,711,0 FILEVERSION 2,4,712,0
PRODUCTVERSION 2,3,711,0 PRODUCTVERSION 2,4,712,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -335,13 +335,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", "2.3.711" VALUE "FileVersion", "2.4.712"
VALUE "InternalName", "Rufus" VALUE "InternalName", "Rufus"
VALUE "LegalCopyright", "© 2011-2015 Pete Batard (GPL v3)" VALUE "LegalCopyright", "© 2011-2015 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", "2.3.711" VALUE "ProductVersion", "2.4.712"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -105,9 +105,9 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
uint32_t ldlinux_cluster; uint32_t ldlinux_cluster;
int i, nsectors; int i, nsectors;
int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType)); int bt = (int)ComboBox_GetItemData(hBootType, ComboBox_GetCurSel(hBootType));
BOOL use_v5 = (bt == BT_SYSLINUX_V6) || ((bt == BT_ISO) && (SL_MAJOR(iso_report.sl_version) >= 5)); BOOL use_v5 = (bt == BT_SYSLINUX_V6) || ((bt == BT_ISO) && (SL_MAJOR(img_report.sl_version) >= 5));
PrintInfoDebug(0, MSG_234, (bt == BT_ISO)?iso_report.sl_version_str:embedded_sl_version_str[use_v5?1:0]); PrintInfoDebug(0, MSG_234, (bt == BT_ISO)?img_report.sl_version_str:embedded_sl_version_str[use_v5?1:0]);
// 4K sector size workaround // 4K sector size workaround
SECTOR_SHIFT = 0; SECTOR_SHIFT = 0;
@ -133,8 +133,8 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
syslinux_ldlinux[i] = (unsigned char*) malloc(syslinux_ldlinux_len[i]); syslinux_ldlinux[i] = (unsigned char*) malloc(syslinux_ldlinux_len[i]);
if (syslinux_ldlinux[i] == NULL) if (syslinux_ldlinux[i] == NULL)
goto out; goto out;
static_sprintf(path, "%s/%s-%s%s/%s.%s", FILES_DIR, syslinux, iso_report.sl_version_str, static_sprintf(path, "%s/%s-%s%s/%s.%s", FILES_DIR, syslinux, img_report.sl_version_str,
iso_report.sl_version_ext, ldlinux, i==0?"sys":"bss"); img_report.sl_version_ext, ldlinux, i==0?"sys":"bss");
fd = fopen(path, "rb"); fd = fopen(path, "rb");
if (fd == NULL) { if (fd == NULL) {
uprintf("Could not open %s\n", path); uprintf("Could not open %s\n", path);
@ -315,7 +315,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
uprintf("Failed to create '%s': %s\n", path, WindowsErrorString()); uprintf("Failed to create '%s': %s\n", path, WindowsErrorString());
} }
} }
} else if (IS_REACTOS(iso_report)) { } else if (IS_REACTOS(img_report)) {
uprintf("Setting up ReactOS...\n"); uprintf("Setting up ReactOS...\n");
syslinux_mboot = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_SL_MBOOT_C32), syslinux_mboot = GetResource(hMainInstance, MAKEINTRESOURCEA(IDR_SL_MBOOT_C32),
_RT_RCDATA, "mboot.c32", &syslinux_mboot_len, FALSE); _RT_RCDATA, "mboot.c32", &syslinux_mboot_len, FALSE);
@ -346,7 +346,7 @@ BOOL InstallSyslinux(DWORD drive_index, char drive_letter, int fs_type)
} }
/* Write the syslinux.cfg for ReactOS */ /* Write the syslinux.cfg for ReactOS */
fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n KERNEL %s\n APPEND %s\n", fprintf(fd, "DEFAULT ReactOS\nLABEL ReactOS\n KERNEL %s\n APPEND %s\n",
mboot_c32, iso_report.reactos_path); mboot_c32, img_report.reactos_path);
fclose(fd); fclose(fd);
} }

View File

@ -243,7 +243,7 @@ BOOL IsCompressedBootableImage(const char* path)
BOOL r = FALSE; BOOL r = FALSE;
int64_t dc; int64_t dc;
iso_report.compression_type = BLED_COMPRESSION_NONE; img_report.compression_type = BLED_COMPRESSION_NONE;
for (p = (char*)&path[strlen(path)-1]; (*p != '.') && (p != path); p--); for (p = (char*)&path[strlen(path)-1]; (*p != '.') && (p != path); p--);
if (p == path) if (p == path)
@ -251,7 +251,7 @@ BOOL IsCompressedBootableImage(const char* path)
for (i = 0; i<ARRAYSIZE(file_assoc); i++) { for (i = 0; i<ARRAYSIZE(file_assoc); i++) {
if (strcmp(p, file_assoc[i].ext) == 0) { if (strcmp(p, file_assoc[i].ext) == 0) {
iso_report.compression_type = file_assoc[i].type; img_report.compression_type = file_assoc[i].type;
buf = malloc(MBR_SIZE); buf = malloc(MBR_SIZE);
if (buf == NULL) if (buf == NULL)
return FALSE; return FALSE;
@ -273,7 +273,7 @@ BOOL IsCompressedBootableImage(const char* path)
} }
BOOL IsHDImage(const char* path) BOOL IsBootableImage(const char* path)
{ {
HANDLE handle = INVALID_HANDLE_VALUE; HANDLE handle = INVALID_HANDLE_VALUE;
LARGE_INTEGER liImageSize; LARGE_INTEGER liImageSize;
@ -282,6 +282,7 @@ BOOL IsHDImage(const char* path)
size_t i; size_t i;
uint32_t checksum, old_checksum; uint32_t checksum, old_checksum;
LARGE_INTEGER ptr; LARGE_INTEGER ptr;
BOOL is_bootable_img = FALSE;
uprintf("Disk image analysis:"); uprintf("Disk image analysis:");
handle = CreateFileU(path, GENERIC_READ, FILE_SHARE_READ, NULL, handle = CreateFileU(path, GENERIC_READ, FILE_SHARE_READ, NULL,
@ -291,31 +292,31 @@ BOOL IsHDImage(const char* path)
goto out; goto out;
} }
iso_report.is_bootable_img = (BOOLEAN)IsCompressedBootableImage(path); is_bootable_img = (BOOLEAN)IsCompressedBootableImage(path);
if (iso_report.compression_type == BLED_COMPRESSION_NONE) if (img_report.compression_type == BLED_COMPRESSION_NONE)
iso_report.is_bootable_img = (BOOLEAN)AnalyzeMBR(handle, " Image"); is_bootable_img = (BOOLEAN)AnalyzeMBR(handle, " Image");
if (!GetFileSizeEx(handle, &liImageSize)) { if (!GetFileSizeEx(handle, &liImageSize)) {
uprintf(" Could not get image size: %s", WindowsErrorString()); uprintf(" Could not get image size: %s", WindowsErrorString());
goto out; goto out;
} }
iso_report.projected_size = (uint64_t)liImageSize.QuadPart; img_report.projected_size = (uint64_t)liImageSize.QuadPart;
size = sizeof(vhd_footer); size = sizeof(vhd_footer);
if ((iso_report.compression_type == BLED_COMPRESSION_NONE) && (iso_report.projected_size >= (512 + size))) { if ((img_report.compression_type == BLED_COMPRESSION_NONE) && (img_report.projected_size >= (512 + size))) {
footer = (vhd_footer*)malloc(size); footer = (vhd_footer*)malloc(size);
ptr.QuadPart = iso_report.projected_size - size; ptr.QuadPart = img_report.projected_size - size;
if ( (footer == NULL) || (!SetFilePointerEx(handle, ptr, NULL, FILE_BEGIN)) || if ( (footer == NULL) || (!SetFilePointerEx(handle, ptr, NULL, FILE_BEGIN)) ||
(!ReadFile(handle, footer, size, &size, NULL)) || (size != sizeof(vhd_footer)) ) { (!ReadFile(handle, footer, size, &size, NULL)) || (size != sizeof(vhd_footer)) ) {
uprintf(" Could not read VHD footer"); uprintf(" Could not read VHD footer");
goto out; goto out;
} }
if (memcmp(footer->cookie, conectix_str, sizeof(footer->cookie)) == 0) { if (memcmp(footer->cookie, conectix_str, sizeof(footer->cookie)) == 0) {
iso_report.projected_size -= sizeof(vhd_footer); img_report.projected_size -= sizeof(vhd_footer);
if ( (bswap_uint32(footer->file_format_version) != VHD_FOOTER_FILE_FORMAT_V1_0) if ( (bswap_uint32(footer->file_format_version) != VHD_FOOTER_FILE_FORMAT_V1_0)
|| (bswap_uint32(footer->disk_type) != VHD_FOOTER_TYPE_FIXED_HARD_DISK)) { || (bswap_uint32(footer->disk_type) != VHD_FOOTER_TYPE_FIXED_HARD_DISK)) {
uprintf(" Unsupported type of VHD image"); uprintf(" Unsupported type of VHD image");
iso_report.is_bootable_img = FALSE; is_bootable_img = FALSE;
goto out; goto out;
} }
// Might as well validate the checksum while we're at it // Might as well validate the checksum while we're at it
@ -328,14 +329,14 @@ BOOL IsHDImage(const char* path)
uprintf(" Warning: VHD footer seems corrupted (checksum: %04X, expected: %04X)", old_checksum, checksum); uprintf(" Warning: VHD footer seems corrupted (checksum: %04X, expected: %04X)", old_checksum, checksum);
// Need to remove the footer from our payload // Need to remove the footer from our payload
uprintf(" Image is a Fixed Hard Disk VHD file"); uprintf(" Image is a Fixed Hard Disk VHD file");
iso_report.is_vhd = TRUE; img_report.is_vhd = TRUE;
} }
} }
out: out:
safe_free(footer); safe_free(footer);
safe_closehandle(handle); safe_closehandle(handle);
return iso_report.is_bootable_img; return is_bootable_img;
} }
#define WIM_HAS_API_EXTRACT 1 #define WIM_HAS_API_EXTRACT 1