mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[iso] add exception for Mint's LMDE
* Mint have decided to make their installation rely on a working /live/ ➔ /casper/ symlink for LMDE thereby breaking the promise of File System Transposition that all Debian derivatives should have. * Because of this, trying to use FAT32 with LMDE will fail, as reported in linuxmint/live-installer#152. * Therefore, now that we can replicate symlinks on NTFS, we add an exception to always enforce the use of NTFS for LMDE.
This commit is contained in:
parent
e9d588a6e0
commit
1630e912d4
4 changed files with 90 additions and 78 deletions
132
src/iso.c
132
src/iso.c
|
@ -464,6 +464,62 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
|
||||||
free(src);
|
free(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This updates the MD5SUMS/md5sum.txt file that some distros (Ubuntu, Mint...)
|
||||||
|
// use to validate the media. Because we may alter some of the validated files
|
||||||
|
// to add persistence and whatnot, we need to alter the MD5 list as a result.
|
||||||
|
// The format of the file is expected to always be "<MD5SUM> <FILE_PATH>" on
|
||||||
|
// individual lines.
|
||||||
|
static void update_md5sum(void)
|
||||||
|
{
|
||||||
|
BOOL display_header = TRUE;
|
||||||
|
intptr_t pos;
|
||||||
|
uint32_t i, j, size, md5_size;
|
||||||
|
uint8_t* buf = NULL, sum[16];
|
||||||
|
char md5_path[64], * md5_data = NULL, * str_pos;
|
||||||
|
|
||||||
|
if (!img_report.has_md5sum)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
assert(img_report.has_md5sum <= ARRAYSIZE(md5sum_name));
|
||||||
|
if (img_report.has_md5sum > ARRAYSIZE(md5sum_name))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
static_sprintf(md5_path, "%s\\%s", psz_extract_dir, md5sum_name[img_report.has_md5sum - 1]);
|
||||||
|
md5_size = read_file(md5_path, (uint8_t**)&md5_data);
|
||||||
|
if (md5_size == 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
for (i = 0; i < modified_path.Index; i++) {
|
||||||
|
str_pos = strstr(md5_data, &modified_path.String[i][2]);
|
||||||
|
if (str_pos == NULL)
|
||||||
|
// File is not listed in md5 sums
|
||||||
|
continue;
|
||||||
|
if (display_header) {
|
||||||
|
uprintf("Updating %s:", md5_path);
|
||||||
|
display_header = FALSE;
|
||||||
|
}
|
||||||
|
uprintf("● %s", &modified_path.String[i][2]);
|
||||||
|
pos = str_pos - md5_data;
|
||||||
|
size = read_file(modified_path.String[i], &buf);
|
||||||
|
if (size == 0)
|
||||||
|
continue;
|
||||||
|
HashBuffer(HASH_MD5, buf, size, sum);
|
||||||
|
free(buf);
|
||||||
|
while ((pos > 0) && (md5_data[pos - 1] != '\n'))
|
||||||
|
pos--;
|
||||||
|
for (j = 0; j < 16; j++) {
|
||||||
|
md5_data[pos + 2 * j] = ((sum[j] >> 4) < 10) ? ('0' + (sum[j] >> 4)) : ('a' - 0xa + (sum[j] >> 4));
|
||||||
|
md5_data[pos + 2 * j + 1] = ((sum[j] & 15) < 10) ? ('0' + (sum[j] & 15)) : ('a' - 0xa + (sum[j] & 15));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
write_file(md5_path, md5_data, md5_size);
|
||||||
|
free(md5_data);
|
||||||
|
|
||||||
|
out:
|
||||||
|
StrArrayDestroy(&modified_path);
|
||||||
|
}
|
||||||
|
|
||||||
static void print_extracted_file(char* psz_fullpath, uint64_t file_length)
|
static void print_extracted_file(char* psz_fullpath, uint64_t file_length)
|
||||||
{
|
{
|
||||||
size_t nul_pos;
|
size_t nul_pos;
|
||||||
|
@ -644,62 +700,6 @@ out:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This updates the MD5SUMS/md5sum.txt file that some distros (Ubuntu, Mint...)
|
|
||||||
// use to validate the media. Because we may alter some of the validated files
|
|
||||||
// to add persistence and whatnot, we need to alter the MD5 list as a result.
|
|
||||||
// The format of the file is expected to always be "<MD5SUM> <FILE_PATH>" on
|
|
||||||
// individual lines.
|
|
||||||
static void update_md5sum(void)
|
|
||||||
{
|
|
||||||
BOOL display_header = TRUE;
|
|
||||||
intptr_t pos;
|
|
||||||
uint32_t i, j, size, md5_size;
|
|
||||||
uint8_t *buf = NULL, sum[16];
|
|
||||||
char md5_path[64], *md5_data = NULL, *str_pos;
|
|
||||||
|
|
||||||
if (!img_report.has_md5sum)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
assert(img_report.has_md5sum <= ARRAYSIZE(md5sum_name));
|
|
||||||
if (img_report.has_md5sum > ARRAYSIZE(md5sum_name))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
static_sprintf(md5_path, "%s\\%s", psz_extract_dir, md5sum_name[img_report.has_md5sum - 1]);
|
|
||||||
md5_size = read_file(md5_path, (uint8_t**)&md5_data);
|
|
||||||
if (md5_size == 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
for (i = 0; i < modified_path.Index; i++) {
|
|
||||||
str_pos = strstr(md5_data, &modified_path.String[i][2]);
|
|
||||||
if (str_pos == NULL)
|
|
||||||
// File is not listed in md5 sums
|
|
||||||
continue;
|
|
||||||
if (display_header) {
|
|
||||||
uprintf("Updating %s:", md5_path);
|
|
||||||
display_header = FALSE;
|
|
||||||
}
|
|
||||||
uprintf("● %s", &modified_path.String[i][2]);
|
|
||||||
pos = str_pos - md5_data;
|
|
||||||
size = read_file(modified_path.String[i], &buf);
|
|
||||||
if (size == 0)
|
|
||||||
continue;
|
|
||||||
HashBuffer(HASH_MD5, buf, size, sum);
|
|
||||||
free(buf);
|
|
||||||
while ((pos > 0) && (md5_data[pos - 1] != '\n'))
|
|
||||||
pos--;
|
|
||||||
for (j = 0; j < 16; j++) {
|
|
||||||
md5_data[pos + 2 * j] = ((sum[j] >> 4) < 10) ? ('0' + (sum[j] >> 4)) : ('a' - 0xa + (sum[j] >> 4));
|
|
||||||
md5_data[pos + 2 * j + 1] = ((sum[j] & 15) < 10) ? ('0' + (sum[j] & 15)) : ('a' - 0xa + (sum[j] & 15));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
write_file(md5_path, md5_data, md5_size);
|
|
||||||
free(md5_data);
|
|
||||||
|
|
||||||
out:
|
|
||||||
StrArrayDestroy(&modified_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns 0 on success, >0 on error, <0 to ignore current dir
|
// Returns 0 on success, >0 on error, <0 to ignore current dir
|
||||||
static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
{
|
{
|
||||||
|
@ -793,13 +793,19 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
} else {
|
} else {
|
||||||
file_length = p_statbuf->total_size;
|
file_length = p_statbuf->total_size;
|
||||||
if (check_iso_props(psz_path, file_length, psz_basename, psz_fullpath, &props)) {
|
if (check_iso_props(psz_path, file_length, psz_basename, psz_fullpath, &props)) {
|
||||||
// Add symlink duplicated files to total_size at scantime
|
if (is_symlink && (file_length == 0)) {
|
||||||
if (is_symlink && (file_length == 0) && (strcmp(psz_path, "/firmware") == 0)) {
|
// Add symlink duplicated files to total_size at scantime
|
||||||
static_sprintf(target_path, "%s/%s", psz_path, p_statbuf->rr.psz_symlink);
|
if ((strcmp(psz_path, "/firmware") == 0)) {
|
||||||
iso9660_stat_t *p_statbuf2 = iso9660_ifs_stat_translate(p_iso, target_path);
|
static_sprintf(target_path, "%s/%s", psz_path, p_statbuf->rr.psz_symlink);
|
||||||
if (p_statbuf2 != NULL) {
|
iso9660_stat_t* p_statbuf2 = iso9660_ifs_stat_translate(p_iso, target_path);
|
||||||
extra_blocks += (p_statbuf2->total_size + ISO_BLOCKSIZE - 1) / ISO_BLOCKSIZE;
|
if (p_statbuf2 != NULL) {
|
||||||
iso9660_stat_free(p_statbuf2);
|
extra_blocks += (p_statbuf2->total_size + ISO_BLOCKSIZE - 1) / ISO_BLOCKSIZE;
|
||||||
|
iso9660_stat_free(p_statbuf2);
|
||||||
|
}
|
||||||
|
} else if ((strcmp(p_statbuf->filename, "live") == 0) &&
|
||||||
|
(strcmp(p_statbuf->rr.psz_symlink, "casper") == 0)) {
|
||||||
|
// Mint LMDE requires working symbolic links and therefore requires the use of NTFS
|
||||||
|
img_report.needs_ntfs = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
|
|
23
src/rufus.c
23
src/rufus.c
|
@ -184,8 +184,8 @@ static void SetAllowedFileSystems(void)
|
||||||
break;
|
break;
|
||||||
case BT_IMAGE:
|
case BT_IMAGE:
|
||||||
allowed_filesystem[FS_NTFS] = TRUE;
|
allowed_filesystem[FS_NTFS] = TRUE;
|
||||||
// Don't allow anything besides NTFS if the image has a >4GB file
|
// Don't allow anything besides NTFS if the image has a >4GB file or explicitly requires NTFS
|
||||||
if ((image_path != NULL) && (img_report.has_4GB_file))
|
if ((image_path != NULL) && (img_report.has_4GB_file || img_report.needs_ntfs))
|
||||||
break;
|
break;
|
||||||
if (!HAS_WINDOWS(img_report) || (target_type != TT_BIOS) || allow_dual_uefi_bios) {
|
if (!HAS_WINDOWS(img_report) || (target_type != TT_BIOS) || allow_dual_uefi_bios) {
|
||||||
if (!HAS_WINTOGO(img_report) || (ComboBox_GetCurItemData(hImageOption) != IMOP_WIN_TO_GO)) {
|
if (!HAS_WINTOGO(img_report) || (ComboBox_GetCurItemData(hImageOption) != IMOP_WIN_TO_GO)) {
|
||||||
|
@ -1134,13 +1134,18 @@ static void DisplayISOProps(void)
|
||||||
(img_report.wininst_version >> 16) & 0xff, (img_report.wininst_version >> 8) & 0xff,
|
(img_report.wininst_version >> 16) & 0xff, (img_report.wininst_version >> 8) & 0xff,
|
||||||
(img_report.wininst_version >= SPECIAL_WIM_VERSION) ? "+": "");
|
(img_report.wininst_version >= SPECIAL_WIM_VERSION) ? "+": "");
|
||||||
}
|
}
|
||||||
PRINT_ISO_PROP(img_report.has_symlinks,
|
if (img_report.needs_ntfs) {
|
||||||
" Note: This ISO uses symbolic links, which will not be replicated due to file system");
|
uprintf(" Note: This ISO uses symbolic links and was not designed to work without them.\r\n"
|
||||||
PRINT_ISO_PROP((img_report.has_symlinks == SYMLINKS_RR),
|
" Because of this, only NTFS will be allowed as the target file system.");
|
||||||
" limitations. Because of this, some features from this image may not work...");
|
} else {
|
||||||
PRINT_ISO_PROP((img_report.has_symlinks == SYMLINKS_UDF),
|
PRINT_ISO_PROP(img_report.has_symlinks,
|
||||||
" limitations. Because of this, the size required for the target media may be much\r\n"
|
" Note: This ISO uses symbolic links, which may not be replicated due to file system");
|
||||||
" larger than size of the ISO...");
|
PRINT_ISO_PROP((img_report.has_symlinks == SYMLINKS_RR),
|
||||||
|
" limitations. Because of this, some features from this image may not work...");
|
||||||
|
PRINT_ISO_PROP((img_report.has_symlinks == SYMLINKS_UDF),
|
||||||
|
" limitations. Because of this, the size required for the target media may be much\r\n"
|
||||||
|
" larger than size of the ISO...");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert the image name into the Boot selection dropdown and (re)populate the Image option dropdown
|
// Insert the image name into the Boot selection dropdown and (re)populate the Image option dropdown
|
||||||
|
|
|
@ -412,11 +412,12 @@ typedef struct {
|
||||||
BOOLEAN has_old_c32[NB_OLD_C32];
|
BOOLEAN has_old_c32[NB_OLD_C32];
|
||||||
BOOLEAN has_old_vesamenu;
|
BOOLEAN has_old_vesamenu;
|
||||||
BOOLEAN has_efi_syslinux;
|
BOOLEAN has_efi_syslinux;
|
||||||
BOOLEAN needs_syslinux_overwrite;
|
|
||||||
BOOLEAN has_grub4dos;
|
BOOLEAN has_grub4dos;
|
||||||
uint8_t has_grub2;
|
uint8_t has_grub2;
|
||||||
BOOLEAN has_compatresources_dll;
|
BOOLEAN has_compatresources_dll;
|
||||||
BOOLEAN has_kolibrios;
|
BOOLEAN has_kolibrios;
|
||||||
|
BOOLEAN needs_syslinux_overwrite;
|
||||||
|
BOOLEAN needs_ntfs;
|
||||||
BOOLEAN uses_casper;
|
BOOLEAN uses_casper;
|
||||||
BOOLEAN uses_minint;
|
BOOLEAN uses_minint;
|
||||||
uint8_t compression_type;
|
uint8_t compression_type;
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
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
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 4.3.2087"
|
CAPTION "Rufus 4.3.2088"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -392,8 +392,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 4,3,2087,0
|
FILEVERSION 4,3,2088,0
|
||||||
PRODUCTVERSION 4,3,2087,0
|
PRODUCTVERSION 4,3,2088,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -411,13 +411,13 @@ BEGIN
|
||||||
VALUE "Comments", "https://rufus.ie"
|
VALUE "Comments", "https://rufus.ie"
|
||||||
VALUE "CompanyName", "Akeo Consulting"
|
VALUE "CompanyName", "Akeo Consulting"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "4.3.2087"
|
VALUE "FileVersion", "4.3.2088"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
||||||
VALUE "OriginalFilename", "rufus-4.3.exe"
|
VALUE "OriginalFilename", "rufus-4.3.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "4.3.2087"
|
VALUE "ProductVersion", "4.3.2088"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue