mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[misc] improve Windows version detection
* Also use actual Windows major.minor when checking for updates
This commit is contained in:
parent
6280e8020a
commit
e5f90282ed
10 changed files with 83 additions and 77 deletions
|
@ -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";
|
||||
|
|
|
@ -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);
|
||||
|
|
21
src/net.c
21
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<max_channel) && (!found_new_version); k++) {
|
||||
for (k = 0; (k < max_channel) && (!found_new_version); k++) {
|
||||
// Free any previous buffers we might have used
|
||||
safe_free(buf);
|
||||
safe_free(sig);
|
||||
|
@ -734,7 +729,7 @@ static DWORD WINAPI CheckForUpdatesThread(LPVOID param)
|
|||
// 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.
|
||||
static_sprintf(urlpath, "%s%s%s_win_%s_%lu.%lu.ver", APPLICATION_NAME, (k == 0) ? "": "_",
|
||||
(k == 0) ? "" : channel[k], GetAppArchName(), os_version.dwMajorVersion, os_version.dwMinorVersion);
|
||||
(k == 0) ? "" : channel[k], GetAppArchName(), 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] == '_')) {
|
||||
|
@ -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 ? '!' : '.');
|
||||
}
|
||||
|
||||
|
|
37
src/rufus.c
37
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;
|
||||
}
|
||||
|
|
22
src/rufus.h
22
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);
|
||||
|
|
10
src/rufus.rc
10
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"
|
||||
|
|
46
src/stdfn.c
46
src/stdfn.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Rufus: The Reliable USB Formatting Utility
|
||||
* Standard Windows function calls
|
||||
* Copyright © 2013-2022 Pete Batard <pete@akeo.ie>
|
||||
* Copyright © 2013-2023 Pete Batard <pete@akeo.ie>
|
||||
*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
6
src/ui.c
6
src/ui.c
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Rufus: The Reliable USB Formatting Utility
|
||||
* UI-related function calls
|
||||
* Copyright © 2018-2022 Pete Batard <pete@akeo.ie>
|
||||
* Copyright © 2018-2023 Pete Batard <pete@akeo.ie>
|
||||
*
|
||||
* 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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue