golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/installer/fetcher/systeminfo.c (about) 1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2020-2022 Jason A. Donenfeld. All Rights Reserved. 4 */ 5 6 #include "systeminfo.h" 7 #include "version.h" 8 #include <windows.h> 9 #include <stdbool.h> 10 #include <stdio.h> 11 12 extern NTAPI __declspec(dllimport) void RtlGetNtVersionNumbers(DWORD *MajorVersion, DWORD *MinorVersion, DWORD *BuildNumber); 13 14 const char *architecture(void) 15 { 16 static const char *cached_arch; 17 HMODULE kernel32; 18 BOOL(WINAPI *IsWow64Process2)(HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine); 19 USHORT process_machine, native_machine; 20 BOOL is_wow64_process; 21 22 if (cached_arch) 23 return cached_arch; 24 25 kernel32 = GetModuleHandleA("kernel32.dll"); 26 if (!kernel32) 27 return NULL; 28 *(FARPROC *)&IsWow64Process2 = GetProcAddress(kernel32, "IsWow64Process2"); 29 if (IsWow64Process2) { 30 if (!IsWow64Process2(GetCurrentProcess(), &process_machine, &native_machine)) 31 return NULL; 32 switch (native_machine) { 33 case IMAGE_FILE_MACHINE_I386: 34 return cached_arch = "x86"; 35 case IMAGE_FILE_MACHINE_AMD64: 36 return cached_arch = "amd64"; 37 case IMAGE_FILE_MACHINE_ARMNT: 38 return cached_arch = "arm"; 39 case IMAGE_FILE_MACHINE_ARM64: 40 return cached_arch = "arm64"; 41 } 42 } else { 43 if (!IsWow64Process(GetCurrentProcess(), &is_wow64_process)) 44 return NULL; 45 return cached_arch = is_wow64_process ? "amd64" : "x86"; 46 } 47 return NULL; 48 } 49 50 const char *useragent(void) 51 { 52 static char useragent[0x200]; 53 DWORD maj, min, build; 54 55 if (useragent[0]) 56 return useragent; 57 RtlGetNtVersionNumbers(&maj, &min, &build); 58 _snprintf_s(useragent, sizeof(useragent), _TRUNCATE, "WireGuard-Fetcher/" VERSION_STR " (Windows %lu.%lu.%lu; %s)", maj, min, build & 0xffff, architecture()); 59 return useragent; 60 } 61 62 bool is_win7(void) 63 { 64 DWORD maj, min, build; 65 RtlGetNtVersionNumbers(&maj, &min, &build); 66 return maj == 6 && min == 1; 67 } 68 69 bool is_win8dotzero_or_below(void) 70 { 71 DWORD maj, min, build; 72 RtlGetNtVersionNumbers(&maj, &min, &build); 73 return maj == 6 && min <= 2; 74 }