From 8387d8651ec8ac52f95fcc61e77bb134fd858f3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Sat, 8 Oct 2022 18:29:23 +0800 Subject: [PATCH] Kernel: add support for Windows --- CMakeLists.txt | 2 ++ src/detection/kernel/kernel.h | 18 +++++++++++++ src/detection/kernel/kernel_linux.c | 9 +++++++ src/detection/kernel/kernel_windows.cpp | 34 +++++++++++++++++++++++++ src/modules/kernel.c | 24 ++++++++++++++--- 5 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 src/detection/kernel/kernel.h create mode 100644 src/detection/kernel/kernel_linux.c create mode 100644 src/detection/kernel/kernel_windows.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ee36893a1..88267a10b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,6 +269,7 @@ if(LINUX OR APPLE OR ANDROID OR BSD) src/detection/disk/disk.c src/detection/terminalShell/terminalShell_linux.c src/detection/packages/packages_linux.c + src/detection/kernel/kernel_linux.c ) endif() @@ -340,6 +341,7 @@ if(WIN_MSYS) src/detection/terminalShell/terminalShell_windows.cpp src/detection/packages/packages_linux.c src/detection/packages/packages_windows.c + src/detection/kernel/kernel_windows.cpp src/util/windows/wmi.cpp # Shared diff --git a/src/detection/kernel/kernel.h b/src/detection/kernel/kernel.h new file mode 100644 index 000000000..1b29350f3 --- /dev/null +++ b/src/detection/kernel/kernel.h @@ -0,0 +1,18 @@ +#pragma once + +#ifndef FF_INCLUDED_detection_kernel_kernel +#define FF_INCLUDED_detection_kernel_kernel + +#include "fastfetch.h" + +typedef struct FFKernelResult +{ + FFstrbuf sysname; + FFstrbuf release; + FFstrbuf version; + FFstrbuf error; +} FFKernelResult; + +void ffDetectKernel(FFinstance* instance, FFKernelResult* result); + +#endif diff --git a/src/detection/kernel/kernel_linux.c b/src/detection/kernel/kernel_linux.c new file mode 100644 index 000000000..4ab70f027 --- /dev/null +++ b/src/detection/kernel/kernel_linux.c @@ -0,0 +1,9 @@ +#include "kernel.h" + +void ffDetectKernel(FFinstance* instance, FFKernelResult* result) +{ + ffStrbufInit(&result->error); + ffStrbufInitS(&result->sysname, instance->state.utsname.sysname); + ffStrbufInitS(&result->release, instance->state.utsname.release); + ffStrbufInitS(&result->version, instance->state.utsname.version); +} diff --git a/src/detection/kernel/kernel_windows.cpp b/src/detection/kernel/kernel_windows.cpp new file mode 100644 index 000000000..94a06d950 --- /dev/null +++ b/src/detection/kernel/kernel_windows.cpp @@ -0,0 +1,34 @@ +extern "C" { +#include "kernel.h" +} +#include "util/windows/wmi.hpp" + +extern "C" void ffDetectKernel(FFinstance* instance, FFKernelResult* kernel) +{ + FF_UNUSED(instance); + + ffStrbufInit(&kernel->error); + + ffStrbufInitS(&kernel->sysname, "Windows_NT"); + ffStrbufInit(&kernel->release); + ffStrbufInit(&kernel->version); + + IEnumWbemClassObject* pEnumerator = ffQueryWmi(L"SELECT Version FROM Win32_OperatingSystem", &kernel->error); + if(!pEnumerator) + return; + + IWbemClassObject *pclsObj = NULL; + ULONG uReturn = 0; + + if(FAILED(pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn)) || uReturn == 0) + { + ffStrbufInitS(&kernel->error, "No WMI result returned"); + pEnumerator->Release(); + return; + } + + ffGetWmiObjString(pclsObj, L"Version", &kernel->release); + + pclsObj->Release(); + pEnumerator->Release(); +} diff --git a/src/modules/kernel.c b/src/modules/kernel.c index 062b04f42..02cece513 100644 --- a/src/modules/kernel.c +++ b/src/modules/kernel.c @@ -1,22 +1,38 @@ #include "fastfetch.h" #include "common/printing.h" +#include "detection/kernel/kernel.h" #define FF_KERNEL_MODULE_NAME "Kernel" #define FF_KERNEL_NUM_FORMAT_ARGS 3 void ffPrintKernel(FFinstance* instance) { + FFKernelResult result; + ffDetectKernel(instance, &result); + + if(result.error.length > 0) + { + ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel, "%*s", result.error.length, result.error.chars); + goto exit; + } + if(instance->config.kernel.outputFormat.length == 0) { ffPrintLogoAndKey(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel.key); - puts(instance->state.utsname.release); + ffStrbufPutTo(&result.release, stdout); } else { ffPrintFormat(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel, FF_KERNEL_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRING, instance->state.utsname.sysname}, - {FF_FORMAT_ARG_TYPE_STRING, instance->state.utsname.release}, - {FF_FORMAT_ARG_TYPE_STRING, instance->state.utsname.version} + {FF_FORMAT_ARG_TYPE_STRBUF, &result.sysname}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.release}, + {FF_FORMAT_ARG_TYPE_STRBUF, &result.version} }); } + +exit: + ffStrbufDestroy(&result.error); + ffStrbufDestroy(&result.sysname); + ffStrbufDestroy(&result.release); + ffStrbufDestroy(&result.version); }