mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[iso] notify if the file size on disk is smaller than expected ISO size
* Closes #963 * Also fix a potential issue with Notification()
This commit is contained in:
parent
390c134b7a
commit
150be52479
8 changed files with 46 additions and 7 deletions
|
@ -559,6 +559,10 @@ t MSG_293 "Unsupported Windows version"
|
||||||
t MSG_294 "This version of Windows is no longer supported by Rufus."
|
t MSG_294 "This version of Windows is no longer supported by Rufus."
|
||||||
t MSG_295 "Warning: Unofficial version"
|
t MSG_295 "Warning: Unofficial version"
|
||||||
t MSG_296 "This version of Rufus was NOT produced by its official developer(s).\n\nAre you sure you want to run it?"
|
t MSG_296 "This version of Rufus was NOT produced by its official developer(s).\n\nAre you sure you want to run it?"
|
||||||
|
t MSG_297 "Truncated ISO detected"
|
||||||
|
t MSG_298 "The ISO file you have selected does not match its declared size: %s of data is missing!\n\nIf you obtained "
|
||||||
|
"this file from the Internet, you should try to download a new copy and verify that the MD5 or SHA checksums match "
|
||||||
|
"the official ones.\n\nNote that you can compute the MD5 or SHA in Rufus by clicking the '#' button."
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
############################# TRANSLATOR END COPY ##############################
|
############################# TRANSLATOR END COPY ##############################
|
||||||
|
|
|
@ -651,6 +651,7 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
|
||||||
FILE* fd;
|
FILE* fd;
|
||||||
int r = 1;
|
int r = 1;
|
||||||
iso9660_t* p_iso = NULL;
|
iso9660_t* p_iso = NULL;
|
||||||
|
iso9660_pvd_t pvd;
|
||||||
udf_t* p_udf = NULL;
|
udf_t* p_udf = NULL;
|
||||||
udf_dirent_t* p_udf_root;
|
udf_dirent_t* p_udf_root;
|
||||||
char *tmp, *buf, *ext;
|
char *tmp, *buf, *ext;
|
||||||
|
@ -705,6 +706,8 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
|
||||||
if (scan_only) {
|
if (scan_only) {
|
||||||
if (udf_get_logical_volume_id(p_udf, img_report.label, sizeof(img_report.label)) <= 0)
|
if (udf_get_logical_volume_id(p_udf, img_report.label, sizeof(img_report.label)) <= 0)
|
||||||
img_report.label[0] = 0;
|
img_report.label[0] = 0;
|
||||||
|
// Open the UDF as ISO so that we can perform size checks
|
||||||
|
p_iso = iso9660_open(src_iso);
|
||||||
}
|
}
|
||||||
r = udf_extract_files(p_udf, p_udf_root, "");
|
r = udf_extract_files(p_udf, p_udf_root, "");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -746,6 +749,10 @@ try_iso:
|
||||||
out:
|
out:
|
||||||
iso_blocking_status = -1;
|
iso_blocking_status = -1;
|
||||||
if (scan_only) {
|
if (scan_only) {
|
||||||
|
struct __stat64 stat;
|
||||||
|
// Find if there is a mismatch between the ISO size, as reported by the PVD, and the actual file size
|
||||||
|
if ((iso9660_ifs_read_pvd(p_iso, &pvd)) && (_stat64U(src_iso, &stat) == 0))
|
||||||
|
img_report.mismatch_size = (int64_t)(iso9660_get_pvd_space_size(&pvd)) * ISO_BLOCKSIZE - stat.st_size;
|
||||||
// Remove trailing spaces from the label
|
// Remove trailing spaces from the label
|
||||||
for (j=safe_strlen(img_report.label)-1; ((j>0)&&(isspaceU(img_report.label[j]))); j--)
|
for (j=safe_strlen(img_report.label)-1; ((j>0)&&(isspaceU(img_report.label[j]))); j--)
|
||||||
img_report.label[j] = 0;
|
img_report.label[j] = 0;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* Compensating for what Microsoft should have done a long long time ago.
|
* Compensating for what Microsoft should have done a long long time ago.
|
||||||
* Also see http://utf8everywhere.org/
|
* Also see http://utf8everywhere.org/
|
||||||
*
|
*
|
||||||
* Copyright © 2010-2015 Pete Batard <pete@akeo.ie>
|
* Copyright © 2010-2017 Pete Batard <pete@akeo.ie>
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -31,6 +31,8 @@
|
||||||
#include <share.h>
|
#include <share.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
#if !defined(DDKBUILD)
|
#if !defined(DDKBUILD)
|
||||||
#include <psapi.h>
|
#include <psapi.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -924,6 +926,15 @@ static __inline int _openU(const char *filename, int oflag , int pmode)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static __inline int _stat64U(const char *path, struct __stat64 *buffer)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
wconvert(path);
|
||||||
|
ret = _wstat64(wpath, buffer);
|
||||||
|
wfree(path);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// 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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -533,6 +533,9 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
|
||||||
}
|
}
|
||||||
vuprintf("Found match for %s on server %s", urlpath, server_url);
|
vuprintf("Found match for %s on server %s", urlpath, server_url);
|
||||||
|
|
||||||
|
// IMPORTANT: You might need to edit your server's MIME conf so that it returns
|
||||||
|
// 'text/plain' for .ver files. Use 'curl -I' to check that you get something
|
||||||
|
// like 'Content-Type: text/plain; charset=UTF-8' when fetching your .ver files.
|
||||||
dwSize = sizeof(mime);
|
dwSize = sizeof(mime);
|
||||||
HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, (LPVOID)&mime, &dwSize, NULL);
|
HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, (LPVOID)&mime, &dwSize, NULL);
|
||||||
if (strncmp(mime, "text/plain", sizeof("text/plain")-1) != 0)
|
if (strncmp(mime, "text/plain", sizeof("text/plain")-1) != 0)
|
||||||
|
|
11
src/rufus.c
11
src/rufus.c
|
@ -973,6 +973,17 @@ static void DisplayISOProps(void)
|
||||||
|
|
||||||
uprintf("ISO label: '%s'", img_report.label);
|
uprintf("ISO label: '%s'", img_report.label);
|
||||||
uprintf(" Size: %s (Projected)", SizeToHumanReadable(img_report.projected_size, FALSE, FALSE));
|
uprintf(" Size: %s (Projected)", SizeToHumanReadable(img_report.projected_size, FALSE, FALSE));
|
||||||
|
if (img_report.mismatch_size > 0) {
|
||||||
|
uprintf(" ERROR: Detected that file on disk has been truncated by %s!",
|
||||||
|
SizeToHumanReadable(img_report.mismatch_size, FALSE, FALSE));
|
||||||
|
MessageBoxU(hMainDialog, lmprintf(MSG_298, SizeToHumanReadable(img_report.mismatch_size, FALSE, FALSE)),
|
||||||
|
lmprintf(MSG_297), MB_ICONWARNING);
|
||||||
|
} else if (img_report.mismatch_size < 0) {
|
||||||
|
// Not an error (ISOHybrid?), but we report it just in case
|
||||||
|
uprintf(" Note: File on disk is larger than reported ISO size by %s...",
|
||||||
|
SizeToHumanReadable(-img_report.mismatch_size, FALSE, FALSE));
|
||||||
|
}
|
||||||
|
|
||||||
PRINT_ISO_PROP(img_report.has_4GB_file, " Has a >4GB file");
|
PRINT_ISO_PROP(img_report.has_4GB_file, " Has a >4GB file");
|
||||||
PRINT_ISO_PROP(img_report.has_long_filename, " Has a >64 chars filename");
|
PRINT_ISO_PROP(img_report.has_long_filename, " Has a >64 chars filename");
|
||||||
PRINT_ISO_PROP(HAS_SYSLINUX(img_report), " Uses: Syslinux/Isolinux v%s", img_report.sl_version_str);
|
PRINT_ISO_PROP(HAS_SYSLINUX(img_report), " Uses: Syslinux/Isolinux v%s", img_report.sl_version_str);
|
||||||
|
|
|
@ -279,6 +279,7 @@ 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 image_size;
|
uint64_t image_size;
|
||||||
uint64_t projected_size;
|
uint64_t projected_size;
|
||||||
|
int64_t mismatch_size;
|
||||||
uint32_t install_wim_version;
|
uint32_t install_wim_version;
|
||||||
BOOLEAN is_iso;
|
BOOLEAN is_iso;
|
||||||
BOOLEAN is_bootable_img;
|
BOOLEAN is_bootable_img;
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,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
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 2.15.1119"
|
CAPTION "Rufus 2.15.1120"
|
||||||
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
|
||||||
|
@ -334,8 +334,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,15,1119,0
|
FILEVERSION 2,15,1120,0
|
||||||
PRODUCTVERSION 2,15,1119,0
|
PRODUCTVERSION 2,15,1120,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -352,13 +352,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.15.1119"
|
VALUE "FileVersion", "2.15.1120"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2017 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.15.1119"
|
VALUE "ProductVersion", "2.15.1120"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -813,7 +813,8 @@ BOOL Notification(int type, const notification_info* more_info, char* title, cha
|
||||||
dialog_showing++;
|
dialog_showing++;
|
||||||
szMessageText = (char*)malloc(MAX_PATH);
|
szMessageText = (char*)malloc(MAX_PATH);
|
||||||
if (szMessageText == NULL) return FALSE;
|
if (szMessageText == NULL) return FALSE;
|
||||||
szMessageTitle = title;
|
szMessageTitle = safe_strdup(title);
|
||||||
|
if (szMessageTitle == NULL) return FALSE;
|
||||||
va_start(args, format);
|
va_start(args, format);
|
||||||
safe_vsnprintf(szMessageText, MAX_PATH-1, format, args);
|
safe_vsnprintf(szMessageText, MAX_PATH-1, format, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
@ -839,6 +840,7 @@ BOOL Notification(int type, const notification_info* more_info, char* title, cha
|
||||||
}
|
}
|
||||||
ret = (MyDialogBox(hMainInstance, IDD_NOTIFICATION, hMainDialog, NotificationCallback) == IDYES);
|
ret = (MyDialogBox(hMainInstance, IDD_NOTIFICATION, hMainDialog, NotificationCallback) == IDYES);
|
||||||
safe_free(szMessageText);
|
safe_free(szMessageText);
|
||||||
|
safe_free(szMessageTitle);
|
||||||
dialog_showing--;
|
dialog_showing--;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue