Kernel: add support for Windows

This commit is contained in:
李通洲
2022-10-08 18:29:23 +08:00
parent af6b7dd81b
commit 8387d8651e
5 changed files with 83 additions and 4 deletions
+2
View File
@@ -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
+18
View File
@@ -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
+9
View File
@@ -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);
}
+34
View File
@@ -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();
}
+20 -4
View File
@@ -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);
}