From 1e51385bedcef1ce94ed6c2f52b25e04ef8a0508 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Mon, 24 Apr 2023 20:50:53 +0100 Subject: [PATCH] [misc] revert to using the OS arch rather than app arch for the update download * This means that someone running Rufus x64 or ARM64 should be proposed Rufus ARM64 rather than Rufus x64 as an upgrade. * Also switch the BETA channel from x86 to x64. * Also remove the _chdirU(app_dir) when using -i in commandline. --- src/net.c | 13 +++++++------ src/parser.c | 2 +- src/rufus.c | 6 ++---- src/rufus.h | 7 +++---- src/rufus.rc | 10 +++++----- src/stdfn.c | 15 --------------- src/stdlg.c | 8 ++++---- 7 files changed, 22 insertions(+), 39 deletions(-) diff --git a/src/net.c b/src/net.c index c234b1ca..1be933ca 100644 --- a/src/net.c +++ b/src/net.c @@ -52,7 +52,7 @@ HANDLE update_check_thread = NULL; extern loc_cmd* selected_locale; extern HANDLE dialog_handle; -extern BOOL is_x86_32; +extern BOOL is_x86_64; static DWORD error_code, fido_len = 0; static BOOL force_update_check = FALSE; static const char* request_headers = "Accept-Encoding: gzip, deflate"; @@ -669,7 +669,7 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) // It would of course be a lot nicer to use a timer and wake the thread, but my // development time is limited and this is FASTER to implement. do { - for (i=0; (i<30) && (!force_update_check); i++) + for (i = 0; ( i < 30) && (!force_update_check); i++) Sleep(500); } while ((!force_update_check) && ((op_in_progress || (dialog_showing > 0)))); if (!force_update_check) { @@ -686,7 +686,7 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) GetSystemTime(&LocalTime); if (!SystemTimeToFileTime(&LocalTime, &FileTime)) goto out; - local_time = ((((int64_t)FileTime.dwHighDateTime)<<32) + FileTime.dwLowDateTime) / 10000000; + local_time = ((((int64_t)FileTime.dwHighDateTime) << 32) + FileTime.dwLowDateTime) / 10000000; vvuprintf("Local time: %" PRId64, local_time); if (local_time < reg_time + update_interval) { vuprintf("Next update check in %" PRId64 " seconds.", reg_time + update_interval - local_time); @@ -714,8 +714,8 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) goto out; status++; // 2 - // BETAs are only made available for x86_32 - if (is_x86_32) + // BETAs are only made available when the application arch is x86_64 + if (is_x86_64) releases_only = !ReadSettingBool(SETTING_INCLUDE_BETAS); // Test releases get their own distribution channel (and also force beta checks) @@ -735,8 +735,9 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) // and then remove each of the components until we find our match. For instance, we may first // look for rufus_win_x64_6.2.ver (Win8 x64) but only get a match for rufus_win_x64_6.ver (Vista x64 or later) // This allows sunsetting OS versions (eg XP) or providing different downloads for different archs/groups. + // Note that for BETAs, we only catter for x64 regardless of the OS arch. static_sprintf(urlpath, "%s%s%s_win_%s_%lu.%lu.ver", APPLICATION_NAME, (k == 0) ? "": "_", - (k == 0) ? "" : channel[k], GetAppArchName(), WindowsVersion.Major, WindowsVersion.Minor); + (k == 0) ? "" : channel[k], GetArchName(WindowsVersion.Arch), WindowsVersion.Major, WindowsVersion.Minor); vuprintf("Base update check: %s", urlpath); for (i = 0, j = (int)safe_strlen(urlpath) - 5; (j > 0) && (i < ARRAYSIZE(verpos)); j--) { if ((urlpath[j] == '.') || (urlpath[j] == '_')) { diff --git a/src/parser.c b/src/parser.c index e6a16f01..f9d15c21 100644 --- a/src/parser.c +++ b/src/parser.c @@ -950,7 +950,7 @@ void parse_update(char* buf, size_t len) } safe_free(data); } - static_sprintf(download_url_name, "download_url_%s", GetAppArchName()); + static_sprintf(download_url_name, "download_url_%s", GetArchName(WindowsVersion.Arch)); update.download_url = get_sanitized_token_data_buffer(download_url_name, 1, buf, len); if (update.download_url == NULL) update.download_url = get_sanitized_token_data_buffer("download_url", 1, buf, len); diff --git a/src/rufus.c b/src/rufus.c index 61f3d87e..3db818b5 100755 --- a/src/rufus.c +++ b/src/rufus.c @@ -121,7 +121,7 @@ DWORD MainThreadId; HWND hDeviceList, hPartitionScheme, hTargetSystem, hFileSystem, hClusterSize, hLabel, hBootType, hNBPasses, hLog = NULL; HWND hImageOption, hLogDialog = NULL, hProgress = NULL, hDiskID; HANDLE dialog_handle = NULL; -BOOL is_x86_32, use_own_c32[NB_OLD_C32] = { FALSE, FALSE }, mbr_selected_by_user = FALSE, lock_drive = TRUE; +BOOL is_x86_64, use_own_c32[NB_OLD_C32] = { FALSE, FALSE }, mbr_selected_by_user = FALSE, lock_drive = TRUE; BOOL op_in_progress = TRUE, right_to_left_mode = FALSE, has_uefi_csm = FALSE, its_a_me_mario = FALSE; BOOL enable_HDDs = FALSE, enable_VHDs = TRUE, enable_ntfs_compression = FALSE, no_confirmation_on_cancel = FALSE; BOOL advanced_mode_device, advanced_mode_format, allow_dual_uefi_bios, detect_fakes, enable_vmdk, force_large_fat32; @@ -3378,8 +3378,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine uprintf("*** " APPLICATION_NAME " init ***\n"); its_a_me_mario = GetUserNameA((char*)(uintptr_t)&u, &size) && (u == 7104878); // coverity[pointless_string_compare] - // TODO: We'll need to change this when/if we switch to x86_64 default binary - is_x86_32 = (strcmp(APPLICATION_ARCH, "x86") == 0); + is_x86_64 = (strcmp(APPLICATION_ARCH, "x64") == 0); // Retrieve various app & system directories. if (GetCurrentDirectoryU(sizeof(app_dir), app_dir) == 0) { @@ -3502,7 +3501,6 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine image_path = calloc(1, MAX_PATH); if (image_path == NULL) break; - IGNORE_RETVAL(_chdirU(app_dir)); IGNORE_RETVAL(GetFullPathNameU(optarg, MAX_PATH, image_path, NULL)); // FILE_ATTRIBUTE_DIRECTORY is set for both dir and access error if (GetFileAttributesU(image_path) & FILE_ATTRIBUTE_DIRECTORY) { diff --git a/src/rufus.h b/src/rufus.h index 8a9a0381..78f966ec 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -512,11 +512,11 @@ static __inline const char* GetArchName(USHORT uArch) case IMAGE_FILE_MACHINE_I386: return "x86"; case IMAGE_FILE_MACHINE_ARM64: - return "Arm64"; + return "arm64"; case IMAGE_FILE_MACHINE_ARM: - return "Arm"; + return "arm"; default: - return "(Unknown Arch)"; + return "unknown"; } } @@ -595,7 +595,6 @@ extern char app_data_dir[MAX_PATH], *image_path, *fido_url; * Shared prototypes */ extern void GetWindowsVersion(windows_version_t* WindowsVersion); -extern const char* GetAppArchName(void); extern const char* WindowsErrorString(void); extern void DumpBufferHex(void *buf, size_t size); extern void PrintStatusInfo(BOOL info, BOOL debug, unsigned int duration, int msg_id, ...); diff --git a/src/rufus.rc b/src/rufus.rc index 76fc0601..9d5d7d96 100644 --- a/src/rufus.rc +++ b/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.0.2030" +CAPTION "Rufus 4.0.2031" 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,0,2030,0 - PRODUCTVERSION 4,0,2030,0 + FILEVERSION 4,0,2031,0 + PRODUCTVERSION 4,0,2031,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.0.2030" + VALUE "FileVersion", "4.0.2031" VALUE "InternalName", "Rufus" VALUE "LegalCopyright", "© 2011-2023 Pete Batard (GPL v3)" VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html" VALUE "OriginalFilename", "rufus-4.0.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "4.0.2030" + VALUE "ProductVersion", "4.0.2031" END END BLOCK "VarFileInfo" diff --git a/src/stdfn.c b/src/stdfn.c index dcf031a4..5e38ee2b 100644 --- a/src/stdfn.c +++ b/src/stdfn.c @@ -204,21 +204,6 @@ uint32_t htab_hash(char* str, htab_table* htab) return idx; } -const char* GetAppArchName(void) { -#if defined(_M_AMD64) - return "x64"; -#elif defined(_M_IX86) - return "x86"; -#elif defined(_M_ARM64) - return "arm64"; -#elif defined(_M_ARM) - return "arm"; -#else - // Keep in line with what we were doing in 3.x - return "none"; -#endif -} - static const char* GetEdition(DWORD ProductType) { static char unknown_edition_str[64]; diff --git a/src/stdlg.c b/src/stdlg.c index e2b2b38e..443cdacb 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -45,7 +45,7 @@ #include "license.h" /* Globals */ -extern BOOL is_x86_32, appstore_version; +extern BOOL is_x86_64, appstore_version; extern char unattend_username[MAX_USERNAME_LENGTH]; static HICON hMessageIcon = (HICON)INVALID_HANDLE_VALUE; static char* szMessageText = NULL; @@ -1494,7 +1494,7 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l IGNORE_RETVAL(ComboBox_SetItemData(hFrequency, ComboBox_AddStringU(hFrequency, lmprintf(MSG_016)), 2629800)); freq = ReadSetting32(SETTING_UPDATE_INTERVAL); EnableWindow(GetDlgItem(hDlg, IDC_CHECK_NOW), (freq != 0)); - EnableWindow(hBeta, (freq >= 0) && is_x86_32); + EnableWindow(hBeta, (freq >= 0) && is_x86_64); switch(freq) { case -1: IGNORE_RETVAL(ComboBox_SetCurSel(hFrequency, 0)); @@ -1516,7 +1516,7 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l } IGNORE_RETVAL(ComboBox_AddStringU(hBeta, lmprintf(MSG_008))); IGNORE_RETVAL(ComboBox_AddStringU(hBeta, lmprintf(MSG_009))); - IGNORE_RETVAL(ComboBox_SetCurSel(hBeta, (ReadSettingBool(SETTING_INCLUDE_BETAS) && is_x86_32) ? 0 : 1)); + IGNORE_RETVAL(ComboBox_SetCurSel(hBeta, (ReadSettingBool(SETTING_INCLUDE_BETAS) && is_x86_64) ? 0 : 1)); hPolicy = GetDlgItem(hDlg, IDC_POLICY); SendMessage(hPolicy, EM_AUTOURLDETECT, 1, 0); static_sprintf(update_policy_text, update_policy, lmprintf(MSG_179|MSG_RTF), @@ -1558,7 +1558,7 @@ INT_PTR CALLBACK UpdateCallback(HWND hDlg, UINT message, WPARAM wParam, LPARAM l break; freq = (int32_t)ComboBox_GetCurItemData(hFrequency); WriteSetting32(SETTING_UPDATE_INTERVAL, (DWORD)freq); - EnableWindow(hBeta, (freq >= 0) && is_x86_32); + EnableWindow(hBeta, (freq >= 0) && is_x86_64); return (INT_PTR)TRUE; case IDC_INCLUDE_BETAS: if (HIWORD(wParam) != CBN_SELCHANGE)