enum WinVersion { WINVERSION_PRE_2000 = 0, // Not supported WINVERSION_2000 = 1, WINVERSION_XP = 2, WINVERSION_SERVER_2003 = 3, WINVERSION_VISTA = 4, WINVERSION_2008 = 5, WINVERSION_WIN7 = 6, }; WinVersion GetWinVersion() { static bool checked_version = false; static WinVersion win_version = WINVERSION_PRE_2000; if (!checked_version) { OSVERSIONINFOEX version_info; version_info.dwOSVersionInfoSize = sizeof version_info; GetVersionEx(reinterpret_cast<OSVERSIONINFO*>(&version_info)); if (version_info.dwMajorVersion == 5) { switch (version_info.dwMinorVersion) { case 0: win_version = WINVERSION_2000; break; case 1: win_version = WINVERSION_XP; break; case 2: default: win_version = WINVERSION_SERVER_2003; break; } } else if (version_info.dwMajorVersion == 6) { if (version_info.wProductType != VER_NT_WORKSTATION) { // 2008 is 6.0, and 2008 R2 is 6.1. win_version = WINVERSION_2008; } else { if (version_info.dwMinorVersion == 0) { win_version = WINVERSION_VISTA; } else { win_version = WINVERSION_WIN7; } } } else if (version_info.dwMajorVersion > 6) { win_version = WINVERSION_WIN7; } checked_version = true; } return win_version; }