mirror of
				https://github.com/pbatard/rufus.git
				synced 2024-08-14 23:57:05 +00:00 
			
		
		
		
	[misc] improve Windows version detection
* Also update README.txt * Closes #220
This commit is contained in:
		
							parent
							
								
									c6da7311b0
								
							
						
					
					
						commit
						86d5f02a20
					
				
					 6 changed files with 132 additions and 75 deletions
				
			
		|  | @ -2,12 +2,12 @@ Rufus: The Reliable USB Formatting Utility | ||||||
| 
 | 
 | ||||||
| Features: | Features: | ||||||
| - Formats USB flash drives to FAT/FAT32/NTFS/UDF/exFAT | - Formats USB flash drives to FAT/FAT32/NTFS/UDF/exFAT | ||||||
| - Creates DOS bootable USB drives, with no external files required | - Creates DOS bootable USB drives, using FreeDOS or MS-DOS with no external files required | ||||||
| - Creates MBR or GPT/UEFI bootable USB drives | - Creates MBR or GPT/UEFI bootable USB drives | ||||||
| - Creates bootable USB drives from bootable ISOs (Windows, Linux, etc.) | - Creates bootable USB drives from bootable ISOs (Windows, Linux, etc.) | ||||||
| - Twice as fast as Microsoft's USB/DVD tool or UNetbootin, on ISO->USB (1) | - Twice as fast as Microsoft's USB/DVD tool or UNetbootin, on ISO->USB (1) | ||||||
| - Can perform bad blocks check, with fake drive detection | - Can perform bad blocks check, with fake drive detection | ||||||
| - Modern UI | - Modern and familiar UI | ||||||
| - Small footprint, no installation required | - Small footprint, no installation required | ||||||
| - 100% Free Source Software (GPL v3) | - 100% Free Source Software (GPL v3) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -75,6 +75,10 @@ const char* additional_copyrights = | ||||||
| "http://svn.reactos.org/svn/reactos/trunk/reactos\\line\n" | "http://svn.reactos.org/svn/reactos/trunk/reactos\\line\n" | ||||||
| "GNU General Public License (GPL) v3 compatible\\line\n" | "GNU General Public License (GPL) v3 compatible\\line\n" | ||||||
| "\\line\n" | "\\line\n" | ||||||
|  | "Some generic function calls from smartmontools:\\line\n" | ||||||
|  | "https://sourceforge.net/projects/smartmontools\\line\n" | ||||||
|  | "GNU General Public License (GPL) v2 or later\\line\n" | ||||||
|  | "\\line\n" | ||||||
| "FS Type description from by GNU fdisk:\\line\n" | "FS Type description from by GNU fdisk:\\line\n" | ||||||
| "http://www.gnu.org/software/fdisk\\line\n" | "http://www.gnu.org/software/fdisk\\line\n" | ||||||
| "GNU General Public License (GPL) v3 or later\\line\n" | "GNU General Public License (GPL) v3 or later\\line\n" | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								src/rufus.c
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								src/rufus.c
									
										
									
									
									
								
							|  | @ -1272,8 +1272,6 @@ void InitDialog(HWND hDlg) | ||||||
| 	HDC hDC; | 	HDC hDC; | ||||||
| 	int i, i16, s16; | 	int i, i16, s16; | ||||||
| 	char tmp[128], *token; | 	char tmp[128], *token; | ||||||
| 	BOOL is_x64 = FALSE; |  | ||||||
| 	BOOL (__stdcall *pIsWow64Process)(HANDLE, PBOOL) = NULL; |  | ||||||
| 
 | 
 | ||||||
| #ifdef RUFUS_TEST | #ifdef RUFUS_TEST | ||||||
| 	ShowWindow(GetDlgItem(hDlg, IDC_TEST), SW_SHOW); | 	ShowWindow(GetDlgItem(hDlg, IDC_TEST), SW_SHOW); | ||||||
|  | @ -1318,20 +1316,7 @@ void InitDialog(HWND hDlg) | ||||||
| 	for (i=0; (i<4) && ((token = strtok(NULL, ".")) != NULL); i++) | 	for (i=0; (i<4) && ((token = strtok(NULL, ".")) != NULL); i++) | ||||||
| 		rufus_version[i] = (uint16_t)atoi(token); | 		rufus_version[i] = (uint16_t)atoi(token); | ||||||
| 	uprintf(APPLICATION_NAME " version %d.%d.%d.%d\n", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | 	uprintf(APPLICATION_NAME " version %d.%d.%d.%d\n", rufus_version[0], rufus_version[1], rufus_version[2], rufus_version[3]); | ||||||
| 
 | 	uprintf("Windows version: %s\n", WindowsVersionStr); | ||||||
| 	// Detect if we're running a 32 or 64 bit system
 |  | ||||||
| 	if (sizeof(uintptr_t) < 8) { |  | ||||||
| 		pIsWow64Process = (BOOL (__stdcall *)(HANDLE, PBOOL)) |  | ||||||
| 			GetProcAddress(GetModuleHandleA("KERNEL32"), "IsWow64Process"); |  | ||||||
| 		if (pIsWow64Process != NULL) { |  | ||||||
| 			(*pIsWow64Process)(GetCurrentProcess(), &is_x64); |  | ||||||
| 		} |  | ||||||
| 	} else { |  | ||||||
| 		is_x64 = TRUE; |  | ||||||
| 	} |  | ||||||
| 	uprintf("Windows version: %s %d-bit\n", PrintWindowsVersion(nWindowsVersion), is_x64?64:32); |  | ||||||
| 
 |  | ||||||
| 	// Detect the LCID
 |  | ||||||
| 	uprintf("LCID: 0x%04X\n", GetUserDefaultLCID()); | 	uprintf("LCID: 0x%04X\n", GetUserDefaultLCID()); | ||||||
| 
 | 
 | ||||||
| 	SetClusterSizeLabels(); | 	SetClusterSizeLabels(); | ||||||
|  | @ -2103,7 +2088,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	// Set the Windows version
 | 	// Set the Windows version
 | ||||||
| 	nWindowsVersion = DetectWindowsVersion(); | 	GetWindowsVersion(); | ||||||
| 
 | 
 | ||||||
| 	// We use local group policies rather than direct registry manipulation
 | 	// We use local group policies rather than direct registry manipulation
 | ||||||
| 	// 0x9e disables removable and fixed drive notifications
 | 	// 0x9e disables removable and fixed drive notifications
 | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								src/rufus.h
									
										
									
									
									
								
							
							
						
						
									
										20
									
								
								src/rufus.h
									
										
									
									
									
								
							|  | @ -251,13 +251,14 @@ typedef enum TASKBAR_PROGRESS_FLAGS | ||||||
| 
 | 
 | ||||||
| /* Windows versions */ | /* Windows versions */ | ||||||
| enum WindowsVersion { | enum WindowsVersion { | ||||||
| 	WINDOWS_UNDEFINED = 0, | 	WINDOWS_UNDEFINED = -1, | ||||||
| 	WINDOWS_UNSUPPORTED, | 	WINDOWS_UNSUPPORTED = 0, | ||||||
| 	WINDOWS_XP, | 	WINDOWS_XP = 0x51, | ||||||
| 	WINDOWS_2003,	// Also XP x64
 | 	WINDOWS_2003 = 0x52,	// Also XP x64
 | ||||||
| 	WINDOWS_VISTA, | 	WINDOWS_VISTA = 0x60, | ||||||
| 	WINDOWS_7, | 	WINDOWS_7 = 0x61, | ||||||
| 	WINDOWS_8_OR_LATER, | 	WINDOWS_8 = 0x62, | ||||||
|  | 	WINDOWS_8_1_OR_LATER = 0x63, | ||||||
| 	WINDOWS_MAX | 	WINDOWS_MAX | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | @ -278,14 +279,15 @@ extern BOOL use_own_c32[NB_OLD_C32], detect_fakes, iso_op_in_progress, format_op | ||||||
| extern RUFUS_ISO_REPORT iso_report; | extern RUFUS_ISO_REPORT iso_report; | ||||||
| extern int64_t iso_blocking_status; | extern int64_t iso_blocking_status; | ||||||
| extern uint16_t rufus_version[4]; | extern uint16_t rufus_version[4]; | ||||||
| extern enum WindowsVersion nWindowsVersion; | extern int nWindowsVersion; | ||||||
|  | extern char WindowsVersionStr[128]; | ||||||
| extern RUFUS_UPDATE update; | extern RUFUS_UPDATE update; | ||||||
| extern int dialog_showing; | extern int dialog_showing; | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Shared prototypes |  * Shared prototypes | ||||||
|  */ |  */ | ||||||
| extern enum WindowsVersion DetectWindowsVersion(void); | extern void GetWindowsVersion(void); | ||||||
| extern const char* PrintWindowsVersion(enum WindowsVersion version); | extern const char* PrintWindowsVersion(enum WindowsVersion version); | ||||||
| extern const char *WindowsErrorString(void); | extern const char *WindowsErrorString(void); | ||||||
| extern void DumpBufferHex(void *buf, size_t size); | extern void DumpBufferHex(void *buf, size_t size); | ||||||
|  |  | ||||||
							
								
								
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							
							
						
						
									
										10
									
								
								src/rufus.rc
									
										
									
									
									
								
							|  | @ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL | ||||||
| IDD_DIALOG DIALOGEX 12, 12, 206, 329 | IDD_DIALOG DIALOGEX 12, 12, 206, 329 | ||||||
| STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | ||||||
| EXSTYLE WS_EX_APPWINDOW | EXSTYLE WS_EX_APPWINDOW | ||||||
| CAPTION "Rufus v1.4.0.307" | CAPTION "Rufus v1.4.0.308" | ||||||
| FONT 8, "MS Shell Dlg", 400, 0, 0x1 | FONT 8, "MS Shell Dlg", 400, 0, 0x1 | ||||||
| BEGIN | BEGIN | ||||||
|     DEFPUSHBUTTON   "Start",IDC_START,94,291,50,14 |     DEFPUSHBUTTON   "Start",IDC_START,94,291,50,14 | ||||||
|  | @ -289,8 +289,8 @@ END | ||||||
| // | // | ||||||
| 
 | 
 | ||||||
| VS_VERSION_INFO VERSIONINFO | VS_VERSION_INFO VERSIONINFO | ||||||
|  FILEVERSION 1,4,0,307 |  FILEVERSION 1,4,0,308 | ||||||
|  PRODUCTVERSION 1,4,0,307 |  PRODUCTVERSION 1,4,0,308 | ||||||
|  FILEFLAGSMASK 0x3fL |  FILEFLAGSMASK 0x3fL | ||||||
| #ifdef _DEBUG | #ifdef _DEBUG | ||||||
|  FILEFLAGS 0x1L |  FILEFLAGS 0x1L | ||||||
|  | @ -307,13 +307,13 @@ BEGIN | ||||||
|         BEGIN |         BEGIN | ||||||
|             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" |             VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)" | ||||||
|             VALUE "FileDescription", "Rufus" |             VALUE "FileDescription", "Rufus" | ||||||
|             VALUE "FileVersion", "1.4.0.307" |             VALUE "FileVersion", "1.4.0.308" | ||||||
|             VALUE "InternalName", "Rufus" |             VALUE "InternalName", "Rufus" | ||||||
|             VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)" |             VALUE "LegalCopyright", "© 2011-2013 Pete Batard (GPL v3)" | ||||||
|             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" |             VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html" | ||||||
|             VALUE "OriginalFilename", "rufus.exe" |             VALUE "OriginalFilename", "rufus.exe" | ||||||
|             VALUE "ProductName", "Rufus" |             VALUE "ProductName", "Rufus" | ||||||
|             VALUE "ProductVersion", "1.4.0.307" |             VALUE "ProductVersion", "1.4.0.308" | ||||||
|         END |         END | ||||||
|     END |     END | ||||||
|     BLOCK "VarFileInfo" |     BLOCK "VarFileInfo" | ||||||
|  |  | ||||||
							
								
								
									
										150
									
								
								src/stdfn.c
									
										
									
									
									
								
							
							
						
						
									
										150
									
								
								src/stdfn.c
									
										
									
									
									
								
							|  | @ -29,53 +29,119 @@ | ||||||
| #include "resource.h" | #include "resource.h" | ||||||
| #include "localization.h" | #include "localization.h" | ||||||
| 
 | 
 | ||||||
| // Must be in the same order as enum WindowsVersion
 | int  nWindowsVersion = WINDOWS_UNDEFINED; | ||||||
| static const char* WindowsVersionName[WINDOWS_MAX] = { | char WindowsVersionStr[128] = "Windows "; | ||||||
| 	"Undefined", |  | ||||||
| 	"Windows 2000 or earlier (unsupported)", |  | ||||||
| 	"Windows XP", |  | ||||||
| 	"Windows 2003 (or XP x64)", |  | ||||||
| 	"Windows Vista", |  | ||||||
| 	"Windows 7", |  | ||||||
| 	"Windows 8 or later", |  | ||||||
| }; |  | ||||||
| 
 | 
 | ||||||
| enum WindowsVersion nWindowsVersion = WINDOWS_UNDEFINED; | static BOOL is_x64(void) | ||||||
| 
 |  | ||||||
| /*
 |  | ||||||
|  * Detect Windows version |  | ||||||
|  */ |  | ||||||
| enum WindowsVersion DetectWindowsVersion(void) |  | ||||||
| { | { | ||||||
| 	OSVERSIONINFO OSVersion; | 	BOOL ret = FALSE; | ||||||
| 
 | 	BOOL (__stdcall *pIsWow64Process)(HANDLE, PBOOL) = NULL; | ||||||
| 	memset(&OSVersion, 0, sizeof(OSVERSIONINFO)); | 	// Detect if we're running a 32 or 64 bit system
 | ||||||
| 	OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); | 	if (sizeof(uintptr_t) < 8) { | ||||||
| 	if (GetVersionEx(&OSVersion) == 0) | 		pIsWow64Process = (BOOL (__stdcall *)(HANDLE, PBOOL)) | ||||||
| 		return WINDOWS_UNDEFINED; | 			GetProcAddress(GetModuleHandleA("KERNEL32"), "IsWow64Process"); | ||||||
| 	if (OSVersion.dwPlatformId != VER_PLATFORM_WIN32_NT) | 		if (pIsWow64Process != NULL) { | ||||||
| 		return WINDOWS_UNSUPPORTED; | 			(*pIsWow64Process)(GetCurrentProcess(), &ret); | ||||||
| 	// See the Remarks section from http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833.aspx
 | 		} | ||||||
| 	if ((OSVersion.dwMajorVersion < 5) || ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 0))) | 	} else { | ||||||
| 		return WINDOWS_UNSUPPORTED;		// Win2k or earlier
 | 		ret = TRUE; | ||||||
| 	if ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 1)) | 	} | ||||||
| 		return WINDOWS_XP; | 	return ret; | ||||||
| 	if ((OSVersion.dwMajorVersion == 5) && (OSVersion.dwMinorVersion == 2)) |  | ||||||
| 		return WINDOWS_2003; |  | ||||||
| 	if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 0)) |  | ||||||
| 		return WINDOWS_VISTA; |  | ||||||
| 	if ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion == 1)) |  | ||||||
| 		return WINDOWS_7; |  | ||||||
| 	if ((OSVersion.dwMajorVersion > 6) || ((OSVersion.dwMajorVersion == 6) && (OSVersion.dwMinorVersion >= 2))) |  | ||||||
| 		return WINDOWS_8_OR_LATER; |  | ||||||
| 	return WINDOWS_UNSUPPORTED; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| const char* PrintWindowsVersion(enum WindowsVersion version) | // From smartmontools os_win32.cpp
 | ||||||
|  | void GetWindowsVersion(void) | ||||||
| { | { | ||||||
| 	if ((version < 0) || (version >= WINDOWS_MAX)) | 	OSVERSIONINFOEXA vi, vi2; | ||||||
| 		version = WINDOWS_UNDEFINED; | 	const char* w = 0; | ||||||
| 	return WindowsVersionName[version]; | 	const char* w64 = "32 bit"; | ||||||
|  | 	char* vptr; | ||||||
|  | 	size_t vlen; | ||||||
|  | 	unsigned major, minor; | ||||||
|  | 	ULONGLONG major_equal, minor_equal; | ||||||
|  | 	BOOL ws; | ||||||
|  | 
 | ||||||
|  | 	nWindowsVersion = WINDOWS_UNDEFINED; | ||||||
|  | 	safe_strcpy(WindowsVersionStr, sizeof(WindowsVersionStr), "Windows Undefined"); | ||||||
|  | 
 | ||||||
|  | 	memset(&vi, 0, sizeof(vi)); | ||||||
|  | 	vi.dwOSVersionInfoSize = sizeof(vi); | ||||||
|  | 	if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { | ||||||
|  | 		memset(&vi, 0, sizeof(vi)); | ||||||
|  | 		vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); | ||||||
|  | 		if (!GetVersionExA((OSVERSIONINFOA *)&vi)) | ||||||
|  | 			return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { | ||||||
|  | 
 | ||||||
|  | 		if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) { | ||||||
|  | 			// Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version
 | ||||||
|  | 			// See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx
 | ||||||
|  | 
 | ||||||
|  | 			major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); | ||||||
|  | 			for (major = vi.dwMajorVersion; major <= 9; major++) { | ||||||
|  | 				memset(&vi2, 0, sizeof(vi2)); | ||||||
|  | 				vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMajorVersion = major; | ||||||
|  | 				if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) | ||||||
|  | 					continue; | ||||||
|  | 				if (vi.dwMajorVersion < major) { | ||||||
|  | 					vi.dwMajorVersion = major; vi.dwMinorVersion = 0; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); | ||||||
|  | 				for (minor = vi.dwMinorVersion; minor <= 9; minor++) { | ||||||
|  | 					memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2); | ||||||
|  | 					vi2.dwMinorVersion = minor; | ||||||
|  | 					if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) | ||||||
|  | 						continue; | ||||||
|  | 					vi.dwMinorVersion = minor; | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { | ||||||
|  | 			ws = (vi.wProductType <= VER_NT_WORKSTATION); | ||||||
|  | 			nWindowsVersion = vi.dwMajorVersion << 4 | vi.dwMinorVersion; | ||||||
|  | 			switch (nWindowsVersion) { | ||||||
|  | 			case 0x50: w = "2000"; | ||||||
|  | 				break; | ||||||
|  | 			case 0x51: w = "XP"; | ||||||
|  | 				break; | ||||||
|  | 			case 0x52: w = (!GetSystemMetrics(89)?"2003":"2003_R2"); | ||||||
|  | 				break; | ||||||
|  | 			case 0x60: w = (ws?"Vista":"2008"); | ||||||
|  | 				break; | ||||||
|  | 			case 0x61: w = (ws?"7":"2008_R2"); | ||||||
|  | 				break; | ||||||
|  | 			case 0x62: w = (ws?"8":"2012"); | ||||||
|  | 				break; | ||||||
|  | 			case 0x63: w = (ws?"8.1":"2012_R2"); | ||||||
|  | 				break; | ||||||
|  | 			default: | ||||||
|  | 				nWindowsVersion = WINDOWS_UNSUPPORTED; | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (is_x64()) | ||||||
|  | 		w64 = "64-bit"; | ||||||
|  | 
 | ||||||
|  | 	vptr = &WindowsVersionStr[sizeof("Windows ") - 1]; | ||||||
|  | 	vlen = sizeof(WindowsVersionStr) - 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); | ||||||
|  | 	else if (vi.wServicePackMinor) | ||||||
|  | 		safe_sprintf(vptr, vlen, "%s SP%u.%u %s", w, vi.wServicePackMajor, vi.wServicePackMinor, w64); | ||||||
|  | 	else if (vi.wServicePackMajor) | ||||||
|  | 		safe_sprintf(vptr, vlen, "%s SP%u %s", w, vi.wServicePackMajor, w64); | ||||||
|  | 	else | ||||||
|  | 		safe_sprintf(vptr, vlen, "%s %s", w, w64); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue