Result<ExitCode> SelfTest::Run(const Settings& settings) const { auto statisticResult = GetStatistic(settings); if (statisticResult.HasError()) { return statisticResult.GetError(); } auto statistic = statisticResult.GetResultValue(); if (statistic.IsService()) { if (!statistic.HasAdministrativePrivileges()) { return EXIT_CODE_NO_ADMIN; } if (!statistic.HasSeAssignPrimaryTokenPrivilege()) { return EXIT_CODE_NO_ASSIGN_PRIMARY_TOKEN_PRIV; } if (!statistic.HasSeTcbPrivilegePrivilege()) { return EXIT_CODE_NO_TCB_PRIV; } } return Is64OS() ? EXIT_CODE_READY_FOR_64 : EXIT_CODE_READY_FOR_32; }
/////////////////////////////////////////////////////////////////////////////// // GetWinVer BOOL GetWinVer(LPTSTR pszVersion, int nCountVer,LPTSTR pszMajorMinorBuild, int nCountMajor, int *nVersion) { if (!pszVersion || !nVersion || !pszMajorMinorBuild) return FALSE; lstrcpyn(pszVersion, WUNKNOWNSTR, nCountVer); *nVersion = WUNKNOWN; OSVERSIONINFO osinfo ={0}; osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx(&osinfo)) return FALSE; OSVERSIONINFOEX osviex; ZeroMemory(&osviex, sizeof(OSVERSIONINFOEX)); osviex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !GetVersionEx ((OSVERSIONINFO *) &osviex)) return FALSE; DWORD dwPlatformId = osinfo.dwPlatformId; DWORD dwMinorVersion = osinfo.dwMinorVersion; DWORD dwMajorVersion = osinfo.dwMajorVersion; DWORD dwBuildNumber = osinfo.dwBuildNumber & 0xFFFF; // Win 95 needs this TCHAR szOSBit[MAX_PATH] = {0}; _snwprintf(pszMajorMinorBuild,nCountMajor, _T("%u.%u.%u %s"), dwMajorVersion, dwMinorVersion, dwBuildNumber ,Is64OS(szOSBit, _countof(szOSBit)-1)); if ((dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) && (dwMajorVersion == 4)) { if ((dwMinorVersion < 10) && (dwBuildNumber == 950)) { lstrcpyn(pszVersion, W95STR,nCountVer); *nVersion = W95; } else if ((dwMinorVersion < 10) && ((dwBuildNumber > 950) && (dwBuildNumber <= 1080))) { lstrcpyn(pszVersion, W95SP1STR, nCountVer); *nVersion = W95SP1; } else if ((dwMinorVersion < 10) && (dwBuildNumber > 1080)) { lstrcpyn(pszVersion, W95OSR2STR, nCountVer); *nVersion = W95OSR2; } else if ((dwMinorVersion == 10) && (dwBuildNumber == 1998)) { lstrcpyn(pszVersion, W98STR, nCountVer); *nVersion = W98; } else if ((dwMinorVersion == 10) && ((dwBuildNumber > 1998) && (dwBuildNumber < 2183))) { lstrcpyn(pszVersion, W98SP1STR, nCountVer); *nVersion = W98SP1; } else if ((dwMinorVersion == 10) && (dwBuildNumber >= 2183)) { lstrcpyn(pszVersion, W98SESTR, nCountVer); *nVersion = W98SE; } else if (dwMinorVersion == 90) { lstrcpyn(pszVersion, WMESTR, nCountVer); *nVersion = WME; } } else if (dwPlatformId == VER_PLATFORM_WIN32_NT) { if ((dwMajorVersion == 3) && (dwMinorVersion == 51)) { lstrcpyn(pszVersion, WNT351STR, nCountVer); *nVersion = WNT351; } else if ((dwMajorVersion == 4) && (dwMinorVersion == 0)) { lstrcpyn(pszVersion, WNT4STR, nCountVer); *nVersion = WNT4; } else if ((dwMajorVersion == 5) && (dwMinorVersion == 0)) { lstrcpyn(pszVersion, W2KSTR, nCountVer); *nVersion = W2K; } else if ((dwMajorVersion == 5) && (dwMinorVersion == 1)) { lstrcpyn(pszVersion, WXPSTR, nCountVer); *nVersion = WXP; } else if ((dwMajorVersion == 5) && (dwMinorVersion == 2) && GetSystemMetrics(SM_SERVERR2) != 0) { lstrcpyn(pszVersion, W2003SERVERSTR, nCountVer); *nVersion = W2003SERVER; } else if ((dwMajorVersion == 5) && (dwMinorVersion == 2) && GetSystemMetrics(SM_SERVERR2) == 0) { lstrcpyn(pszVersion, W2003SERVERST, nCountVer); *nVersion = W2003SERVE; } else if( (dwMajorVersion == 6) && (dwMinorVersion == 0) && (osviex.wProductType == VER_NT_WORKSTATION ) ) { lstrcpyn(pszVersion, WINVISTA, nCountVer); *nVersion = WVISTA; } else if( (dwMajorVersion == 6) && (dwMinorVersion == 0) && (osviex.wProductType != VER_NT_WORKSTATION ) ) { lstrcpyn(pszVersion, W2008SERVERST, nCountVer); *nVersion = W2008SERVE; } else if( (dwMajorVersion == 6) && (dwMinorVersion == 1) && (osviex.wProductType == VER_NT_WORKSTATION ) ) { lstrcpyn(pszVersion, WIN7, nCountVer); *nVersion = W7; } else if( (dwMajorVersion == 6) && (dwMinorVersion == 1) && (osviex.wProductType != VER_NT_WORKSTATION ) ) { lstrcpyn(pszVersion, W2008SERVERSTR, nCountVer); *nVersion = W2008SERVER; } else if( (dwMajorVersion == 6) && (dwMinorVersion == 2) && (osviex.wProductType == VER_NT_WORKSTATION ) ) { lstrcpyn(pszVersion, WIN8, nCountVer); *nVersion = W8; } else if ((dwMajorVersion == 6) && (dwMinorVersion == 3) && (osviex.wProductType == VER_NT_WORKSTATION)) { lstrcpyn(pszVersion, WIN8_1, nCountVer); *nVersion = W8_1; } else if ((dwMajorVersion == 6) && (dwMinorVersion == 4) && (osviex.wProductType == VER_NT_WORKSTATION)) { lstrcpyn(pszVersion, WIN10, nCountVer); *nVersion = W10; } else if ((dwMajorVersion == 10) && (dwMinorVersion == 0) && (osviex.wProductType == VER_NT_WORKSTATION)) { lstrcpyn(pszVersion, WIN10, nCountVer); *nVersion = W10; } } else if (dwPlatformId == VER_PLATFORM_WIN32_CE) { lstrcpyn(pszVersion, WCESTR, nCountVer); *nVersion = WCE; } return TRUE; }