Win32 API 日本語リファレンス
ホームSystem.SystemInformation › OSVERSIONINFOEXW

OSVERSIONINFOEXW

構造体
サイズx64: 284 バイト / x86: 284 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
dwOSVersionInfoSizeDWORD4+0+0このデータ構造のサイズ (バイト単位)。このメンバーには sizeof(OSVERSIONINFOEX) を設定します。
dwMajorVersionDWORD4+4+4オペレーティング システムのメジャー バージョン番号。詳細については「解説」を参照してください。
dwMinorVersionDWORD4+8+8オペレーティング システムのマイナー バージョン番号。詳細については「解説」を参照してください。
dwBuildNumberDWORD4+12+12オペレーティング システムのビルド番号。
dwPlatformIdDWORD4+16+16オペレーティング システムのプラットフォーム。このメンバーには VER_PLATFORM_WIN32_NT (2) を指定できます。
szCSDVersionWCHAR256+20+20システムにインストールされている最新の Service Pack を示す、「Service Pack 3」のような null 終端文字列。 Service Pack がインストールされていない場合、この文字列は空です。
wServicePackMajorWORD2+276+276システムにインストールされている最新の Service Pack のメジャー バージョン番号。たとえば Service Pack 3 の場合、 メジャー バージョン番号は 3 です。Service Pack がインストールされていない場合、値は 0 です。
wServicePackMinorWORD2+278+278システムにインストールされている最新の Service Pack のマイナー バージョン番号。たとえば Service Pack 3 の場合、 マイナー バージョン番号は 0 です。
wSuiteMaskWORD2+280+280

システムで利用可能な製品スイートを識別するビット マスク。このメンバーには、次の値の組み合わせを指定できます。

意味
VER_SUITE_BACKOFFICE
0x00000004
Microsoft BackOffice コンポーネントがインストールされています。
VER_SUITE_BLADE
0x00000400
Windows Server 2003, Web Edition がインストールされています。
VER_SUITE_COMPUTE_SERVER
0x00004000
Windows Server 2003, Compute Cluster Edition がインストールされています。
VER_SUITE_DATACENTER
0x00000080
Windows Server 2008 Datacenter、Windows Server 2003, Datacenter Edition、または Windows 2000 Datacenter Server がインストールされています。
VER_SUITE_ENTERPRISE
0x00000002
Windows Server 2008 Enterprise、Windows Server 2003, Enterprise Edition、または Windows 2000 Advanced Server がインストールされています。このビット フラグの詳細については、 「解説」セクションを参照してください。
VER_SUITE_EMBEDDEDNT
0x00000040
Windows XP Embedded がインストールされています。
VER_SUITE_PERSONAL
0x00000200
Windows Vista Home Premium、Windows Vista Home Basic、または Windows XP Home Edition がインストールされています。
VER_SUITE_SINGLEUSERTS
0x00000100
リモート デスクトップはサポートされますが、対話型セッションは 1 つだけサポートされます。この値は、 システムがアプリケーション サーバー モードで実行されていない限り設定されます。
VER_SUITE_SMALLBUSINESS
0x00000001
Microsoft Small Business Server がかつてこのシステムにインストールされていましたが、別のバージョンの Windows にアップグレードされている可能性があります。このビット フラグの詳細については、「解説」セクションを参照してください。
VER_SUITE_SMALLBUSINESS_RESTRICTED
0x00000020
Microsoft Small Business Server が、制限付きクライアント ライセンスが有効な状態でインストールされています。 このビット フラグの詳細については、「解説」セクションを参照してください。
VER_SUITE_STORAGE_SERVER
0x00002000
Windows Storage Server 2003 R2 または Windows Storage Server 2003 がインストールされています。
VER_SUITE_TERMINAL
0x00000010
ターミナル サービスがインストールされています。この値は常に設定されます。

VER_SUITE_TERMINAL が設定されていて VER_SUITE_SINGLEUSERTS が設定されていない場合、システムはアプリケーション サーバー モードで実行されています。

VER_SUITE_WH_SERVER
0x00008000
Windows Home Server がインストールされています。
VER_SUITE_MULTIUSERTS
0x00020000
AppServer モードが有効です。
wProductTypeBYTE1+282+282

システムに関する追加情報。このメンバーには、次のいずれかの値を指定できます。

意味
VER_NT_DOMAIN_CONTROLLER
0x0000002
システムはドメイン コントローラーであり、オペレーティング システムは Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、 Windows Server 2003、または Windows 2000 Server です。
VER_NT_SERVER
0x0000003
オペレーティング システムは Windows Server 2012、Windows Server 2008 R2、Windows Server 2008、Windows Server 2003、または Windows 2000 Server です。

ドメイン コントローラーでもあるサーバーは、 VER_NT_SERVER ではなく VER_NT_DOMAIN_CONTROLLER として報告される点に注意してください。

VER_NT_WORKSTATION
0x0000001
オペレーティング システムは Windows 8、Windows 7、Windows Vista、Windows XP Professional、 Windows XP Home Edition、または Windows 2000 Professional です。
wReservedBYTE1+283+283将来の使用のために予約済みです。

公式ドキュメント

オペレーティング システムのバージョン情報を格納します。この情報には、メジャー バージョン番号とマイナー バージョン番号、ビルド番号、プラットフォーム識別子、および製品スイートとシステムにインストールされている最新の Service Pack に関する情報が含まれます。この構造体は GetVersionEx 関数および VerifyVersionInfo 関数で使用します。

解説(Remarks)

機能の有無を調べる方法として、バージョン情報に頼るのは最善ではありません。代わりに、対象となる機能のドキュメントを 参照してください。機能検出の一般的な手法の詳細については、 Operating System Version を参照してください。

特定のオペレーティング システムを必須とする場合は、その 1 つのオペレーティング システムだけを対象とする判定を設計するのではなく、 サポートする最小バージョンとして扱ってください。こうすることで、検出コードは将来のバージョンの Windows でも動作し続けます。

次の表は、サポートされている Windows のバージョンが返す値をまとめたものです。バージョン番号が同一のオペレーティング システムを区別するには、「その他」列の情報を使用してください。

オペレーティング システム バージョン番号 dwMajorVersion dwMinorVersion その他
Windows 10 10.0* 10 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2016 10.0* 10 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8.1 6.3* 6 3 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 R2 6.3* 6 3 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 8 6.2 6 2 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2012 6.2 6 2 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows 7 6.1 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2008 R2 6.1 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Server 2008 6.0 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
Windows Vista 6.0 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
Windows Server 2003 R2 5.2 5 2 GetSystemMetrics(SM_SERVERR2) != 0
Windows Home Server 5.2 5 2 OSVERSIONINFOEX.wSuiteMask & VER_SUITE_WH_SERVER
Windows Server 2003 5.2 5 2 GetSystemMetrics(SM_SERVERR2) == 0
Windows XP Professional x64 Edition 5.2 5 2 (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
Windows XP 5.1 5 1 該当なし
Windows 2000 5.0 5 0 該当なし
* Windows 8.1 または Windows 10 向けにマニフェストを設定したアプリケーションの場合の値です。Windows 8.1 または Windows 10 向けにマニフェストを設定していないアプリケーションでは、Windows 8 の OS バージョン値 (6.2) が返されます。アプリケーションに Windows 8.1 または Windows 10 向けのマニフェストを設定するには、Targeting your application for Windows を参照してください。

Small Business Server がシステムにインストールされているかどうかを判断する際に、VER_SUITE_SMALLBUSINESS フラグだけに 頼るべきではありません。この製品スイートがインストールされると、このフラグと VER_SUITE_SMALLBUSINESS_RESTRICTED フラグの両方が設定されるためです。 このインストールを Windows Server, Standard Edition にアップグレードすると、 VER_SUITE_SMALLBUSINESS_RESTRICTED フラグはクリアされますが、 VER_SUITE_SMALLBUSINESS flag は設定されたままになります。この場合は、Small Business Server がかつてこのシステムにインストールされていたことを示します。さらに Windows Server, Enterprise Edition にアップグレードした場合も、VER_SUITE_SMALLBUSINESS フラグは設定されたままです。

互換モードが有効な場合、OSVERSIONINFOEX 構造体には アプリケーション互換性 のために選択されたオペレーティング システムの情報が格納されます。

Win32 ベースのアプリケーションが WOW64 上で実行されているかどうかを判断するには、 IsWow64Process 関数を呼び出します。システムが 64 ビット版の Windows を実行しているかどうかを判断するには、GetNativeSystemInfo 関数を呼び出します。

GetSystemMetrics 関数は、現在のオペレーティング システムについて 次の追加情報を提供します。

製品 設定
Windows Server 2003 R2 SM_SERVERR2
Windows XP Media Center Edition SM_MEDIACENTER
Windows XP Starter Edition SM_STARTER
Windows XP Tablet PC Edition SM_TABLETPC

例については、 Getting the System Version を参照してください。

メモ

winnt.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいてこの関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして OSVERSIONINFOEX を定義します。このエンコーディング中立のエイリアスを、エンコーディング中立でないコードと混在させて使用すると、不一致が生じてコンパイル エラーや実行時エラーの原因となることがあります。詳細については、Conventions for Function Prototypes を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

#include <windows.h>

// OSVERSIONINFOEXW  (x64 284 / x86 284 バイト)
typedef struct OSVERSIONINFOEXW {
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    WCHAR szCSDVersion[128];
    WORD wServicePackMajor;
    WORD wServicePackMinor;
    WORD wSuiteMask;
    BYTE wProductType;
    BYTE wReserved;
} OSVERSIONINFOEXW;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct OSVERSIONINFOEXW
{
    public uint dwOSVersionInfoSize;
    public uint dwMajorVersion;
    public uint dwMinorVersion;
    public uint dwBuildNumber;
    public uint dwPlatformId;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] public string szCSDVersion;
    public ushort wServicePackMajor;
    public ushort wServicePackMinor;
    public ushort wSuiteMask;
    public byte wProductType;
    public byte wReserved;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure OSVERSIONINFOEXW
    Public dwOSVersionInfoSize As UInteger
    Public dwMajorVersion As UInteger
    Public dwMinorVersion As UInteger
    Public dwBuildNumber As UInteger
    Public dwPlatformId As UInteger
    <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String
    Public wServicePackMajor As UShort
    Public wServicePackMinor As UShort
    Public wSuiteMask As UShort
    Public wProductType As Byte
    Public wReserved As Byte
End Structure
import ctypes
from ctypes import wintypes

class OSVERSIONINFOEXW(ctypes.Structure):
    _fields_ = [
        ("dwOSVersionInfoSize", wintypes.DWORD),
        ("dwMajorVersion", wintypes.DWORD),
        ("dwMinorVersion", wintypes.DWORD),
        ("dwBuildNumber", wintypes.DWORD),
        ("dwPlatformId", wintypes.DWORD),
        ("szCSDVersion", ctypes.c_wchar * 128),
        ("wServicePackMajor", ctypes.c_ushort),
        ("wServicePackMinor", ctypes.c_ushort),
        ("wSuiteMask", ctypes.c_ushort),
        ("wProductType", ctypes.c_ubyte),
        ("wReserved", ctypes.c_ubyte),
    ]
#[repr(C)]
pub struct OSVERSIONINFOEXW {
    pub dwOSVersionInfoSize: u32,
    pub dwMajorVersion: u32,
    pub dwMinorVersion: u32,
    pub dwBuildNumber: u32,
    pub dwPlatformId: u32,
    pub szCSDVersion: [u16; 128],
    pub wServicePackMajor: u16,
    pub wServicePackMinor: u16,
    pub wSuiteMask: u16,
    pub wProductType: u8,
    pub wReserved: u8,
}
import "golang.org/x/sys/windows"

type OSVERSIONINFOEXW struct {
	dwOSVersionInfoSize uint32
	dwMajorVersion uint32
	dwMinorVersion uint32
	dwBuildNumber uint32
	dwPlatformId uint32
	szCSDVersion [128]uint16
	wServicePackMajor uint16
	wServicePackMinor uint16
	wSuiteMask uint16
	wProductType byte
	wReserved byte
}
type
  OSVERSIONINFOEXW = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of WideChar;
    wServicePackMajor: Word;
    wServicePackMinor: Word;
    wSuiteMask: Word;
    wProductType: Byte;
    wReserved: Byte;
  end;
const OSVERSIONINFOEXW = extern struct {
    dwOSVersionInfoSize: u32,
    dwMajorVersion: u32,
    dwMinorVersion: u32,
    dwBuildNumber: u32,
    dwPlatformId: u32,
    szCSDVersion: [128]u16,
    wServicePackMajor: u16,
    wServicePackMinor: u16,
    wSuiteMask: u16,
    wProductType: u8,
    wReserved: u8,
};
type
  OSVERSIONINFOEXW {.bycopy.} = object
    dwOSVersionInfoSize: uint32
    dwMajorVersion: uint32
    dwMinorVersion: uint32
    dwBuildNumber: uint32
    dwPlatformId: uint32
    szCSDVersion: array[128, uint16]
    wServicePackMajor: uint16
    wServicePackMinor: uint16
    wSuiteMask: uint16
    wProductType: uint8
    wReserved: uint8
struct OSVERSIONINFOEXW
{
    uint dwOSVersionInfoSize;
    uint dwMajorVersion;
    uint dwMinorVersion;
    uint dwBuildNumber;
    uint dwPlatformId;
    wchar[128] szCSDVersion;
    ushort wServicePackMajor;
    ushort wServicePackMinor;
    ushort wSuiteMask;
    ubyte wProductType;
    ubyte wReserved;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; OSVERSIONINFOEXW サイズ: 284 バイト(x64)
dim st, 71    ; 4byte整数×71(構造体サイズ 284 / 4 切り上げ)
; dwOSVersionInfoSize : DWORD (+0, 4byte)  st.0 = 値  /  値 = st.0   (lpoke/lpeek も可)
; dwMajorVersion : DWORD (+4, 4byte)  st.1 = 値  /  値 = st.1   (lpoke/lpeek も可)
; dwMinorVersion : DWORD (+8, 4byte)  st.2 = 値  /  値 = st.2   (lpoke/lpeek も可)
; dwBuildNumber : DWORD (+12, 4byte)  st.3 = 値  /  値 = st.3   (lpoke/lpeek も可)
; dwPlatformId : DWORD (+16, 4byte)  st.4 = 値  /  値 = st.4   (lpoke/lpeek も可)
; szCSDVersion : WCHAR (+20, 256byte)  varptr(st)+20 を基点に操作(256byte:入れ子/配列)
; wServicePackMajor : WORD (+276, 2byte)  wpoke st,276,値  /  値 = wpeek(st,276)
; wServicePackMinor : WORD (+278, 2byte)  wpoke st,278,値  /  値 = wpeek(st,278)
; wSuiteMask : WORD (+280, 2byte)  wpoke st,280,値  /  値 = wpeek(st,280)
; wProductType : BYTE (+282, 1byte)  poke st,282,値  /  値 = peek(st,282)
; wReserved : BYTE (+283, 1byte)  poke st,283,値  /  値 = peek(st,283)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global OSVERSIONINFOEXW
    #field int dwOSVersionInfoSize
    #field int dwMajorVersion
    #field int dwMinorVersion
    #field int dwBuildNumber
    #field int dwPlatformId
    #field wchar szCSDVersion 128
    #field short wServicePackMajor
    #field short wServicePackMinor
    #field short wSuiteMask
    #field byte wProductType
    #field byte wReserved
#endstruct

stdim st, OSVERSIONINFOEXW        ; NSTRUCT 変数を確保
st->dwOSVersionInfoSize = 100
mes "dwOSVersionInfoSize=" + st->dwOSVersionInfoSize