mirror of
https://github.com/pbatard/rufus.git
synced 2025-05-29 22:15:21 -04:00
[misc] add Ctrl-SELECT option to provide additional content
* For now only .zip archives are supported
This commit is contained in:
parent
71ede6d9a0
commit
e554d2b4e0
7 changed files with 63 additions and 16 deletions
|
@ -9,6 +9,7 @@ o v3.*
|
||||||
- *UPDATED* MSG_068 "Error while partitioning drive." -> "Could not partition drive."
|
- *UPDATED* MSG_068 "Error while partitioning drive." -> "Could not partition drive."
|
||||||
You can test this new message with <Alt>-<G>
|
You can test this new message with <Alt>-<G>
|
||||||
- *NEW* MSG_308 "VHD detection"
|
- *NEW* MSG_308 "VHD detection"
|
||||||
|
- *NEW* MSG_309 "Compressed archive"
|
||||||
// TODO: Add a test ISO for this.
|
// TODO: Add a test ISO for this.
|
||||||
- *NEW* MSG_310 "The ISO you have selected uses UEFI and is small enough to be written as (...)"
|
- *NEW* MSG_310 "The ISO you have selected uses UEFI and is small enough to be written as (...)"
|
||||||
|
|
||||||
|
|
|
@ -566,7 +566,7 @@ t MSG_305 "Use this option to indicate whether you want to use this device to in
|
||||||
t MSG_306 "Fast-zeroing drive: %s"
|
t MSG_306 "Fast-zeroing drive: %s"
|
||||||
t MSG_307 "This may take a while"
|
t MSG_307 "This may take a while"
|
||||||
t MSG_308 "VHD detection"
|
t MSG_308 "VHD detection"
|
||||||
t MSG_309 "ISO → ESP"
|
t MSG_309 "Compressed archive"
|
||||||
t MSG_310 "The ISO you have selected uses UEFI and is small enough to be written as an EFI System Partition (ESP). "
|
t MSG_310 "The ISO you have selected uses UEFI and is small enough to be written as an EFI System Partition (ESP). "
|
||||||
"Writing to an ESP, instead of writing to a generic data partition occupying the whole disk, can be preferable "
|
"Writing to an ESP, instead of writing to a generic data partition occupying the whole disk, can be preferable "
|
||||||
"for some types of installations.\n\nPlease select the mode that you want to use to write this image:"
|
"for some types of installations.\n\nPlease select the mode that you want to use to write this image:"
|
||||||
|
|
26
src/iso.c
26
src/iso.c
|
@ -48,6 +48,7 @@
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
#include "msapi_utf8.h"
|
#include "msapi_utf8.h"
|
||||||
#include "localization.h"
|
#include "localization.h"
|
||||||
|
#include "bled/bled.h"
|
||||||
|
|
||||||
// How often should we update the progress bar (in 2K blocks) as updating
|
// How often should we update the progress bar (in 2K blocks) as updating
|
||||||
// the progress bar for every block will bring extraction to a crawl
|
// the progress bar for every block will bring extraction to a crawl
|
||||||
|
@ -76,6 +77,7 @@ typedef struct {
|
||||||
RUFUS_IMG_REPORT img_report;
|
RUFUS_IMG_REPORT img_report;
|
||||||
int64_t iso_blocking_status = -1;
|
int64_t iso_blocking_status = -1;
|
||||||
extern BOOL preserve_timestamps, enable_ntfs_compression;
|
extern BOOL preserve_timestamps, enable_ntfs_compression;
|
||||||
|
extern char* archive_path;
|
||||||
BOOL enable_iso = TRUE, enable_joliet = TRUE, enable_rockridge = TRUE, has_ldlinux_c32;
|
BOOL enable_iso = TRUE, enable_joliet = TRUE, enable_rockridge = TRUE, 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)
|
||||||
static const char* psz_extract_dir;
|
static const char* psz_extract_dir;
|
||||||
|
@ -387,7 +389,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
|
||||||
free(src);
|
free(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_extracted_file(char* psz_fullpath, int64_t file_length)
|
static void print_extracted_file(char* psz_fullpath, uint64_t file_length)
|
||||||
{
|
{
|
||||||
size_t i, nul_pos;
|
size_t i, nul_pos;
|
||||||
|
|
||||||
|
@ -395,19 +397,27 @@ static void print_extracted_file(char* psz_fullpath, int64_t file_length)
|
||||||
return;
|
return;
|
||||||
// Replace slashes with backslashes and append the size to the path for UI display
|
// Replace slashes with backslashes and append the size to the path for UI display
|
||||||
nul_pos = strlen(psz_fullpath);
|
nul_pos = strlen(psz_fullpath);
|
||||||
for (i=0; i<nul_pos; i++)
|
for (i = 0; i < nul_pos; i++)
|
||||||
if (psz_fullpath[i] == '/') psz_fullpath[i] = '\\';
|
if (psz_fullpath[i] == '/')
|
||||||
|
psz_fullpath[i] = '\\';
|
||||||
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, TRUE, FALSE));
|
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, TRUE, FALSE));
|
||||||
uprintf("Extracting: %s\n", psz_fullpath);
|
uprintf("Extracting: %s\n", psz_fullpath);
|
||||||
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, FALSE, FALSE));
|
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, FALSE, FALSE));
|
||||||
PrintStatus(0, MSG_000, psz_fullpath); // MSG_000 is "%s"
|
PrintStatus(0, MSG_000, psz_fullpath); // MSG_000 is "%s"
|
||||||
// ISO9660 cannot handle backslashes
|
// ISO9660 cannot handle backslashes
|
||||||
for (i=0; i<nul_pos; i++)
|
for (i = 0; i < nul_pos; i++)
|
||||||
if (psz_fullpath[i] == '\\') psz_fullpath[i] = '/';
|
if (psz_fullpath[i] == '\\')
|
||||||
|
psz_fullpath[i] = '/';
|
||||||
// Remove the appended size for extraction
|
// Remove the appended size for extraction
|
||||||
psz_fullpath[nul_pos] = 0;
|
psz_fullpath[nul_pos] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void alt_print_extracted_file(const char* psz_fullpath, uint64_t file_length)
|
||||||
|
{
|
||||||
|
uprintf("Extracting: %s (%s)", psz_fullpath, SizeToHumanReadable(file_length, FALSE, FALSE));
|
||||||
|
PrintStatus(0, MSG_000, psz_fullpath);
|
||||||
|
}
|
||||||
|
|
||||||
// Convert from time_t to FILETIME
|
// Convert from time_t to FILETIME
|
||||||
// Uses 3 static entries so that we can convert 3 concurrent values at the same time
|
// Uses 3 static entries so that we can convert 3 concurrent values at the same time
|
||||||
static LPFILETIME __inline to_filetime(time_t t)
|
static LPFILETIME __inline to_filetime(time_t t)
|
||||||
|
@ -1079,6 +1089,12 @@ out:
|
||||||
RunCommand("compact /u bootmgr* efi/boot/*.efi", dest_dir, TRUE);
|
RunCommand("compact /u bootmgr* efi/boot/*.efi", dest_dir, TRUE);
|
||||||
}
|
}
|
||||||
StrArrayDestroy(&modified_path);
|
StrArrayDestroy(&modified_path);
|
||||||
|
if (archive_path != NULL) {
|
||||||
|
uprintf("● Adding files from %s", archive_path);
|
||||||
|
bled_init(NULL, NULL, NULL, NULL, alt_print_extracted_file, NULL);
|
||||||
|
bled_uncompress_to_dir(archive_path, dest_dir, BLED_COMPRESSION_ZIP);
|
||||||
|
bled_exit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (p_iso != NULL)
|
if (p_iso != NULL)
|
||||||
iso9660_close(p_iso);
|
iso9660_close(p_iso);
|
||||||
|
|
|
@ -1052,6 +1052,17 @@ static __inline int _accessU(const char* path, int mode)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __inline const char* _filenameU(const char* path)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
if (path == NULL)
|
||||||
|
return NULL;
|
||||||
|
for (i = strlen(path) - 1; i >= 0; i--)
|
||||||
|
if ((path[i] == '/') || (path[i] == '\\'))
|
||||||
|
return &path[i + 1];
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
// returned UTF-8 string must be freed
|
// returned UTF-8 string must be freed
|
||||||
static __inline char* getenvU(const char* varname)
|
static __inline char* getenvU(const char* varname)
|
||||||
{
|
{
|
||||||
|
|
28
src/rufus.c
28
src/rufus.c
|
@ -126,7 +126,7 @@ char embedded_sl_version_str[2][12] = { "?.??", "?.??" };
|
||||||
char embedded_sl_version_ext[2][32];
|
char embedded_sl_version_ext[2][32];
|
||||||
char ClusterSizeLabel[MAX_CLUSTER_SIZES][64];
|
char ClusterSizeLabel[MAX_CLUSTER_SIZES][64];
|
||||||
char msgbox[1024], msgbox_title[32], *ini_file = NULL, *image_path = NULL, *short_image_path;
|
char msgbox[1024], msgbox_title[32], *ini_file = NULL, *image_path = NULL, *short_image_path;
|
||||||
char image_option_txt[128], *fido_url = NULL;
|
char *archive_path = NULL, image_option_txt[128], *fido_url = NULL;
|
||||||
StrArray DriveId, DriveName, DriveLabel, DriveHub, BlockingProcess, ImageList;
|
StrArray DriveId, DriveName, DriveLabel, DriveHub, BlockingProcess, ImageList;
|
||||||
// Number of steps for each FS for FCC_STRUCTURE_PROGRESS
|
// Number of steps for each FS for FCC_STRUCTURE_PROGRESS
|
||||||
const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10, 1, 1, 1, 1 };
|
const int nb_steps[FS_MAX] = { 5, 5, 12, 1, 10, 1, 1, 1, 1 };
|
||||||
|
@ -2234,6 +2234,24 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
partition_type = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem));
|
partition_type = (int)ComboBox_GetItemData(hTargetSystem, ComboBox_GetCurSel(hTargetSystem));
|
||||||
return (INT_PTR)TRUE;
|
return (INT_PTR)TRUE;
|
||||||
case IDC_SELECT:
|
case IDC_SELECT:
|
||||||
|
// Ctrl-SELECT is used to select an additional archive of files to extract
|
||||||
|
// For now only zip archives are supported.
|
||||||
|
if (GetKeyState(VK_CONTROL) & 0x8000) {
|
||||||
|
EXT_DECL(arch_ext, NULL, __VA_GROUP__("*.zip"), __VA_GROUP__(lmprintf(MSG_309)));
|
||||||
|
if (image_path == NULL)
|
||||||
|
break;
|
||||||
|
archive_path = FileDialog(FALSE, NULL, &arch_ext, 0);
|
||||||
|
if (archive_path != NULL) {
|
||||||
|
struct __stat64 stat64 = { 0 };
|
||||||
|
_stat64U(archive_path, &stat64);
|
||||||
|
img_report.projected_size -= img_report.archive_size;
|
||||||
|
img_report.archive_size = stat64.st_size;
|
||||||
|
img_report.projected_size += img_report.archive_size;
|
||||||
|
uprintf("Using archive: %s (%s)", _filenameU(archive_path),
|
||||||
|
SizeToHumanReadable(img_report.archive_size, FALSE, FALSE));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (select_index == 1) {
|
if (select_index == 1) {
|
||||||
EnableControls(FALSE, FALSE);
|
EnableControls(FALSE, FALSE);
|
||||||
DownloadISO();
|
DownloadISO();
|
||||||
|
@ -2257,6 +2275,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
|
safe_free(archive_path);
|
||||||
free(old_image_path);
|
free(old_image_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2682,11 +2701,10 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
if (persistence_size == 0) {
|
if (persistence_size == 0) {
|
||||||
char* iso_image = lmprintf(MSG_036);
|
char* iso_image = lmprintf(MSG_036);
|
||||||
char* dd_image = lmprintf(MSG_095);
|
char* dd_image = lmprintf(MSG_095);
|
||||||
char* esp_image = lmprintf(MSG_309);
|
|
||||||
// If the ISO is small enough to be written as an ESP and we are using GPT add the ISO → ESP option
|
// If the ISO is small enough to be written as an ESP and we are using GPT add the ISO → ESP option
|
||||||
if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE * MB) && HAS_REGULAR_EFI(img_report) &&
|
if ((img_report.projected_size < MAX_ISO_TO_ESP_SIZE * MB) && HAS_REGULAR_EFI(img_report) &&
|
||||||
(partition_type == PARTITION_STYLE_GPT) && IS_FAT(fs_type)) {
|
(partition_type == PARTITION_STYLE_GPT) && IS_FAT(fs_type)) {
|
||||||
char* choices[3] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, esp_image), lmprintf(MSG_277, dd_image) };
|
char* choices[3] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP"), lmprintf(MSG_277, dd_image) };
|
||||||
i = SelectionDialog(lmprintf(MSG_274), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image),
|
i = SelectionDialog(lmprintf(MSG_274), lmprintf(MSG_275, iso_image, dd_image, iso_image, dd_image),
|
||||||
choices, 3);
|
choices, 3);
|
||||||
if (i < 0) // Cancel
|
if (i < 0) // Cancel
|
||||||
|
@ -2713,8 +2731,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
||||||
// The ISO is small enough to be written as an ESP and we are using GPT
|
// The ISO is small enough to be written as an ESP and we are using GPT
|
||||||
// so ask the users if they want to write it as an ESP.
|
// so ask the users if they want to write it as an ESP.
|
||||||
char* iso_image = lmprintf(MSG_036);
|
char* iso_image = lmprintf(MSG_036);
|
||||||
char* esp_image = lmprintf(MSG_309);
|
char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, "ISO → ESP") };
|
||||||
char* choices[2] = { lmprintf(MSG_276, iso_image), lmprintf(MSG_277, esp_image) };
|
|
||||||
i = SelectionDialog(lmprintf(MSG_274), lmprintf(MSG_310), choices, 2);
|
i = SelectionDialog(lmprintf(MSG_274), lmprintf(MSG_310), choices, 2);
|
||||||
if (i < 0) // Cancel
|
if (i < 0) // Cancel
|
||||||
goto aborted_start;
|
goto aborted_start;
|
||||||
|
@ -3643,6 +3660,7 @@ out:
|
||||||
ClrAlertPromptHook();
|
ClrAlertPromptHook();
|
||||||
exit_localization();
|
exit_localization();
|
||||||
safe_free(image_path);
|
safe_free(image_path);
|
||||||
|
safe_free(archive_path);
|
||||||
safe_free(locale_name);
|
safe_free(locale_name);
|
||||||
safe_free(update.download_url);
|
safe_free(update.download_url);
|
||||||
safe_free(update.release_notes);
|
safe_free(update.release_notes);
|
||||||
|
|
|
@ -328,6 +328,7 @@ typedef struct {
|
||||||
char wininst_path[MAX_WININST][64]; // path to the Windows install image(s)
|
char wininst_path[MAX_WININST][64]; // path to the Windows install image(s)
|
||||||
char efi_img_path[128]; // path to an efi.img file
|
char efi_img_path[128]; // path to an efi.img file
|
||||||
uint64_t image_size;
|
uint64_t image_size;
|
||||||
|
uint64_t archive_size;
|
||||||
uint64_t projected_size;
|
uint64_t projected_size;
|
||||||
int64_t mismatch_size;
|
int64_t mismatch_size;
|
||||||
uint32_t wininst_version;
|
uint32_t wininst_version;
|
||||||
|
|
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 3.11.1671"
|
CAPTION "Rufus 3.11.1672"
|
||||||
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
|
||||||
|
@ -395,8 +395,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,11,1671,0
|
FILEVERSION 3,11,1672,0
|
||||||
PRODUCTVERSION 3,11,1671,0
|
PRODUCTVERSION 3,11,1672,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -414,13 +414,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", "3.11.1671"
|
VALUE "FileVersion", "3.11.1672"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2020 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2020 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-3.11.exe"
|
VALUE "OriginalFilename", "rufus-3.11.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.11.1671"
|
VALUE "ProductVersion", "3.11.1672"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue