diff --git a/src/detection/gpu/gpu_windows.cpp b/src/detection/gpu/gpu_windows.cpp new file mode 100644 index 000000000..90a6fd264 --- /dev/null +++ b/src/detection/gpu/gpu_windows.cpp @@ -0,0 +1,44 @@ +extern "C" { +#include "gpu.h" +} +#include "util/windows/wmi.hpp" + +extern "C" +const char* ffDetectGPUImpl(FFlist* gpus, const FFinstance* instance) +{ + FF_UNUSED(instance); + + IEnumWbemClassObject* pEnumerator = ffQueryWmi(L"SELECT Name, AdapterCompatibility, DriverVersion FROM Win32_VideoController", nullptr); + + if(!pEnumerator) + return "Query WMI service failed"; + + IWbemClassObject *pclsObj = NULL; + ULONG uReturn = 0; + + while(SUCCEEDED(pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn)) && uReturn != 0) + { + FFGPUResult* gpu = (FFGPUResult*)ffListAdd(gpus); + + ffStrbufInit(&gpu->vendor); + ffGetWmiObjValue(pclsObj, L"AdapterCompatibility", &gpu->vendor); + if(ffStrbufStartsWithS(&gpu->vendor, "Intel ")) + { + //Intel returns "Intel Corporation", not sure about AMD + ffStrbufSetS(&gpu->vendor, "Intel"); + } + + ffStrbufInit(&gpu->name); + ffGetWmiObjValue(pclsObj, L"Name", &gpu->name); + + ffStrbufInit(&gpu->driver); + ffGetWmiObjValue(pclsObj, L"DriverVersion", &gpu->driver); + + gpu->temperature = FF_GPU_TEMP_UNSET; + gpu->coreCount = FF_GPU_CORE_COUNT_UNSET; + } + + pclsObj->Release(); + pEnumerator->Release(); + return nullptr; +} diff --git a/src/modules/gpu.c b/src/modules/gpu.c index c98ca3af8..11507191a 100644 --- a/src/modules/gpu.c +++ b/src/modules/gpu.c @@ -14,7 +14,7 @@ static void printGPUResult(FFinstance* instance, uint8_t index, FFcache* cache, FFstrbuf output; ffStrbufInitA(&output, gpu->vendor.length + 1 + gpu->name.length); - if(gpu->vendor.length > 0) + if(gpu->vendor.length > 0 && !ffStrbufStartsWith(&gpu->name, &gpu->vendor)) { ffStrbufAppend(&output, &gpu->vendor); ffStrbufAppendC(&output, ' ');