Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I detect whether my software is running on windows XP?

I have some code running to detect windows XP which I think should work but what should I replace the '??'s with to detect whether I'm running on Windows XP?

bool IsWindowsXP()
{
    bool isWindowsXp = false;

    OSVERSIONINFOEX osvi;
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if( GetVersionEx((OSVERSIONINFO*)&osvi) )
    {
        const DWORD MinXpVersion = ??;
        const DWORD MaxXpVersion = ??;
        if ((osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) && 
            (vi.dwMajorVersion >= MinXpVersion) &&
            (vi.dwMajorVersion <= MinXpVersion))
        {
            isWindowsXp = false;
        }
    }

    return isWindowsXp;
}
like image 409
Jon Cage Avatar asked Aug 15 '13 13:08

Jon Cage


2 Answers

On the documentation page for the OSVERSIONINFOEX structure, the two relevant fields say this:

For more information, see Remarks.

Down in the remarks section is a handy table:

Operating system    Version number dwMajorVersion dwMinorVersion Other
Windows 8                 6.2            6              2        OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012       6.2            6              2        OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 7                 6.1            6              1        OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R2    6.1            6              1        OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 2008       6              6              0        OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista             6              6              0        OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R2    5.2            5              2        GetSystemMetrics(SM_SERVERR2) != 0
Windows Home Server       5.2            5              2        OSVERSIONINFOEX.wSuiteMask & VER_SUITE_WH_SERVER
Windows Server 2003       5.2            5              2        GetSystemMetrics(SM_SERVERR2) == 0
Windows XP Prof x64 Ed    5.2            5              2        (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
Windows XP                5.1            5              1        Not applicable
Windows 2000              5              5              0        Not applicable

As seen in the table, XP is 5.1.

like image 166
chris Avatar answered Sep 27 '22 21:09

chris


No need extra library, header, working also on VC++ Express :

BOOL chkxp(){
    DWORD version = GetVersion();
    DWORD major = (DWORD)(LOBYTE(LOWORD(version)));
    DWORD minor = (DWORD)(HIBYTE(LOWORD(version)));
    return ((major == 5) && (minor == 1)); // 5.1 is WIN Xp  5.2 is XP x64
}
like image 32
user956584 Avatar answered Sep 27 '22 22:09

user956584