golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/version/os.go (about)

     1  /* SPDX-License-Identifier: MIT
     2   *
     3   * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved.
     4   */
     5  
     6  package version
     7  
     8  import (
     9  	"fmt"
    10  
    11  	"golang.org/x/sys/windows"
    12  	"golang.org/x/sys/windows/registry"
    13  )
    14  
    15  const (
    16  	PRODUCT_UNDEFINED                           = 0x00000000
    17  	PRODUCT_ULTIMATE                            = 0x00000001
    18  	PRODUCT_HOME_BASIC                          = 0x00000002
    19  	PRODUCT_HOME_PREMIUM                        = 0x00000003
    20  	PRODUCT_ENTERPRISE                          = 0x00000004
    21  	PRODUCT_HOME_BASIC_N                        = 0x00000005
    22  	PRODUCT_BUSINESS                            = 0x00000006
    23  	PRODUCT_STANDARD_SERVER                     = 0x00000007
    24  	PRODUCT_DATACENTER_SERVER                   = 0x00000008
    25  	PRODUCT_SMALLBUSINESS_SERVER                = 0x00000009
    26  	PRODUCT_ENTERPRISE_SERVER                   = 0x0000000A
    27  	PRODUCT_STARTER                             = 0x0000000B
    28  	PRODUCT_DATACENTER_SERVER_CORE              = 0x0000000C
    29  	PRODUCT_STANDARD_SERVER_CORE                = 0x0000000D
    30  	PRODUCT_ENTERPRISE_SERVER_CORE              = 0x0000000E
    31  	PRODUCT_ENTERPRISE_SERVER_IA64              = 0x0000000F
    32  	PRODUCT_BUSINESS_N                          = 0x00000010
    33  	PRODUCT_WEB_SERVER                          = 0x00000011
    34  	PRODUCT_CLUSTER_SERVER                      = 0x00000012
    35  	PRODUCT_HOME_SERVER                         = 0x00000013
    36  	PRODUCT_STORAGE_EXPRESS_SERVER              = 0x00000014
    37  	PRODUCT_STORAGE_STANDARD_SERVER             = 0x00000015
    38  	PRODUCT_STORAGE_WORKGROUP_SERVER            = 0x00000016
    39  	PRODUCT_STORAGE_ENTERPRISE_SERVER           = 0x00000017
    40  	PRODUCT_SERVER_FOR_SMALLBUSINESS            = 0x00000018
    41  	PRODUCT_SMALLBUSINESS_SERVER_PREMIUM        = 0x00000019
    42  	PRODUCT_HOME_PREMIUM_N                      = 0x0000001A
    43  	PRODUCT_ENTERPRISE_N                        = 0x0000001B
    44  	PRODUCT_ULTIMATE_N                          = 0x0000001C
    45  	PRODUCT_WEB_SERVER_CORE                     = 0x0000001D
    46  	PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT    = 0x0000001E
    47  	PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY      = 0x0000001F
    48  	PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING     = 0x00000020
    49  	PRODUCT_SERVER_FOUNDATION                   = 0x00000021
    50  	PRODUCT_HOME_PREMIUM_SERVER                 = 0x00000022
    51  	PRODUCT_SERVER_FOR_SMALLBUSINESS_V          = 0x00000023
    52  	PRODUCT_STANDARD_SERVER_V                   = 0x00000024
    53  	PRODUCT_DATACENTER_SERVER_V                 = 0x00000025
    54  	PRODUCT_ENTERPRISE_SERVER_V                 = 0x00000026
    55  	PRODUCT_DATACENTER_SERVER_CORE_V            = 0x00000027
    56  	PRODUCT_STANDARD_SERVER_CORE_V              = 0x00000028
    57  	PRODUCT_ENTERPRISE_SERVER_CORE_V            = 0x00000029
    58  	PRODUCT_HYPERV                              = 0x0000002A
    59  	PRODUCT_STORAGE_EXPRESS_SERVER_CORE         = 0x0000002B
    60  	PRODUCT_STORAGE_STANDARD_SERVER_CORE        = 0x0000002C
    61  	PRODUCT_STORAGE_WORKGROUP_SERVER_CORE       = 0x0000002D
    62  	PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE      = 0x0000002E
    63  	PRODUCT_STARTER_N                           = 0x0000002F
    64  	PRODUCT_PROFESSIONAL                        = 0x00000030
    65  	PRODUCT_PROFESSIONAL_N                      = 0x00000031
    66  	PRODUCT_SB_SOLUTION_SERVER                  = 0x00000032
    67  	PRODUCT_SERVER_FOR_SB_SOLUTIONS             = 0x00000033
    68  	PRODUCT_STANDARD_SERVER_SOLUTIONS           = 0x00000034
    69  	PRODUCT_STANDARD_SERVER_SOLUTIONS_CORE      = 0x00000035
    70  	PRODUCT_SB_SOLUTION_SERVER_EM               = 0x00000036
    71  	PRODUCT_SERVER_FOR_SB_SOLUTIONS_EM          = 0x00000037
    72  	PRODUCT_SOLUTION_EMBEDDEDSERVER             = 0x00000038
    73  	PRODUCT_SOLUTION_EMBEDDEDSERVER_CORE        = 0x00000039
    74  	PRODUCT_PROFESSIONAL_EMBEDDED               = 0x0000003A
    75  	PRODUCT_ESSENTIALBUSINESS_SERVER_MGMT       = 0x0000003B
    76  	PRODUCT_ESSENTIALBUSINESS_SERVER_ADDL       = 0x0000003C
    77  	PRODUCT_ESSENTIALBUSINESS_SERVER_MGMTSVC    = 0x0000003D
    78  	PRODUCT_ESSENTIALBUSINESS_SERVER_ADDLSVC    = 0x0000003E
    79  	PRODUCT_SMALLBUSINESS_SERVER_PREMIUM_CORE   = 0x0000003F
    80  	PRODUCT_CLUSTER_SERVER_V                    = 0x00000040
    81  	PRODUCT_EMBEDDED                            = 0x00000041
    82  	PRODUCT_STARTER_E                           = 0x00000042
    83  	PRODUCT_HOME_BASIC_E                        = 0x00000043
    84  	PRODUCT_HOME_PREMIUM_E                      = 0x00000044
    85  	PRODUCT_PROFESSIONAL_E                      = 0x00000045
    86  	PRODUCT_ENTERPRISE_E                        = 0x00000046
    87  	PRODUCT_ULTIMATE_E                          = 0x00000047
    88  	PRODUCT_ENTERPRISE_EVALUATION               = 0x00000048
    89  	PRODUCT_MULTIPOINT_STANDARD_SERVER          = 0x0000004C
    90  	PRODUCT_MULTIPOINT_PREMIUM_SERVER           = 0x0000004D
    91  	PRODUCT_STANDARD_EVALUATION_SERVER          = 0x0000004F
    92  	PRODUCT_DATACENTER_EVALUATION_SERVER        = 0x00000050
    93  	PRODUCT_ENTERPRISE_N_EVALUATION             = 0x00000054
    94  	PRODUCT_EMBEDDED_AUTOMOTIVE                 = 0x00000055
    95  	PRODUCT_EMBEDDED_INDUSTRY_A                 = 0x00000056
    96  	PRODUCT_THINPC                              = 0x00000057
    97  	PRODUCT_EMBEDDED_A                          = 0x00000058
    98  	PRODUCT_EMBEDDED_INDUSTRY                   = 0x00000059
    99  	PRODUCT_EMBEDDED_E                          = 0x0000005A
   100  	PRODUCT_EMBEDDED_INDUSTRY_E                 = 0x0000005B
   101  	PRODUCT_EMBEDDED_INDUSTRY_A_E               = 0x0000005C
   102  	PRODUCT_STORAGE_WORKGROUP_EVALUATION_SERVER = 0x0000005F
   103  	PRODUCT_STORAGE_STANDARD_EVALUATION_SERVER  = 0x00000060
   104  	PRODUCT_CORE_ARM                            = 0x00000061
   105  	PRODUCT_CORE_N                              = 0x00000062
   106  	PRODUCT_CORE_COUNTRYSPECIFIC                = 0x00000063
   107  	PRODUCT_CORE_SINGLELANGUAGE                 = 0x00000064
   108  	PRODUCT_CORE                                = 0x00000065
   109  	PRODUCT_PROFESSIONAL_WMC                    = 0x00000067
   110  	PRODUCT_EMBEDDED_INDUSTRY_EVAL              = 0x00000069
   111  	PRODUCT_EMBEDDED_INDUSTRY_E_EVAL            = 0x0000006A
   112  	PRODUCT_EMBEDDED_EVAL                       = 0x0000006B
   113  	PRODUCT_EMBEDDED_E_EVAL                     = 0x0000006C
   114  	PRODUCT_NANO_SERVER                         = 0x0000006D
   115  	PRODUCT_CLOUD_STORAGE_SERVER                = 0x0000006E
   116  	PRODUCT_CORE_CONNECTED                      = 0x0000006F
   117  	PRODUCT_PROFESSIONAL_STUDENT                = 0x00000070
   118  	PRODUCT_CORE_CONNECTED_N                    = 0x00000071
   119  	PRODUCT_PROFESSIONAL_STUDENT_N              = 0x00000072
   120  	PRODUCT_CORE_CONNECTED_SINGLELANGUAGE       = 0x00000073
   121  	PRODUCT_CORE_CONNECTED_COUNTRYSPECIFIC      = 0x00000074
   122  	PRODUCT_CONNECTED_CAR                       = 0x00000075
   123  	PRODUCT_INDUSTRY_HANDHELD                   = 0x00000076
   124  	PRODUCT_PPI_PRO                             = 0x00000077
   125  	PRODUCT_ARM64_SERVER                        = 0x00000078
   126  	PRODUCT_EDUCATION                           = 0x00000079
   127  	PRODUCT_EDUCATION_N                         = 0x0000007A
   128  	PRODUCT_IOTUAP                              = 0x0000007B
   129  	PRODUCT_CLOUD_HOST_INFRASTRUCTURE_SERVER    = 0x0000007C
   130  	PRODUCT_ENTERPRISE_S                        = 0x0000007D
   131  	PRODUCT_ENTERPRISE_S_N                      = 0x0000007E
   132  	PRODUCT_PROFESSIONAL_S                      = 0x0000007F
   133  	PRODUCT_PROFESSIONAL_S_N                    = 0x00000080
   134  	PRODUCT_ENTERPRISE_S_EVALUATION             = 0x00000081
   135  	PRODUCT_ENTERPRISE_S_N_EVALUATION           = 0x00000082
   136  	PRODUCT_HOLOGRAPHIC                         = 0x00000087
   137  	PRODUCT_PRO_SINGLE_LANGUAGE                 = 0x0000008A
   138  	PRODUCT_PRO_CHINA                           = 0x0000008B
   139  	PRODUCT_ENTERPRISE_SUBSCRIPTION             = 0x0000008C
   140  	PRODUCT_ENTERPRISE_SUBSCRIPTION_N           = 0x0000008D
   141  	PRODUCT_DATACENTER_NANO_SERVER              = 0x0000008F
   142  	PRODUCT_STANDARD_NANO_SERVER                = 0x00000090
   143  	PRODUCT_DATACENTER_A_SERVER_CORE            = 0x00000091
   144  	PRODUCT_STANDARD_A_SERVER_CORE              = 0x00000092
   145  	PRODUCT_DATACENTER_WS_SERVER_CORE           = 0x00000093
   146  	PRODUCT_STANDARD_WS_SERVER_CORE             = 0x00000094
   147  	PRODUCT_UTILITY_VM                          = 0x00000095
   148  	PRODUCT_DATACENTER_EVALUATION_SERVER_CORE   = 0x0000009F
   149  	PRODUCT_STANDARD_EVALUATION_SERVER_CORE     = 0x000000A0
   150  	PRODUCT_PRO_WORKSTATION                     = 0x000000A1
   151  	PRODUCT_PRO_WORKSTATION_N                   = 0x000000A2
   152  	PRODUCT_PRO_FOR_EDUCATION                   = 0x000000A4
   153  	PRODUCT_PRO_FOR_EDUCATION_N                 = 0x000000A5
   154  	PRODUCT_AZURE_SERVER_CORE                   = 0x000000A8
   155  	PRODUCT_AZURE_NANO_SERVER                   = 0x000000A9
   156  	PRODUCT_ENTERPRISEG                         = 0x000000AB
   157  	PRODUCT_ENTERPRISEGN                        = 0x000000AC
   158  	PRODUCT_SERVERRDSH                          = 0x000000AF
   159  	PRODUCT_CLOUD                               = 0x000000B2
   160  	PRODUCT_CLOUDN                              = 0x000000B3
   161  	PRODUCT_HUBOS                               = 0x000000B4
   162  	PRODUCT_ONECOREUPDATEOS                     = 0x000000B6
   163  	PRODUCT_CLOUDE                              = 0x000000B7
   164  	PRODUCT_ANDROMEDA                           = 0x000000B8
   165  	PRODUCT_IOTOS                               = 0x000000B9
   166  	PRODUCT_CLOUDEN                             = 0x000000BA
   167  	PRODUCT_UNLICENSED                          = 0xABCDABCD
   168  )
   169  
   170  func OsIsCore() bool {
   171  	versionInfo := windows.RtlGetVersion()
   172  	if versionInfo.MajorVersion > 6 || (versionInfo.MajorVersion == 6 && versionInfo.MinorVersion >= 2) {
   173  		k, err := registry.OpenKey(registry.LOCAL_MACHINE, `Software\Microsoft\Windows NT\CurrentVersion\Server\ServerLevels`, registry.READ)
   174  		if err != nil {
   175  			return false
   176  		}
   177  		nanoServerInteger, _, err1 := k.GetIntegerValue("NanoServer")
   178  		serverCoreInteger, _, err2 := k.GetIntegerValue("ServerCore")
   179  		serverGuiInteger, _, err3 := k.GetIntegerValue("Server-Gui-Shell")
   180  		nanoServer := nanoServerInteger == 1 && err1 == nil
   181  		serverCore := serverCoreInteger == 1 && err2 == nil
   182  		serverGui := serverGuiInteger == 1 && err3 == nil
   183  		k.Close()
   184  		return (nanoServer || serverCore) && !serverGui
   185  	}
   186  
   187  	switch versionInfo.ProductType {
   188  	case PRODUCT_DATACENTER_SERVER_CORE, PRODUCT_STANDARD_SERVER_CORE, PRODUCT_ENTERPRISE_SERVER_CORE, PRODUCT_WEB_SERVER_CORE, PRODUCT_DATACENTER_SERVER_CORE_V, PRODUCT_STANDARD_SERVER_CORE_V, PRODUCT_ENTERPRISE_SERVER_CORE_V, PRODUCT_STORAGE_EXPRESS_SERVER_CORE, PRODUCT_STORAGE_STANDARD_SERVER_CORE, PRODUCT_STORAGE_WORKGROUP_SERVER_CORE, PRODUCT_STORAGE_ENTERPRISE_SERVER_CORE, PRODUCT_DATACENTER_A_SERVER_CORE, PRODUCT_STANDARD_A_SERVER_CORE, PRODUCT_DATACENTER_WS_SERVER_CORE, PRODUCT_STANDARD_WS_SERVER_CORE, PRODUCT_DATACENTER_EVALUATION_SERVER_CORE, PRODUCT_STANDARD_EVALUATION_SERVER_CORE, PRODUCT_AZURE_SERVER_CORE, PRODUCT_NANO_SERVER, PRODUCT_DATACENTER_NANO_SERVER, PRODUCT_STANDARD_NANO_SERVER, PRODUCT_AZURE_NANO_SERVER:
   189  		return true
   190  	}
   191  	return false
   192  }
   193  
   194  func OsName() string {
   195  	versionInfo := windows.RtlGetVersion()
   196  	winType := ""
   197  	switch versionInfo.ProductType {
   198  	case 3:
   199  		winType = " Server"
   200  	case 2:
   201  		winType = " Controller"
   202  	}
   203  	if OsIsCore() {
   204  		winType += " Core"
   205  	}
   206  	return fmt.Sprintf("Windows%s %d.%d.%d", winType, versionInfo.MajorVersion, versionInfo.MinorVersion, versionInfo.BuildNumber)
   207  }