mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 02:42:09 +02:00
Kernel: improve performance, detect code name (Windows)
This commit is contained in:
+1
-1
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
#include "fastfetch.h"
|
||||
#include "utsname.h"
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN 1
|
||||
#include <Windows.h>
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user