Windows 10のバージョン番号をRtlGetVersionのビルド番号から取得する

icon 項目のみ表示/展開表示の切り替え

概要

Windows 10のバージョン番号をレジストリから取得するはコマンドラインで動作します。これをそのままGUIに移植するとレジストリ値の取得ができませんでした。
本プログラムではRtlGetVersion APIのビルド番号とバージョンは一対一で対応するので変換することによりバージョン番号を取得します。


RtlGetVersion APIについてはRtlGetVersion APIによりWindowsバージョンを取得(Windows 10に対応)を参照してください。

テスト環境

コンパイラ

Visual C++ 2008/2013 Express 32bit/64bit マルチバイト/UNICODE

実行環境

Windows 10 Home Version 1803 64bit

プログラムソースの概要

win10ver2関数

RtlGetVersion関数を動的に実行します。
ビルド番号を取得しswitch文により該当するバージョン番号を取得し返します。

ソースコード

// Windows 10のバージョン番号をRtlGetVersionのビルド番号から取得する。

#include <windows.h>
#include <tchar.h>

//	DLL内の関数へのポインタ型を定義
typedef void (WINAPI *RtlGetVersion_FUNC)(OSVERSIONINFOEXW*);

int win10ver2(void){
	int ver = 0;
	HMODULE hMod;
	OSVERSIONINFOEXW osw;
	hMod = LoadLibrary(TEXT("ntdll.dll"));
	RtlGetVersion_FUNC func;
	if (hMod){
		func = (RtlGetVersion_FUNC)GetProcAddress(hMod, "RtlGetVersion");
		if (func == 0){
			FreeLibrary(hMod);
			return FALSE;
		}
		ZeroMemory(&osw, sizeof(osw));
		osw.dwOSVersionInfoSize = sizeof(osw);
		func(&osw);
		FreeLibrary(hMod);
		if (osw.dwMajorVersion == 10){
			switch (osw.dwBuildNumber){
			case 10240: ver = 1507; break;
			case 10586: ver = 1511; break;
			case 14393: ver = 1607; break;
			case 15063: ver = 1703; break;
			case 16299: ver = 1709; break;
			case 17134: ver = 1803; break;
			case 17763: ver = 1809; break;
			default: ver = 1809; break;
			}
			return ver;
		}
	}
	return -1;
}

int WIN10VER;

int WINAPI _tWinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, TCHAR* lpsCmdLine, int nCmdShow){
	TCHAR buf[16];
	WIN10VER=win10ver2();
	if (0<WIN10VER){
		_stprintf_s(buf, sizeof(buf) / sizeof(buf[0]), _TEXT("Version %d"), WIN10VER);
		MessageBox(0,buf,_TEXT("Windows 10") ,MB_OK);
	}
	else{
		MessageBox(0,0,_TEXT("バージョンが正常に取得できませんでした。"),MB_OK);
	}
	return 0;
}

実行ファイルとソースファイルのダウンロード