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