[ VC++ ] Windows OS 버전 체크
포스트
취소

[ VC++ ] Windows OS 버전 체크

HitCount


Contents


윈도우 버전 체크

윈도우의 버전을 얻어오는 방법은 여러가지가 있으나, GetVersion, GetVersionEx, VerifyVersionInfo 함수 등은 부정확한 버전 정보를 얻어 올 수 있어서 지양하는 것이 좋습니다.

  • Windows 8.1 이상에서는 GetVersion, GetVersionEx 함수는 더 이상 사용할 수 없습니다.
  • Windows 10 기준으로 VerifyVersionInfo 함수도 사용할 수 없습니다. VerifyVersionInfo 함수(Winows 2000 아래 버전는 사용 불가)는 등록 정보에서 호환성 모드를 설정한 경우에 GetVersion/GetVerionEx 함수가 페이크 값(호환성 모드에 의해 변경된 버전 정보)을 리턴하면서 원본 값을 구하기 위해서 생긴 함수였으나 윈도우 10이 출시되면서 이 함수마저 버전정보가 이상하게 나와서 사용할 수가 없습니다. 물론 아래에 설명하는 방법으로 할 경우 정상적인 정보를 얻을 수도 있습니다.

아래는 MS 사이트의 원문입니다.

  • If the application has no manifest, VerifyVersionInfo behaves as if the operation system version is Windows 8 (6.2).
  • If the application has a manifest that contains the GUID that corresponds to Windows 8.1, VerifyVersionInfo behaves as if the operation system version is Windows 8.1 (6.3).
  • If the application has a manifest that contains the GUID that corresponds to Windows 10, VerifyVersionInfo behaves as if the operation system version is Windows 10 (10.0).

The Version Helper functions use the VerifyVersionInfo function, so the behavior IsWindows8Point1OrGreater and IsWindows10OrGreater are similarly affected by the presence and content of the manifest.

요약하자면 GUID를 포함한 메니페스트가 있는 경우에만 정상적으로 버전정보를 보여주며 그렇지 않은 경우에는 문제가 발생됩니다.

레지스트리의 정보를 이용하여 윈도우의 버전을 체크하는 방법에 대한 정리입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
enum  OS_INFO_TYPE
{
	SZ_BUILD = 0,		// Current build number
	SZ_CUR_VER,		// Current version
	SZ_DSP_VER,		// Display version
	SZ_ROOT,		// System Root
	DW_MAJOR,		// Current major version number
	DW_MINOR,		// Current minor version number
	DW_UBR,			// UBR (Update Build Revision)
};

namespace osi
{
	const TCHAR kBuildNumber[]	= _T("CurrentBuildNumber");
	const TCHAR kMajorVersion[]	= _T("CurrentMajorVersionNumber");
	const TCHAR kMinorVersion[]	= _T("CurrentMinorVersionNumber");
	const TCHAR kVersion[]		= _T("CurrentVersion");
	const TCHAR kDisplayVersion[]	= _T("DisplayVersion");
	const TCHAR kBuildRevision[]	= _T("UBR");
	const TCHAR kSystemRoot[]	= _T("SystemRoot");
};

struct OS_INFOS
{
	OS_INFO_TYPE dwKey;
	const TCHAR *pszValue;
};

OS_INFOS OSINF[] =	{ {OS_INFO_TYPE::SZ_BUILD	, osi::kBuildNumber	}
			, {OS_INFO_TYPE::SZ_CUR_VER	, osi::kVersion		}
			, {OS_INFO_TYPE::SZ_DSP_VER	, osi::kDisplayVersion	}
			, {OS_INFO_TYPE::SZ_ROOT	, osi::kSystemRoot	}
			, {OS_INFO_TYPE::DW_MAJOR	, osi::kMajorVersion	}
			, {OS_INFO_TYPE::DW_MINOR	, osi::kMinorVersion	}
			, {OS_INFO_TYPE::DW_UBR		, osi::kBuildRevision	}
};

int GetWindowVersion(OS_INFO_TYPE oit)
{
	LONG lResult;
	HKEY hKey;
	DWORD dwType;
	DWORD dwBytes;
	DWORD dwRes = 0;

	// Open Regstry
	lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_QUERY_VALUE, &hKey);
	if (lResult != ERROR_SUCCESS)
	{
		goto END;
	}

	// Read Regstry Value
	lResult = RegQueryValueEx(hKey, OSINF[oit].pszValue, 0, &dwType, (LPBYTE)&dwRes, &dwBytes);
	if (lResult == ERROR_SUCCESS)
	{
		RegCloseKey(hKey);
		return dwRes;
	}

END:
	RegCloseKey(hKey);
	return -1;
}

bool GetWindowVersion(OS_INFO_TYPE oit, TCHAR *szData, int nSize = 128)
{
	LONG lResult;
	HKEY hKey;
	DWORD dwType;
	DWORD dwBytes = nSize;

	// Open Regstry
	lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_QUERY_VALUE, &hKey);
	if (lResult != ERROR_SUCCESS)
	{
		goto END;
	}

	TCHAR szMsg[256];
	memset(szMsg, 0x00, sizeof(szMsg));
	_stprintf(szMsg, _T("Key : %s\r\n"), OSINF[oit].pszValue);
	OutputDebugString(szMsg);

	// Read Regstry Value
	lResult = RegQueryValueEx(hKey, OSINF[oit].pszValue, 0, &dwType, (LPBYTE)szData, &dwBytes);
	if (lResult == ERROR_SUCCESS)
	{
		return true;
	}

END:
	RegCloseKey(hKey);
	return false;
}

..[중략]...

// 사용법
int _tmain(int argc, _TCHAR *argv[])
{
	TCHAR szCurVer[128];
	TCHAR szDspVer[128];
	TCHAR szBuildVer[128];
	TCHAR szRoot[256];
	int nMajor = 0;
	int nMinor = 0;
	int nUbrvs = 0;
	bool bRet = false;
	memset(szCurVer, 0x00, sizeof(szCurVer));
	memset(szDspVer, 0x00, sizeof(szDspVer));
	memset(szBuildVer, 0x00, sizeof(szBuildVer));
	memset(szRoot, 0x00, sizeof(szRoot));
	bRet = GetWindowVersion(OS_INFO_TYPE::SZ_CUR_VER, szCurVer, sizeof(szCurVer));
	bRet = GetWindowVersion(OS_INFO_TYPE::SZ_DSP_VER, szDspVer, sizeof(szDspVer));
	bRet = GetWindowVersion(OS_INFO_TYPE::SZ_BUILD, szBuildVer, sizeof(szBuildVer));
	bRet = GetWindowVersion(OS_INFO_TYPE::SZ_ROOT, szRoot, sizeof(szRoot));
	nMajor = GetWindowVersion(OS_INFO_TYPE::DW_MAJOR);
	nMinor = GetWindowVersion(OS_INFO_TYPE::DW_MINOR);
	nUbrvs = GetWindowVersion(OS_INFO_TYPE::DW_UBR);

	TCHAR szMsg[2048];
	memset(szMsg, 0x00, sizeof(szMsg));
	_stprintf(szMsg, _T("Version : Windows %ld.%ld(%ld)\r\nCurrentVersion : %s\r\n") \
		_T("DisplayVersion : %s\r\nBuildVersion : %s\r\nRoot : %s\r\n")
		, nMajor, nMinor, nUbrvs, szCurVer, szDspVer, szBuildVer, szRoot);
	AfxMessageBox(szMsg);
}
  • “콘솔의 버전 정보 이용” 참고 : https://neodreamer-dev.tistory.com/795

운영체제버전MajorMinor기타
Windows 1110.0100OSVERSIONINFOEX.dwBuildNumber >= 220000
Windows 1010.0100OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 201610.0100OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8.16.363OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 R26.363OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 86.262OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 20126.262OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 76.161OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R26.161OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 20086.060OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista6.060OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R25.252GetSystemMetrics(SM_SERVERR2) != 0
Windows Home Server5.252OSVERSIONINFOEX.wSuiteMask & VER_SUITE_WH_SERVER
Windows Server 20035.252GetSystemMetrics(SM_SERVERR2) == 0
Windows XP Professional
x64 Edition
5.252(OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION)
SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64
Windows XP5.151Not applicable
Windows 20005.050Not applicable
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.