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  }