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_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_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 ##############################
|
||||
|
|
|
@ -651,6 +651,7 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
|
|||
FILE* fd;
|
||||
int r = 1;
|
||||
iso9660_t* p_iso = NULL;
|
||||
iso9660_pvd_t pvd;
|
||||
udf_t* p_udf = NULL;
|
||||
udf_dirent_t* p_udf_root;
|
||||
char *tmp, *buf, *ext;
|
||||
|
@ -705,6 +706,8 @@ BOOL ExtractISO(const char* src_iso, const char* dest_dir, BOOL scan)
|
|||
if (scan_only) {
|
||||
if (udf_get_logical_volume_id(p_udf, img_report.label, sizeof(img_report.label)) <= 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, "");
|
||||
goto out;
|
||||
|
@ -746,6 +749,10 @@ try_iso:
|
|||
out:
|
||||
iso_blocking_status = -1;
|
||||
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
|
||||
for (j=safe_strlen(img_report.label)-1; ((j>0)&&(isspaceU(img_report.label[j]))); j--)
|
||||
img_report.label[j] = 0;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* Compensating for what Microsoft should have done a long long time ago.
|
||||
* 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
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
|
@ -31,6 +31,8 @@
|
|||
#include <share.h>
|
||||
#include <fcntl.h>
|
||||
#include <io.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#if !defined(DDKBUILD)
|
||||
#include <psapi.h>
|
||||
#endif
|
||||
|
@ -924,6 +926,15 @@ static __inline int _openU(const char *filename, int oflag , int pmode)
|
|||
}
|
||||
#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
|
||||
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);
|
||||
|
||||
// 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);
|
||||
HttpQueryInfoA(hRequest, HTTP_QUERY_CONTENT_TYPE, (LPVOID)&mime, &dwSize, NULL);
|
||||
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(" 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_long_filename, " Has a >64 chars filename");
|
||||
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 */
|
||||
uint64_t image_size;
|
||||
uint64_t projected_size;
|
||||
int64_t mismatch_size;
|
||||
uint32_t install_wim_version;
|
||||
BOOLEAN is_iso;
|
||||
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
|
||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
EXSTYLE WS_EX_ACCEPTFILES
|
||||
CAPTION "Rufus 2.15.1119"
|
||||
CAPTION "Rufus 2.15.1120"
|
||||
FONT 8, "Segoe UI Symbol", 400, 0, 0x0
|
||||
BEGIN
|
||||
LTEXT "Device",IDS_DEVICE_TXT,9,6,200,8
|
||||
|
@ -334,8 +334,8 @@ END
|
|||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 2,15,1119,0
|
||||
PRODUCTVERSION 2,15,1119,0
|
||||
FILEVERSION 2,15,1120,0
|
||||
PRODUCTVERSION 2,15,1120,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
|
@ -352,13 +352,13 @@ BEGIN
|
|||
BEGIN
|
||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||
VALUE "FileDescription", "Rufus"
|
||||
VALUE "FileVersion", "2.15.1119"
|
||||
VALUE "FileVersion", "2.15.1120"
|
||||
VALUE "InternalName", "Rufus"
|
||||
VALUE "LegalCopyright", "© 2011-2017 Pete Batard (GPL v3)"
|
||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||
VALUE "OriginalFilename", "rufus.exe"
|
||||
VALUE "ProductName", "Rufus"
|
||||
VALUE "ProductVersion", "2.15.1119"
|
||||
VALUE "ProductVersion", "2.15.1120"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
|
|
@ -813,7 +813,8 @@ BOOL Notification(int type, const notification_info* more_info, char* title, cha
|
|||
dialog_showing++;
|
||||
szMessageText = (char*)malloc(MAX_PATH);
|
||||
if (szMessageText == NULL) return FALSE;
|
||||
szMessageTitle = title;
|
||||
szMessageTitle = safe_strdup(title);
|
||||
if (szMessageTitle == NULL) return FALSE;
|
||||
va_start(args, format);
|
||||
safe_vsnprintf(szMessageText, MAX_PATH-1, format, 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);
|
||||
safe_free(szMessageText);
|
||||
safe_free(szMessageTitle);
|
||||
dialog_showing--;
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue