Print out "Service Pack" version of underlying Windows

Change-Id: I1f7dbf8f1244e8b7bf2f459fdce381838d776dbe
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
bb10
André Klitzing 2015-12-07 16:09:15 +01:00
parent 194e158beb
commit a862474839
1 changed files with 27 additions and 7 deletions

View File

@ -1928,9 +1928,9 @@ static inline HMODULE moduleHandleForFunction(LPCVOID address)
}
#endif
static inline OSVERSIONINFO winOsVersion()
static inline OSVERSIONINFOEX determineWinOsVersion()
{
OSVERSIONINFO result = { sizeof(OSVERSIONINFO), 0, 0, 0, 0, {'\0'}};
OSVERSIONINFOEX result = { sizeof(OSVERSIONINFOEX), 0, 0, 0, 0, {'\0'}, 0, 0, 0, 0, 0};
#ifndef Q_OS_WINCE
#define GetProcAddressA GetProcAddress
@ -1973,7 +1973,13 @@ static inline OSVERSIONINFO winOsVersion()
// GetVersionEx() has been deprecated in Windows 8.1 and will return
// only Windows 8 from that version on, so use the kernel API function.
pRtlGetVersion(&result); // always returns STATUS_SUCCESS
pRtlGetVersion((LPOSVERSIONINFO) &result); // always returns STATUS_SUCCESS
return result;
}
static OSVERSIONINFOEX winOsVersion()
{
static OSVERSIONINFOEX result = determineWinOsVersion();
return result;
}
@ -1996,7 +2002,7 @@ QSysInfo::WinVersion QSysInfo::windowsVersion()
if (winver)
return winver;
winver = QSysInfo::WV_NT;
const OSVERSIONINFO osver = winOsVersion();
const OSVERSIONINFOEX osver = winOsVersion();
if (osver.dwMajorVersion == 0)
return QSysInfo::WV_None;
#ifdef Q_OS_WINCE
@ -2082,6 +2088,20 @@ QSysInfo::WinVersion QSysInfo::windowsVersion()
return winver;
}
static QString winSp_helper()
{
const qint16 major = winOsVersion().wServicePackMajor;
if (major) {
QString sp = QStringLiteral(" SP ") + QString::number(major);
const qint16 minor = winOsVersion().wServicePackMinor;
if (minor)
sp += QLatin1Char('.') + QString::number(minor);
return sp;
}
return QString();
}
static const char *winVer_helper()
{
switch (int(QSysInfo::WindowsVersion)) {
@ -2549,7 +2569,7 @@ QString QSysInfo::kernelType()
QString QSysInfo::kernelVersion()
{
#ifdef Q_OS_WIN
const OSVERSIONINFO osver = winOsVersion();
const OSVERSIONINFOEX osver = winOsVersion();
return QString::number(int(osver.dwMajorVersion)) + QLatin1Char('.') + QString::number(int(osver.dwMinorVersion))
+ QLatin1Char('.') + QString::number(int(osver.dwBuildNumber));
#else
@ -2660,7 +2680,7 @@ QString QSysInfo::productVersion()
#elif defined(Q_OS_WIN)
const char *version = winVer_helper();
if (version)
return QString::fromLatin1(version).toLower();
return QString::fromLatin1(version).toLower() + winSp_helper().remove(QLatin1Char(' ')).toLower();
// fall through
// Android should not fall through to the Unix code
@ -2740,7 +2760,7 @@ QString QSysInfo::prettyProductName()
#elif defined(Q_OS_WINPHONE)
return QLatin1String("Windows Phone ") + QLatin1String(winVer_helper());
#elif defined(Q_OS_WIN)
return QLatin1String("Windows ") + QLatin1String(winVer_helper());
return QLatin1String("Windows ") + QLatin1String(winVer_helper()) + winSp_helper();
#elif defined(Q_OS_ANDROID)
return QLatin1String("Android ") + productVersion();
#elif defined(Q_OS_HAIKU)