mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[iso] improve El Torito image handling
* Update to latest libcdio proposal and fix incorrect image size. * Also remove unnecessary calls in packme.cmd.
This commit is contained in:
parent
f6fd520d2a
commit
018ed3414b
6 changed files with 130 additions and 47 deletions
|
@ -86,16 +86,14 @@ exiftool -s3 -*InternalName* rufus_x64.exe | findstr /C:"BETA" 1>nul && (
|
|||
)
|
||||
|
||||
rem Populate the version from the executable
|
||||
setlocal EnableDelayedExpansion
|
||||
if "%VERSION_OVERRIDE%"=="" (
|
||||
exiftool -s3 -*FileVersionNumber* rufus_x64.exe > version.txt
|
||||
set /p VERSION=<version.txt
|
||||
del version.txt
|
||||
)else (
|
||||
) else (
|
||||
echo WARNING: Forcing version to %VERSION_OVERRIDE%
|
||||
set VERSION=%VERSION_OVERRIDE%
|
||||
)
|
||||
setlocal DisableDelayedExpansion
|
||||
|
||||
echo Will create %VERSION% AppStore Bundle
|
||||
pause
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2003-2008, 2012-2013, 2017
|
||||
Copyright (C) 2003-2008, 2012-2013, 2017, 2023-2024
|
||||
Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
|||
* filesystem library; applications include this.
|
||||
*
|
||||
* See also the ISO-9660 specification. The freely available European
|
||||
* equivalant standard is called ECMA-119.
|
||||
* equivalent standard is called ECMA-119.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -78,7 +78,7 @@ typedef char dchar_t; /*! See section 7.4.1 */
|
|||
program; things are done this way so that in a debugger one can to
|
||||
refer to the enumeration value names such as in a debugger
|
||||
expression and get something. With the more common a \#define
|
||||
mechanism, the name/value assocation is lost at run time.
|
||||
mechanism, the name/value association is lost at run time.
|
||||
*/
|
||||
extern enum iso_enum1_s {
|
||||
ISO_PVD_SECTOR = 16, /**< Sector of Primary Volume Descriptor. */
|
||||
|
@ -93,8 +93,9 @@ extern enum iso_enum1_s {
|
|||
preparer id. */
|
||||
MAX_ISOPATHNAME = 255, /**< Maximum number of characters in the
|
||||
entire ISO 9660 filename. */
|
||||
ISO_BLOCKSIZE = 2048 /**< Number of bytes in an ISO 9660 block. */
|
||||
|
||||
ISO_BLOCKSIZE = 2048, /**< Number of bytes in an ISO 9660 block. */
|
||||
VIRTUAL_SECTORSIZE = 512 /**< Number of bytes in an El Torito virtual
|
||||
image sector */
|
||||
} iso_enums1;
|
||||
|
||||
/*! An enumeration for some of the ISO_* \#defines below. This isn't
|
||||
|
@ -396,7 +397,7 @@ typedef struct iso9660_pvd_s iso9660_pvd_t;
|
|||
/*!
|
||||
\brief ISO-9660 Supplementary Volume Descriptor.
|
||||
|
||||
This is used for Joliet Extentions and is almost the same as the
|
||||
This is used for Joliet Extensions and is almost the same as the
|
||||
the primary descriptor but two unused fields, "unused1" and "unused3
|
||||
become "flags and "escape_sequences" respectively.
|
||||
*/
|
||||
|
@ -531,7 +532,7 @@ struct iso9660_br_s {
|
|||
uint16_t load_seg; /**< Load segment for x86 */
|
||||
uint8_t system_type; /**< System type - 0 for x86 */
|
||||
uint8_t unused1;
|
||||
uint16_t num_sectors; /**< Sector count of the image */
|
||||
uint16_t num_sectors; /**< Virtual sectors count of the image */
|
||||
uint32_t image_lsn; /**< Start address of the image */
|
||||
uint8_t unused2[20];
|
||||
} GNUC_PACKED;
|
||||
|
@ -582,7 +583,7 @@ struct iso9660_stat_s { /* big endian!! */
|
|||
/* Multi-extent aware size, in bytes.
|
||||
|
||||
It is guaranteed that the bytes are stored as gapless string in a
|
||||
continguous sequence of blocks. I.e. they can be read sequentially
|
||||
contiguous sequence of blocks. I.e. they can be read sequentially
|
||||
starting at iso9660_stat_s.lsn.
|
||||
Data files which do not fulfil this promise cause a warning message
|
||||
and are not represented by this type of struct.
|
||||
|
@ -671,7 +672,7 @@ typedef struct _iso9660_s iso9660_t;
|
|||
contained in a file format that libiso9660 doesn't know natively
|
||||
(or knows imperfectly.)
|
||||
|
||||
Some tolerence allowed for positioning the ISO 9660 image. We scan
|
||||
Some tolerance allowed for positioning the ISO 9660 image. We scan
|
||||
for STANDARD_ID and use that to set the eventual offset to adjust
|
||||
by (as long as that is <= i_fuzz).
|
||||
|
||||
|
@ -683,7 +684,7 @@ typedef struct _iso9660_s iso9660_t;
|
|||
uint16_t i_fuzz);
|
||||
|
||||
/*!
|
||||
Open an ISO 9660 image for reading with some tolerence for positioning
|
||||
Open an ISO 9660 image for reading with some tolerance for positioning
|
||||
of the ISO9660 image. We scan for ISO_STANDARD_ID and use that to set
|
||||
the eventual offset to adjust by (as long as that is <= i_fuzz).
|
||||
|
||||
|
@ -799,7 +800,7 @@ typedef struct _iso9660_s iso9660_t;
|
|||
tm will reported in GMT.
|
||||
*/
|
||||
bool iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool b_localtime,
|
||||
/*out*/ struct tm *tm);
|
||||
/*out*/ struct tm *p_tm);
|
||||
|
||||
|
||||
/*!
|
||||
|
@ -890,7 +891,7 @@ typedef struct _iso9660_s iso9660_t;
|
|||
|
||||
/*!
|
||||
Take psz_path and a version number and turn that into a ISO-9660
|
||||
pathname. (That's just the pathname followd by ";" and the version
|
||||
pathname. (That's just the pathname followed by ";" and the version
|
||||
number. For example, mydir/file.ext -> MYDIR/FILE.EXT;1 for version
|
||||
1. The resulting ISO-9660 pathname is returned.
|
||||
*/
|
||||
|
@ -1235,7 +1236,7 @@ lsn_t iso9660_get_dir_extent(const iso9660_dir_t *p_idr);
|
|||
|
||||
@param p_iso the ISO-9660 file image to get data from
|
||||
|
||||
@param u_file_limit the maximimum number of (non-rock-ridge) files
|
||||
@param u_file_limit the maximum number of (non-rock-ridge) files
|
||||
to consider before giving up and returning "dunno".
|
||||
|
||||
"dunno" can also be returned if there was some error encountered
|
||||
|
@ -1311,7 +1312,7 @@ lsn_t iso9660_get_dir_extent(const iso9660_dir_t *p_idr);
|
|||
void iso9660_set_evd (void *pd);
|
||||
|
||||
/*!
|
||||
Return true if ISO 9660 image has extended attrributes (XA).
|
||||
Return true if ISO 9660 image has extended attributes (XA).
|
||||
*/
|
||||
bool iso9660_ifs_is_xa (const iso9660_t * p_iso);
|
||||
|
||||
|
|
|
@ -105,6 +105,12 @@ _cdio_memdup (const void *mem, size_t count);
|
|||
char *
|
||||
_cdio_strdup_upper (const char str[]);
|
||||
|
||||
int
|
||||
_cdio_stricmp(const char str1[], const char str2[]);
|
||||
|
||||
int
|
||||
_cdio_strnicmp(const char str1[], const char str2[], size_t count);
|
||||
|
||||
/*! Duplicate path and make it platform compliant. Typically needed for
|
||||
MinGW/MSYS where a "/c/..." path must be translated to "c:/..." for
|
||||
use with fopen(), etc. Returned string must be freed by the caller
|
||||
|
|
|
@ -142,6 +142,35 @@ _cdio_strdup_upper (const char str[])
|
|||
return new_str;
|
||||
}
|
||||
|
||||
int
|
||||
_cdio_stricmp (const char str1[], const char str2[])
|
||||
{
|
||||
if (str1 && str2) {
|
||||
int c1, c2;
|
||||
do {
|
||||
c1 = tolower((unsigned char)*str1++);
|
||||
c2 = tolower((unsigned char)*str2++);
|
||||
} while (c1 == c2 && c1 != '\0');
|
||||
return c1 - c2;
|
||||
} else return (str1 != str2);
|
||||
}
|
||||
|
||||
int
|
||||
_cdio_strnicmp(const char str1[], const char str2[], size_t count)
|
||||
{
|
||||
if (str1 && str2) {
|
||||
int c1 = 0, c2 = 0;
|
||||
size_t i;
|
||||
for (i = 0; i < count; i++) {
|
||||
c1 = tolower((unsigned char)*str1++);
|
||||
c2 = tolower((unsigned char)*str2++);
|
||||
if (c1 != c2 || c1 == '\0')
|
||||
break;
|
||||
}
|
||||
return c1 - c2;
|
||||
} else return (str1 != str2);
|
||||
}
|
||||
|
||||
/* Convert MinGW/MSYS paths that start in "/c/..." to "c:/..."
|
||||
so that they can be used with fopen(), stat(), etc.
|
||||
Returned string must be freed by the caller using cdio_free().*/
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
Copyright (C) 2003-2008, 2011-2015, 2017 Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 2018, 2020 Pete Batard <pete@akeo.ie>
|
||||
Copyright (C) 2003-2008, 2011-2015, 2017, 2024
|
||||
Rocky Bernstein <rocky@gnu.org>
|
||||
Copyright (C) 2018, 2020, 2024 Pete Batard <pete@akeo.ie>
|
||||
Copyright (C) 2018 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||
|
||||
|
@ -59,6 +60,7 @@
|
|||
#include "_cdio_stdio.h"
|
||||
#include "cdio_private.h"
|
||||
|
||||
/* Maximum number of El-Torito boot images we keep an index for */
|
||||
#define MAX_BOOT_IMAGES 8
|
||||
|
||||
/** Implementation of iso9660_t type */
|
||||
|
@ -87,7 +89,8 @@ struct _iso9660_s {
|
|||
*/
|
||||
struct {
|
||||
uint32_t lsn; /**< Start LSN of an El-Torito bootable image */
|
||||
uint32_t num_sectors; /**< Number of sectors of a bootable image */
|
||||
uint32_t num_sectors; /**< Number of virtual sectors occupied by the
|
||||
bootable image */
|
||||
} boot_img[MAX_BOOT_IMAGES];
|
||||
int i_fuzzy_offset; /**< Adjustment in bytes to make ISO_STANDARD_ID
|
||||
("CD001") come out as ISO_PVD_SECTOR
|
||||
|
@ -527,7 +530,7 @@ iso9660_ifs_read_superblock (iso9660_t *p_iso,
|
|||
/* Check for an El-Torito boot volume descriptor */
|
||||
if (ISO_VD_BOOT_RECORD == from_711(p_svd.type) &&
|
||||
(memcmp(p_brvd->system_id, EL_TORITO_ID, ISO_MAX_SYSTEM_ID) == 0)) {
|
||||
/* Perform very basic parsing of boot entries to fill an image table */
|
||||
/* Perform basic parsing of boot entries to fill an image table */
|
||||
iso9660_br_t br[ISO_BLOCKSIZE / sizeof(iso9660_br_t)];
|
||||
if (iso9660_iso_seek_read(p_iso, &br, p_brvd->boot_catalog_sector, 1) == ISO_BLOCKSIZE) {
|
||||
for (j = 0, k = 0;
|
||||
|
@ -1466,26 +1469,32 @@ iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[])
|
|||
iso9660_stat_t *
|
||||
iso9660_ifs_stat_translate (iso9660_t *p_iso, const char psz_path[])
|
||||
{
|
||||
/* Special case for virtual El-Torito boot images ('[BOOT]/#.img') */
|
||||
if (psz_path && (strncmp(psz_path, "[BOOT]/", 7) == 0)) {
|
||||
int index = psz_path[7] - '0';
|
||||
iso9660_stat_t* p_stat;
|
||||
if (strlen(psz_path) < 8)
|
||||
return NULL;
|
||||
if ((psz_path[7] < '0') || (psz_path[7] > '0' + MAX_BOOT_IMAGES - 1))
|
||||
return NULL;
|
||||
if (p_iso->boot_img[index].lsn == 0 || p_iso->boot_img[index].num_sectors == 0)
|
||||
return NULL;
|
||||
p_stat = calloc(1, sizeof(iso9660_stat_t) + strlen(psz_path));
|
||||
if (!p_stat) {
|
||||
cdio_warn("Couldn't calloc(1, %d)", (int)sizeof(iso9660_stat_t));
|
||||
return NULL;
|
||||
/* Special case for virtual El-Torito boot images ('/[BOOT]/#-Boot-NoEmul.img') */
|
||||
if (psz_path && p_iso && p_iso->boot_img[0].lsn != 0) {
|
||||
/* Work on a path without leading slash */
|
||||
const char* path = (psz_path[0] == '/') ? &psz_path[1] : psz_path;
|
||||
if ((_cdio_strnicmp(path, "[BOOT]/", 7) == 0) &&
|
||||
(_cdio_stricmp(&path[8], "-Boot-NoEmul.img") == 0)) {
|
||||
int index = path[7] - '0';
|
||||
iso9660_stat_t* p_stat;
|
||||
if (strlen(path) < 24)
|
||||
return NULL;
|
||||
cdio_assert(MAX_BOOT_IMAGES <= 10);
|
||||
if ((path[7] < '0') || (path[7] > '0' + MAX_BOOT_IMAGES - 1))
|
||||
return NULL;
|
||||
if (p_iso->boot_img[index].lsn == 0 || p_iso->boot_img[index].num_sectors == 0)
|
||||
return NULL;
|
||||
p_stat = calloc(1, sizeof(iso9660_stat_t) + strlen(path));
|
||||
if (!p_stat) {
|
||||
cdio_warn("Couldn't calloc(1, %d)", (int)sizeof(iso9660_stat_t));
|
||||
return NULL;
|
||||
}
|
||||
p_stat->lsn = p_iso->boot_img[index].lsn;
|
||||
p_stat->total_size = p_iso->boot_img[index].num_sectors * VIRTUAL_SECTORSIZE;
|
||||
p_stat->type = _STAT_FILE;
|
||||
strcpy(p_stat->filename, path);
|
||||
return p_stat;
|
||||
}
|
||||
p_stat->lsn = p_iso->boot_img[index].lsn;
|
||||
p_stat->total_size = p_iso->boot_img[index].num_sectors * ISO_BLOCKSIZE;
|
||||
p_stat->type = _STAT_FILE;
|
||||
strcpy(p_stat->filename, psz_path);
|
||||
return p_stat;
|
||||
}
|
||||
|
||||
return fs_stat_translate(p_iso, (stat_root_t *) _ifs_stat_root,
|
||||
|
@ -1623,6 +1632,7 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[])
|
|||
CdioISO9660FileList_t *
|
||||
iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||
{
|
||||
int i;
|
||||
iso9660_dir_t *p_iso9660_dir;
|
||||
iso9660_stat_t *p_iso9660_stat = NULL;
|
||||
iso9660_stat_t *p_stat;
|
||||
|
@ -1630,6 +1640,30 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
|||
if (!p_iso) return NULL;
|
||||
if (!psz_path) return NULL;
|
||||
|
||||
/* List the virtual El-Torito images */
|
||||
if (p_iso->boot_img[0].lsn != 0) {
|
||||
const char* path = (psz_path[0] == '/') ? &psz_path[1] : psz_path;
|
||||
if (_cdio_strnicmp(path, "[BOOT]", 6) == 0 && (path[6] == '\0' || path[6] == '/')) {
|
||||
CdioList_t* retval = _cdio_list_new();
|
||||
for (i = 0; i < MAX_BOOT_IMAGES && p_iso->boot_img[i].lsn != 0; i++) {
|
||||
p_iso9660_stat = calloc(1, sizeof(iso9660_stat_t) + 18);
|
||||
if (!p_iso9660_stat) {
|
||||
cdio_warn("Couldn't calloc(1, %d)", (int)sizeof(iso9660_stat_t) + 18);
|
||||
break;
|
||||
}
|
||||
strcpy(p_iso9660_stat->filename, "#-Boot-NoEmul.img");
|
||||
p_iso9660_stat->filename[0] = '0' + i;
|
||||
p_iso9660_stat->type = _STAT_FILE;
|
||||
p_iso9660_stat->lsn = p_iso->boot_img[i].lsn;
|
||||
p_iso9660_stat->total_size = p_iso->boot_img[i].num_sectors * VIRTUAL_SECTORSIZE;
|
||||
iso9660_get_ltime(&p_iso->pvd.creation_date, &p_iso9660_stat->tm);
|
||||
_cdio_list_append(retval, p_iso9660_stat);
|
||||
p_iso9660_stat = NULL;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
||||
p_stat = iso9660_ifs_stat (p_iso, psz_path);
|
||||
if (!p_stat) return NULL;
|
||||
|
||||
|
@ -1647,6 +1681,21 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
|||
const size_t dirbuf_len = blocks * ISO_BLOCKSIZE;
|
||||
bool skip_following_extents = false;
|
||||
|
||||
/* Add the virtual El-Torito "[BOOT]" directory to root */
|
||||
if (p_iso->boot_img[0].lsn != 0) {
|
||||
if (psz_path[0] == '\0' || (psz_path[0] == '/' && psz_path[1] == '\0')) {
|
||||
p_iso9660_stat = calloc(1, sizeof(iso9660_stat_t) + 7);
|
||||
if (p_iso9660_stat) {
|
||||
strcpy(p_iso9660_stat->filename, "[BOOT]");
|
||||
p_iso9660_stat->type = _STAT_DIR;
|
||||
p_iso9660_stat->lsn = ISO_PVD_SECTOR + 1;
|
||||
iso9660_get_ltime(&p_iso->pvd.creation_date, &p_iso9660_stat->tm);
|
||||
_cdio_list_append(retval, p_iso9660_stat);
|
||||
p_iso9660_stat = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!dirbuf_len)
|
||||
{
|
||||
cdio_warn("Invalid directory buffer sector size %u", blocks);
|
||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
|||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_ACCEPTFILES
|
||||
CAPTION "Rufus 4.4.2104"
|
||||
CAPTION "Rufus 4.4.2105"
|
||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||
BEGIN
|
||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||
|
@ -392,8 +392,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 4,4,2104,0
|
||||
PRODUCTVERSION 4,4,2104,0
|
||||
FILEVERSION 4,4,2105,0
|
||||
PRODUCTVERSION 4,4,2105,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -411,13 +411,13 @@ BEGIN
|
|||
VALUE "Comments", "https://rufus.ie"
|
||||
VALUE "CompanyName", "Akeo Consulting"
|
||||
VALUE "FileDescription", "Rufus"
|
||||
VALUE "FileVersion", "4.4.2104"
|
||||
VALUE "FileVersion", "4.4.2105"
|
||||
VALUE "InternalName", "Rufus"
|
||||
VALUE "LegalCopyright", "© 2011-2024 Pete Batard (GPL v3)"
|
||||
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
||||
VALUE "OriginalFilename", "rufus-4.4.exe"
|
||||
VALUE "ProductName", "Rufus"
|
||||
VALUE "ProductVersion", "4.4.2104"
|
||||
VALUE "ProductVersion", "4.4.2105"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
Loading…
Reference in a new issue