From e5f90282ed198a2e4eccf4b5ca158b14a0ec45d4 Mon Sep 17 00:00:00 2001 From: Pete Batard Date: Mon, 17 Apr 2023 13:33:05 +0100 Subject: [PATCH] [misc] improve Windows version detection * Also use actual Windows major.minor when checking for updates --- src/drive.c | 6 +++--- src/format.c | 4 ++-- src/net.c | 21 ++++++++------------- src/rufus.c | 37 ++++++++++++++++++++----------------- src/rufus.h | 22 +++++++++++++++------- src/rufus.rc | 10 +++++----- src/stdfn.c | 46 +++++++++++++++++++++++----------------------- src/stdlg.c | 2 +- src/ui.c | 6 +++--- src/wue.c | 6 +++--- 10 files changed, 83 insertions(+), 77 deletions(-) diff --git a/src/drive.c b/src/drive.c index 90824c17..43d94644 100644 --- a/src/drive.c +++ b/src/drive.c @@ -73,7 +73,7 @@ PF_TYPE_DECL(NTAPI, NTSTATUS, NtQueryVolumeInformationFile, (HANDLE, PIO_STATUS_ */ RUFUS_DRIVE_INFO SelectedDrive; extern BOOL write_as_esp; -extern int nWindowsVersion, nWindowsBuildNumber; +extern windows_version_t WindowsVersion; uint64_t partition_offset[PI_MAX]; uint64_t persistence_size = 0; @@ -1592,7 +1592,7 @@ BOOL ToggleEsp(DWORD DriveIndex, uint64_t PartitionOffset) { 0x0c, { 'F', 'A', 'T', '3', '2', ' ', ' ', ' ' } }, }; - if ((PartitionOffset == 0) && (nWindowsVersion < WINDOWS_10)) { + if ((PartitionOffset == 0) && (WindowsVersion.Version < WINDOWS_10)) { uprintf("ESP toggling is only available for Windows 10 or later"); return FALSE; } @@ -2318,7 +2318,7 @@ BOOL CreatePartition(HANDLE hDrive, int partition_style, int file_system, BOOL m // Having the ESP up front may help (and is the Microsoft recommended way) but this // is only achievable if we can mount more than one partition at once, which means // either fixed drive or Windows 10 1703 or later. - if (((SelectedDrive.MediaType == FixedMedia) || (nWindowsBuildNumber > 15000)) && + if (((SelectedDrive.MediaType == FixedMedia) || (WindowsVersion.BuildNumber > 15000)) && (extra_partitions & XP_ESP)) { assert(partition_style == PARTITION_STYLE_GPT); extra_part_name = L"EFI System Partition"; diff --git a/src/format.c b/src/format.c index c221991a..83f55a64 100644 --- a/src/format.c +++ b/src/format.c @@ -1423,7 +1423,7 @@ DWORD WINAPI FormatThread(void* param) BOOL ret, use_large_fat32, windows_to_go, actual_lock_drive = lock_drive, write_as_ext = FALSE; // Windows 11 and VDS (which I suspect is what fmifs.dll's FormatEx() is now calling behind the scenes) // require us to unlock the physical drive to format the drive, else access denied is returned. - BOOL need_logical = FALSE, must_unlock_physical = (use_vds || nWindowsVersion >= WINDOWS_11); + BOOL need_logical = FALSE, must_unlock_physical = (use_vds || WindowsVersion.Version >= WINDOWS_11); DWORD cr, DriveIndex = (DWORD)(uintptr_t)param, ClusterSize, Flags; HANDLE hPhysicalDrive = INVALID_HANDLE_VALUE; HANDLE hLogicalVolume = INVALID_HANDLE_VALUE; @@ -1462,7 +1462,7 @@ DWORD WINAPI FormatThread(void* param) actual_lock_drive = FALSE; // Windows 11 is a lot more proactive in locking ESPs and MSRs than previous versions // were, meaning that we also can't lock the drive without incurring errors... - if ((nWindowsVersion >= WINDOWS_11) && extra_partitions) + if ((WindowsVersion.Version >= WINDOWS_11) && extra_partitions) actual_lock_drive = FALSE; // Fixed drives + ext2/ext3 don't play nice and require the same handling as ESPs write_as_ext = IS_EXT(fs_type) && (GetDriveTypeFromIndex(DriveIndex) == DRIVE_FIXED); diff --git a/src/net.c b/src/net.c index 97be44ef..e216d65e 100644 --- a/src/net.c +++ b/src/net.c @@ -309,7 +309,7 @@ static HINTERNET GetInternetSession(BOOL bRetry) } static_sprintf(agent, APPLICATION_NAME "/%d.%d.%d (Windows NT %d.%d%s)", rufus_version[0], rufus_version[1], rufus_version[2], - nWindowsVersion >> 4, nWindowsVersion & 0x0F, is_x64() ? "; WOW64" : ""); + WindowsVersion.Major, WindowsVersion.Minor, is_x64() ? "; WOW64" : ""); hSession = pfInternetOpenA(agent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); // Set the timeouts pfInternetSetOptionA(hSession, INTERNET_OPTION_CONNECT_TIMEOUT, (LPVOID)&dwTimeout, sizeof(dwTimeout)); @@ -631,7 +631,6 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) char agent[64], hostname[64], urlpath[128], sigpath[256]; DWORD dwSize, dwDownloaded, dwTotalSize, dwStatus; BYTE *sig = NULL; - OSVERSIONINFOA os_version = { sizeof(OSVERSIONINFOA), 0, 0, 0, 0, "" }; HINTERNET hSession = NULL, hConnection = NULL, hRequest = NULL; URL_COMPONENTSA UrlParts = { sizeof(URL_COMPONENTSA), NULL, 1, (INTERNET_SCHEME)0, hostname, sizeof(hostname), 0, NULL, 1, urlpath, sizeof(urlpath), NULL, 1 }; @@ -692,22 +691,18 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) PrintInfoDebug(3000, MSG_243); status++; // 1 - if (!GetVersionExA(&os_version)) { - uprintf("Could not read Windows version - Check for updates cancelled."); - goto out; - } - if (!pfInternetCrackUrlA(server_url, (DWORD)safe_strlen(server_url), 0, &UrlParts)) goto out; hostname[sizeof(hostname)-1] = 0; static_sprintf(agent, APPLICATION_NAME "/%d.%d.%d (Windows NT %d.%d%s)", rufus_version[0], rufus_version[1], rufus_version[2], - nWindowsVersion >> 4, nWindowsVersion & 0x0F, is_x64() ? "; WOW64" : ""); + WindowsVersion.Major, WindowsVersion.Minor, is_x64() ? "; WOW64" : ""); hSession = GetInternetSession(FALSE); if (hSession == NULL) goto out; - hConnection = pfInternetConnectA(hSession, UrlParts.lpszHostName, UrlParts.nPort, NULL, NULL, INTERNET_SERVICE_HTTP, 0, (DWORD_PTR)NULL); + hConnection = pfInternetConnectA(hSession, UrlParts.lpszHostName, UrlParts.nPort, + NULL, NULL, INTERNET_SERVICE_HTTP, 0, (DWORD_PTR)NULL); if (hConnection == NULL) goto out; @@ -723,7 +718,7 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) max_channel = releases_only ? 1 : (int)ARRAYSIZE(channel) - 1; #endif vuprintf("Using %s for the update check", RUFUS_URL); - for (k=0; (k 0) && (i < ARRAYSIZE(verpos)); j--) { if ((urlpath[j] == '.') || (urlpath[j] == '_')) { @@ -825,8 +820,8 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param) vuprintf(" url: %s", update.download_url); found_new_version = ((to_uint64_t(update.version) > to_uint64_t(rufus_version)) || (force_update)) - && ((os_version.dwMajorVersion > update.platform_min[0]) - || ((os_version.dwMajorVersion == update.platform_min[0]) && (os_version.dwMinorVersion >= update.platform_min[1]))); + && ((WindowsVersion.Major > update.platform_min[0]) + || ((WindowsVersion.Major == update.platform_min[0]) && (WindowsVersion.Minor >= update.platform_min[1]))); uprintf("N%sew %s version found%c", found_new_version ? "" : "o n", channel[k], found_new_version ? '!' : '.'); } diff --git a/src/rufus.c b/src/rufus.c index 9ef7e1ce..0733a062 100755 --- a/src/rufus.c +++ b/src/rufus.c @@ -226,10 +226,10 @@ static void SetBootOptions(void) IGNORE_RETVAL(ComboBox_ResetContent(hBootType)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, lmprintf(MSG_279)), BT_NON_BOOTABLE)); - if (nWindowsVersion < WINDOWS_10) // The diskcopy.dll along with its MS-DOS floppy image was removed in Windows 10 + if (WindowsVersion.Version < WINDOWS_10) // The diskcopy.dll along with its MS-DOS floppy image was removed in Windows 10 IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "MS-DOS"), BT_MSDOS)); IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, "FreeDOS"), BT_FREEDOS)); - image_index = (nWindowsVersion < WINDOWS_10) ? 3 : 2; + image_index = (WindowsVersion.Version < WINDOWS_10) ? 3 : 2; IGNORE_RETVAL(ComboBox_SetItemData(hBootType, ComboBox_AddStringU(hBootType, (image_path == NULL) ? lmprintf(MSG_281, lmprintf(MSG_280)) : short_image_path), BT_IMAGE)); @@ -411,12 +411,12 @@ static BOOL IsRefsAvailable(MEDIA_TYPE MediaType) if (MediaType != FixedMedia) return FALSE; - if (nWindowsVersion < WINDOWS_8_1 || nWindowsBuildNumber <= 0) + if (WindowsVersion.Version < WINDOWS_8_1 || WindowsVersion.BuildNumber <= 0) return FALSE; // Per https://gist.github.com/0xbadfca11/da0598e47dd643d933dc - if (nWindowsBuildNumber < 16226) + if (WindowsVersion.BuildNumber < 16226) return TRUE; - switch (nWindowsEdition) { + switch (WindowsVersion.Edition) { case 0x0000000A: // Enterprise Server case 0x0000001B: // Enterprise N case 0x00000046: // Enterprise E @@ -1494,7 +1494,7 @@ static DWORD WINAPI BootCheckThread(LPVOID param) goto out; } if (SelectedDrive.MediaType != FixedMedia) { - if ((target_type == TT_UEFI) && (partition_type == PARTITION_STYLE_GPT) && (nWindowsBuildNumber < 15000)) { + if ((target_type == TT_UEFI) && (partition_type == PARTITION_STYLE_GPT) && (WindowsVersion.BuildNumber < 15000)) { // Up to Windows 10 Creators Update (1703), we were screwed, since we need access to 2 partitions at the same time. // Thankfully, the newer Windows allow mounting multiple partitions on the same REMOVABLE drive. MessageBoxExU(hMainDialog, lmprintf(MSG_198), lmprintf(MSG_190), MB_OK|MB_ICONERROR|MB_IS_RTL, selected_langid); @@ -1511,7 +1511,7 @@ static DWORD WINAPI BootCheckThread(LPVOID param) default: break; } - if ((nWindowsVersion >= WINDOWS_8) && IS_WINDOWS_1X(img_report)) { + if ((WindowsVersion.Version >= WINDOWS_8) && IS_WINDOWS_1X(img_report)) { StrArray options; int arch = _log2(img_report.has_efi >> 1); uint8_t map[8] = { 0 }, b = 1; @@ -1573,7 +1573,7 @@ static DWORD WINAPI BootCheckThread(LPVOID param) MessageBoxExU(hMainDialog, lmprintf(MSG_100), lmprintf(MSG_099), MB_OK | MB_ICONERROR | MB_IS_RTL, selected_langid); goto out; } - if ((nWindowsVersion >= WINDOWS_8) && IS_WINDOWS_1X(img_report) && (!is_windows_to_go)) { + if ((WindowsVersion.Version >= WINDOWS_8) && IS_WINDOWS_1X(img_report) && (!is_windows_to_go)) { StrArray options; int arch = _log2(img_report.has_efi >> 1); uint8_t map[8] = { 0 }, b = 1; @@ -2041,7 +2041,7 @@ static void InitDialog(HWND hDlg) free(buf); } } - uprintf("Windows version: %s", WindowsVersionStr); + uprintf("Windows version: %s", WindowsVersion.VersionStr); uprintf("Syslinux versions: %s%s, %s%s", embedded_sl_version_str[0], embedded_sl_version_ext[0], embedded_sl_version_str[1], embedded_sl_version_ext[1]); uprintf("Grub versions: %s, %s", GRUB4DOS_VERSION, GRUB2_PACKAGE_VERSION); @@ -2453,7 +2453,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA nHeight = DialogRect.bottom - DialogRect.top; GetWindowRect(hDlg, &DialogRect); offset = GetSystemMetrics(SM_CXBORDER); - if (nWindowsVersion >= WINDOWS_10) { + if (WindowsVersion.Version >= WINDOWS_10) { // See https://stackoverflow.com/a/42491227/1069307 // I agree with Stephen Hazel: Whoever at Microsoft thought it would be a great idea to // add a *FRIGGING INVISIBLE BORDER* in Windows 10 should face the harshest punishment! @@ -2925,7 +2925,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA // The things one must do to get an ellipsis and text alignment on the status bar... if (wParam == IDC_STATUS) { pDI = (DRAWITEMSTRUCT*)lParam; - if (nWindowsVersion >= WINDOWS_10) + if (WindowsVersion.Version >= WINDOWS_10) pDI->rcItem.top += (int)(1.0f * fScale); else if (fScale >= 1.49f) pDI->rcItem.top -= (int)(1.5f * fScale); @@ -3207,7 +3207,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA if (BlockingProcess.Index > 0) { ListDialog(lmprintf(MSG_042), lmprintf(MSG_055), BlockingProcess.String, BlockingProcess.Index); } else { - if (nWindowsVersion >= WINDOWS_10) { + if (WindowsVersion.Version >= WINDOWS_10) { // Try to detect if 'Controlled Folder Access' is enabled on Windows 10 or later. See also: // http://www.winhelponline.com/blog/use-controlled-folder-access-windows-10-windows-defender char cmdline[256]; @@ -3402,6 +3402,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); // Retrieve various app & system directories. @@ -3678,20 +3679,22 @@ skip_args_processing: selected_langid = get_language_id(selected_locale); // Set the Windows version - GetWindowsVersion(); + GetWindowsVersion(&WindowsVersion); // Force a version if specified as parameter, but without allowing folks running // a version of Windows we no longer support to use the option as a bypass! - if (nWindowsVersion > WINDOWS_7 && forced_windows_version != 0) - nWindowsVersion = forced_windows_version; + if (WindowsVersion.Version > WINDOWS_7 && forced_windows_version != 0) + WindowsVersion.Version = forced_windows_version; // ...and nothing of value was lost - if (nWindowsVersion <= WINDOWS_7) { + if (WindowsVersion.Version <= WINDOWS_7) { // Load the translation before we print the error get_loc_data_file(loc_file, selected_locale); right_to_left_mode = ((selected_locale->ctrl_id) & LOC_RIGHT_TO_LEFT); // Set MB_SYSTEMMODAL to prevent Far Manager from stealing focus... MessageBoxExU(NULL, - lmprintf(MSG_294, (nWindowsVersion == WINDOWS_7) ? 3 : 2, (nWindowsVersion == WINDOWS_7) ? 22 : 18), + lmprintf(MSG_294, + (WindowsVersion.Version == WINDOWS_7) ? 3 : 2, + (WindowsVersion.Version == WINDOWS_7) ? 22 : 18), lmprintf(MSG_293), MB_ICONSTOP | MB_IS_RTL | MB_SYSTEMMODAL, selected_langid); goto out; } diff --git a/src/rufus.h b/src/rufus.h index c7b92348..679ca217 100644 --- a/src/rufus.h +++ b/src/rufus.h @@ -478,8 +478,7 @@ typedef enum TASKBAR_PROGRESS_FLAGS /* Windows versions */ enum WindowsVersion { - WINDOWS_UNDEFINED = -1, - WINDOWS_UNSUPPORTED = 0, + WINDOWS_UNDEFINED = 0, WINDOWS_XP = 0x51, WINDOWS_2003 = 0x52, // Also XP_64 WINDOWS_VISTA = 0x60, // Also Server 2008 @@ -489,7 +488,7 @@ enum WindowsVersion { WINDOWS_10_PREVIEW1 = 0x64, WINDOWS_10 = 0xA0, // Also Server 2016, also Server 2019 WINDOWS_11 = 0xB0, // Also Server 2022 - WINDOWS_MAX + WINDOWS_MAX = 0xFFFF, }; enum ArchType { @@ -506,6 +505,15 @@ enum ArchType { ARCH_MAX }; +typedef struct { + DWORD Version; + DWORD Major; + DWORD Minor; + DWORD BuildNumber; + DWORD Edition; + char VersionStr[128]; +} windows_version_t; + // Windows User Experience (unattend.xml) flags and masks #define UNATTEND_SECUREBOOT_TPM_MINRAM 0x00001 #define UNATTEND_NO_ONLINE_ACCOUNT 0x00004 @@ -545,17 +553,17 @@ extern uint64_t persistence_size; extern size_t ubuffer_pos; extern const int nb_steps[FS_MAX]; extern float fScale; -extern int nWindowsVersion, nWindowsBuildNumber, nWindowsEdition, dialog_showing, force_update; -extern int fs_type, boot_type, partition_type, target_type; +extern windows_version_t WindowsVersion; +extern int dialog_showing, force_update, fs_type, boot_type, partition_type, target_type; extern unsigned long syslinux_ldlinux_len[2]; -extern char WindowsVersionStr[128], ubuffer[UBUFFER_SIZE], embedded_sl_version_str[2][12]; +extern char ubuffer[UBUFFER_SIZE], embedded_sl_version_str[2][12]; extern char szFolderPath[MAX_PATH], app_dir[MAX_PATH], temp_dir[MAX_PATH], system_dir[MAX_PATH], sysnative_dir[MAX_PATH]; extern char app_data_dir[MAX_PATH], *image_path, *fido_url; /* * Shared prototypes */ -extern void GetWindowsVersion(void); +extern void GetWindowsVersion(windows_version_t* WindowsVersion); extern BOOL is_x64(void); extern const char* GetAppArchName(void); extern const char* WindowsErrorString(void); diff --git a/src/rufus.rc b/src/rufus.rc index 1bc0be19..4578ffec 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 3.23.2020" +CAPTION "Rufus 3.23.2021" 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 3,23,2020,0 - PRODUCTVERSION 3,23,2020,0 + FILEVERSION 3,23,2021,0 + PRODUCTVERSION 3,23,2021,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", "3.23.2020" + VALUE "FileVersion", "3.23.2021" 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-3.23.exe" VALUE "ProductName", "Rufus" - VALUE "ProductVersion", "3.23.2020" + VALUE "ProductVersion", "3.23.2021" END END BLOCK "VarFileInfo" diff --git a/src/stdfn.c b/src/stdfn.c index 5688d412..6fff4602 100644 --- a/src/stdfn.c +++ b/src/stdfn.c @@ -1,7 +1,7 @@ /* * Rufus: The Reliable USB Formatting Utility * Standard Windows function calls - * Copyright © 2013-2022 Pete Batard + * Copyright © 2013-2023 Pete Batard * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -34,10 +34,7 @@ #include "settings.h" -int nWindowsVersion = WINDOWS_UNDEFINED; -int nWindowsBuildNumber = -1; -int nWindowsEdition = 0; -char WindowsVersionStr[128] = "Windows "; +windows_version_t WindowsVersion = { 0 }; /* * Hash table functions - modified From glibc 2.3.2: @@ -339,7 +336,7 @@ static const char* GetEdition(DWORD ProductType) /* * Modified from smartmontools' os_win32.cpp */ -void GetWindowsVersion(void) +void GetWindowsVersion(windows_version_t* WindowsVersion) { OSVERSIONINFOEXA vi, vi2; DWORD dwProductType = 0; @@ -347,12 +344,12 @@ void GetWindowsVersion(void) const char* w64 = "32 bit"; char *vptr; size_t vlen; - unsigned major, minor; + DWORD major = 0, minor = 0; ULONGLONG major_equal, minor_equal; BOOL ws; - nWindowsVersion = WINDOWS_UNDEFINED; - static_strcpy(WindowsVersionStr, "Windows Undefined"); + memset(WindowsVersion, 0, sizeof(windows_version_t)); + static_strcpy(WindowsVersion->VersionStr, "Windows Undefined"); memset(&vi, 0, sizeof(vi)); vi.dwOSVersionInfoSize = sizeof(vi); @@ -397,8 +394,8 @@ void GetWindowsVersion(void) if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { ws = (vi.wProductType <= VER_NT_WORKSTATION); - nWindowsVersion = vi.dwMajorVersion << 4 | vi.dwMinorVersion; - switch (nWindowsVersion) { + WindowsVersion->Version = vi.dwMajorVersion << 4 | vi.dwMinorVersion; + switch (WindowsVersion->Version) { case WINDOWS_XP: w = "XP"; break; case WINDOWS_2003: w = (ws ? "XP_64" : (!GetSystemMetrics(89) ? "Server 2003" : "Server 2003_R2")); @@ -419,26 +416,29 @@ void GetWindowsVersion(void) w = (ws ? "10" : ((vi.dwBuildNumber < 17763) ? "Server 2016" : "Server 2019")); break; } - nWindowsVersion = WINDOWS_11; + WindowsVersion->Version = WINDOWS_11; + major = 11; // Fall through case WINDOWS_11: w = (ws ? "11" : "Server 2022"); break; default: - if (nWindowsVersion < WINDOWS_XP) - nWindowsVersion = WINDOWS_UNSUPPORTED; + if (WindowsVersion->Version < WINDOWS_XP) + WindowsVersion->Version = WINDOWS_UNDEFINED; else w = "12 or later"; break; } } } + WindowsVersion->Major = major; + WindowsVersion->Minor = minor; if (is_x64()) w64 = "64-bit"; GetProductInfo(vi.dwMajorVersion, vi.dwMinorVersion, vi.wServicePackMajor, vi.wServicePackMinor, &dwProductType); - vptr = &WindowsVersionStr[sizeof("Windows ") - 1]; - vlen = sizeof(WindowsVersionStr) - sizeof("Windows ") - 1; + vptr = &WindowsVersion->VersionStr[sizeof("Windows ") - 1]; + vlen = sizeof(WindowsVersion->VersionStr) - sizeof("Windows ") - 1; if (!w) safe_sprintf(vptr, vlen, "%s %u.%u %s", (vi.dwPlatformId == VER_PLATFORM_WIN32_NT ? "NT" : "??"), (unsigned)vi.dwMajorVersion, (unsigned)vi.dwMinorVersion, w64); @@ -450,18 +450,18 @@ void GetWindowsVersion(void) safe_sprintf(vptr, vlen, "%s%s%s, %s", w, (dwProductType != 0) ? " " : "", GetEdition(dwProductType), w64); - nWindowsEdition = (int)dwProductType; + WindowsVersion->Edition = (int)dwProductType; // Add the build number (including UBR if available) for Windows 8.0 and later - nWindowsBuildNumber = vi.dwBuildNumber; - if (nWindowsVersion >= 0x62) { + WindowsVersion->BuildNumber = vi.dwBuildNumber; + if (WindowsVersion->Version >= WINDOWS_8) { int nUbr = ReadRegistryKey32(REGKEY_HKLM, "Software\\Microsoft\\Windows NT\\CurrentVersion\\UBR"); - vptr = &WindowsVersionStr[safe_strlen(WindowsVersionStr)]; - vlen = sizeof(WindowsVersionStr) - safe_strlen(WindowsVersionStr) - 1; + vptr = &WindowsVersion->VersionStr[safe_strlen(WindowsVersion->VersionStr)]; + vlen = sizeof(WindowsVersion->VersionStr) - safe_strlen(WindowsVersion->VersionStr) - 1; if (nUbr > 0) - safe_sprintf(vptr, vlen, " (Build %d.%d)", nWindowsBuildNumber, nUbr); + safe_sprintf(vptr, vlen, " (Build %d.%d)", WindowsVersion->BuildNumber, nUbr); else - safe_sprintf(vptr, vlen, " (Build %d)", nWindowsBuildNumber); + safe_sprintf(vptr, vlen, " (Build %d)", WindowsVersion->BuildNumber); } } diff --git a/src/stdlg.c b/src/stdlg.c index 234cd7eb..e2b2b38e 100644 --- a/src/stdlg.c +++ b/src/stdlg.c @@ -1640,7 +1640,7 @@ void SetFidoCheck(void) return; } - if (nWindowsVersion < WINDOWS_8) { + if (WindowsVersion.Version < WINDOWS_8) { ubprintf("Notice: The ISO download feature has been deactivated because " "your version of Windows is too old."); return; diff --git a/src/ui.c b/src/ui.c index be9fcd40..fee03d57 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1,7 +1,7 @@ /* * Rufus: The Reliable USB Formatting Utility * UI-related function calls - * Copyright © 2018-2022 Pete Batard + * Copyright © 2018-2023 Pete Batard * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -123,7 +123,7 @@ void GetBasicControlsWidth(HWND hDlg) sz.cy = rc.bottom; // TODO: figure out the specifics of each Windows version - if (nWindowsVersion == WINDOWS_10) { + if (WindowsVersion.Version == WINDOWS_10) { checkbox_internal_spacing = 10; dropdown_internal_spacing = 13; } @@ -779,7 +779,7 @@ void ToggleImageOptions(void) int i, shift = rh; has_wintogo = ((boot_type == BT_IMAGE) && (image_path != NULL) && (img_report.is_iso || img_report.is_windows_img) && - (nWindowsVersion >= WINDOWS_8) && (HAS_WINTOGO(img_report))); + (WindowsVersion.Version >= WINDOWS_8) && (HAS_WINTOGO(img_report))); has_persistence = ((boot_type == BT_IMAGE) && (image_path != NULL) && (img_report.is_iso) && (HAS_PERSISTENCE(img_report))); assert(popcnt8(image_options) <= 1); diff --git a/src/wue.c b/src/wue.c index 9614600a..d22d9d1f 100644 --- a/src/wue.c +++ b/src/wue.c @@ -430,7 +430,7 @@ BOOL PopulateWindowsVersion(void) memset(&img_report.win_version, 0, sizeof(img_report.win_version)); - if ((nWindowsVersion < WINDOWS_8) || ((WimExtractCheck(TRUE) & 4) == 0)) + if ((WindowsVersion.Version < WINDOWS_8) || ((WimExtractCheck(TRUE) & 4) == 0)) return FALSE; // If we're not using a straight install.wim, we need to mount the ISO to access it @@ -486,7 +486,7 @@ int SetWinToGoIndex(void) // Sanity checks wintogo_index = -1; wininst_index = 0; - if ((nWindowsVersion < WINDOWS_8) || ((WimExtractCheck(FALSE) & 4) == 0) || + if ((WindowsVersion.Version < WINDOWS_8) || ((WimExtractCheck(FALSE) & 4) == 0) || (ComboBox_GetCurItemData(hFileSystem) != FS_NTFS)) { return -1; } @@ -606,7 +606,7 @@ BOOL SetupWinToGo(DWORD DriveIndex, const char* drive_name, BOOL use_esp) uprintf("Windows To Go mode selected"); // Additional sanity checks - if ((use_esp) && (SelectedDrive.MediaType != FixedMedia) && (nWindowsBuildNumber < 15000)) { + if ((use_esp) && (SelectedDrive.MediaType != FixedMedia) && (WindowsVersion.BuildNumber < 15000)) { FormatStatus = ERROR_SEVERITY_ERROR | FAC(FACILITY_STORAGE) | ERROR_NOT_SUPPORTED; return FALSE; }