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 }