HSPのsysinfo(0)は内部でGetVersionというAPIを使っているようですが、
このAPIは互換性の都合上、Windows8以降は同じ値しか返さないようです。
Windows2000以降のみですが、RtlGetVersionだと正確な値を返すようなので、
それでやってみました。
/*
Windows2000以降のみ対応
・getver p1
p1には9要素以上ある整数の配列変数を指定する。
p1の(0)〜(8)に、それぞれ以下の情報が入る。
0:メジャーバージョン(dwMajorVersion)
1:マイナーバージョン(dwMinorVersion)
2:ビルドナンバー(dwBuildNumber)
3:プラットフォームID(dwPlatformId)
4:サービスパックのメジャーバージョン(wServicePackMajor)
5:サービスパックのマイナーバージョン(wServicePackMinor)
6:製品スイートを表すビットマスク(wSuiteMask)
7:システムに関する追加情報(wProductType)
8:将来のための予約情報。現時点では常に0(wReserved)
またrefstrにサービスパック名が入る。(サービスパックがインストールされていない場合は空文字になる)
・winver_text p1
p1にはgetverで取得した配列を指定する。
配列の内容に基づいて、Windowsのバージョンを表す文字列を返す。
(ネットで得た情報を参考にした仮実装です。
当方はWindows10環境しかなく、他バージョンについては互換モードで選べるものしか試していません。
特にサーバー系の動作確認は全くできておりません)
*/
#module
#uselib "Ntdll.dll"
#func RtlGetVersion "RtlGetVersion" int
#deffunc getver array r
dim osver,71
osver(0)=284
RtlGetVersion varptr(osver)
memcpy r,osver,16,0,4
r(4)=osver(69)&0xFFFF
r(5)=(osver(69)>>16)&0xFFFF
r(6)=osver(70)&0xFFFF
r(7)=(osver(70)>>16)&0xFF
r(8)=(osver(70)>>24)&0xFF
sdim utf16,256
memcpy utf16,osver,256,0,20
s=cnvwtos(utf16)
dim osver : dim utf16
return s
#defcfunc winver_text array a
s="Unknown"
x=a(0)*10+a(1)
if a(7)>=2 {
//サーバー系と思われる
s="Windows Server "
if x=100 : s+="2016 or later"
if x=63 : s+="2012 R2"
if x=62 : s+="2012"
if x=61 : s+="2008 R2"
if x=60 : s+="2008"
if x=52 : s+="2003"
} else {
if x=100 : s="Windows 10"
if x=63 : s="Windows 8.1"
if x=62 : s="Windows 8"
if x=61 : s="Windows 7"
if x=60 : s="Windows Vista"
if x=52 : s="Windows XP 64-Bit"
if x=51 : s="Windows XP"
if x=50 : s="Windows 2000"
}
return s
#global
//以下、使用例
dim ver,9
getver ver
s=refstr
repeat 9
if cnt=6 {
mes strf("0x%04X",ver(cnt))
} else {
mes ver(cnt)
}
loop
mes
mes winver_text(ver)
mes s
バージョンとOS名の対応については、以下のページが参考になると思います。
https://docs.microsoft.com/ja-jp/windows/win32/sysinfo/operating-system-version?redirectedfrom=MSDN
http://chokuto.ifdef.jp/advanced/struct/OSVERSIONINFOEX.html
http://yamatyuu.net/computer/program/sdk/base/RtlGetVersion/index.html