From f470744e4406c3940fc35eb21b25eaac9a38da7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 25 Oct 2022 17:29:52 +0800 Subject: [PATCH] Kernel: improve performance, detect code name (Windows) --- CMakeLists.txt | 2 +- src/modules/kernel.c | 10 ++- src/util/windows/utsname.c | 114 +++++++++++++++++++++++++++++++++++ src/util/windows/utsname.cpp | 35 ----------- 4 files changed, 124 insertions(+), 37 deletions(-) create mode 100644 src/util/windows/utsname.c delete mode 100644 src/util/windows/utsname.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e348e275b..e5cdca90d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -378,7 +378,7 @@ if(WIN32) src/util/windows/wmi.cpp src/util/windows/getline.c src/util/windows/pwd.c - src/util/windows/utsname.cpp + src/util/windows/utsname.c src/detection/poweradapter/poweradapter_nosupport.c src/detection/media/media_nosupport.c diff --git a/src/modules/kernel.c b/src/modules/kernel.c index 062b04f42..72096ce55 100644 --- a/src/modules/kernel.c +++ b/src/modules/kernel.c @@ -9,7 +9,15 @@ void ffPrintKernel(FFinstance* instance) if(instance->config.kernel.outputFormat.length == 0) { ffPrintLogoAndKey(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel.key); - puts(instance->state.utsname.release); + + #ifdef _WIN32 + if(instance->state.utsname.version[0] != '\0') + printf("%s (%s)\n", instance->state.utsname.release, instance->state.utsname.version); + else + puts(instance->state.utsname.release); + #else + puts(instance->state.utsname.release); + #endif } else { diff --git a/src/util/windows/utsname.c b/src/util/windows/utsname.c new file mode 100644 index 000000000..07f6e52e8 --- /dev/null +++ b/src/util/windows/utsname.c @@ -0,0 +1,114 @@ +#include "fastfetch.h" +#include "utsname.h" + +#define WIN32_LEAN_AND_MEAN 1 +#include + +static int detectSysname(struct utsname *name) +{ + strncpy(name->sysname, "Windows_NT", UTSNAME_MAXLENGTH); + return 0; +} + +static int detectNodename(struct utsname *name) +{ + DWORD bufSize = UTSNAME_MAXLENGTH - 1; + if(!GetComputerNameA(name->nodename, &bufSize)) + return 1; + name->nodename[bufSize] = '\0'; + return 0; +} + +static int detectVersion(struct utsname *name) +{ + HKEY hKey; + if(RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) + return 1; + + DWORD bufSize; + + DWORD currentMajorVersionNumber; + bufSize = sizeof(currentMajorVersionNumber); + if(RegGetValueA(hKey, NULL, "CurrentMajorVersionNumber", RRF_RT_REG_DWORD, NULL, ¤tMajorVersionNumber, &bufSize) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return 1; + } + + DWORD currentMinorVersionNumber; + bufSize = sizeof(currentMinorVersionNumber); + if(RegGetValueA(hKey, NULL, "CurrentMinorVersionNumber", RRF_RT_REG_DWORD, NULL, ¤tMinorVersionNumber, &bufSize) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return 1; + } + + char currentBuildNumber[32]; + bufSize = sizeof(currentBuildNumber); + if(RegGetValueA(hKey, NULL, "CurrentBuildNumber", RRF_RT_REG_SZ, NULL, currentBuildNumber, &bufSize) != ERROR_SUCCESS) + strcpy(currentBuildNumber, "0"); + + DWORD ubr; + bufSize = sizeof(ubr); + if(RegGetValueA(hKey, NULL, "UBR", RRF_RT_REG_DWORD, NULL, &ubr, &bufSize) != ERROR_SUCCESS || bufSize != sizeof(ubr)) + ubr = 0; + + snprintf(name->release, sizeof(name->release), "%u.%u.%s.%u", (unsigned)currentMajorVersionNumber, (unsigned)currentMinorVersionNumber, currentBuildNumber, (unsigned)ubr); + + bufSize = sizeof(name->version); + RegGetValueA(hKey, NULL, "DisplayVersion", RRF_RT_REG_SZ, NULL, name->version, &bufSize); + + RegCloseKey(hKey); + return 0; +} + +static int detectMachine(struct utsname *name) +{ + // Get hardware info + SYSTEM_INFO sysInfo = {0}; + GetNativeSystemInfo(&sysInfo); + + // Set processor architecture + switch(sysInfo.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_AMD64: + strcpy(name->machine, "x86_64"); + break; + case PROCESSOR_ARCHITECTURE_IA64: + strcpy(name->machine, "ia64"); + break; + case PROCESSOR_ARCHITECTURE_INTEL: + strcpy(name->machine, "x86"); + break; + case PROCESSOR_ARCHITECTURE_ARM64: + strcpy(name->machine, "aarch64"); + break; + case PROCESSOR_ARCHITECTURE_ARM: + strcpy(name->machine, "arm"); + break; + case PROCESSOR_ARCHITECTURE_PPC: + strcpy(name->machine, "ppc"); + break; + case PROCESSOR_ARCHITECTURE_MIPS: + strcpy(name->machine, "mips"); + break; + case PROCESSOR_ARCHITECTURE_UNKNOWN: + default: + strcpy(name->machine, "unknown"); + break; + } + + return 0; +} + +int uname(struct utsname *name) +{ + memset(name, 0, sizeof(*name)); + + int sysnameResult = detectSysname(name); + int nodenameResult = detectNodename(name); + int versionResult = detectVersion(name); + int machineResult = detectMachine(name); + + return sysnameResult || nodenameResult || versionResult || machineResult; +} diff --git a/src/util/windows/utsname.cpp b/src/util/windows/utsname.cpp deleted file mode 100644 index 10c0f7b68..000000000 --- a/src/util/windows/utsname.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "util/windows/wmi.hpp" -extern "C" { - #include "utsname.h" -} - -int uname(struct utsname *name) -{ - memset(name, 0, sizeof(*name)); - - strncpy(name->sysname, "Windows_NT", UTSNAME_MAXLENGTH); - - FFWmiQuery query(L"SELECT Version, CSName, OSArchitecture FROM Win32_OperatingSystem"); - if(!query) - return -1; - - if(FFWmiRecord record = query.next()) - { - FFstrbuf value; - ffStrbufInit(&value); - record.getString(L"Version", &value); - strncpy(name->release, value.chars, UTSNAME_MAXLENGTH); - - ffStrbufClear(&value); - record.getString(L"CSName", &value); - strncpy(name->nodename, value.chars, UTSNAME_MAXLENGTH); - - ffStrbufClear(&value); - record.getString(L"OSArchitecture", &value); - strncpy(name->machine, value.chars, UTSNAME_MAXLENGTH); - - ffStrbufDestroy(&value); - } - - return 0; -}