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…
	
	Add table
		Add a link
		
	
		Reference in a new issue