2023-06-23 11:41:22 +08:00
|
|
|
extern "C" {
|
|
|
|
|
#include "chassis.h"
|
|
|
|
|
#include "util/windows/registry.h"
|
2023-06-24 23:58:57 +08:00
|
|
|
#include "util/smbiosHelper.h"
|
2023-06-23 11:41:22 +08:00
|
|
|
}
|
|
|
|
|
#include "util/windows/wmi.hpp"
|
|
|
|
|
|
|
|
|
|
static const char* detectWithRegistry(FFChassisResult* result)
|
|
|
|
|
{
|
|
|
|
|
FF_HKEY_AUTO_DESTROY hKey = NULL;
|
|
|
|
|
if(!ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, L"HARDWARE\\DESCRIPTION\\System\\BIOS", &hKey, NULL)) // SMBIOS
|
|
|
|
|
return "ffRegOpenKeyForRead(HKEY_LOCAL_MACHINE, L\"HARDWARE\\DESCRIPTION\\System\\BIOS\", &hKey, NULL) failed";
|
|
|
|
|
|
|
|
|
|
uint32_t type = 0;
|
|
|
|
|
if(!ffRegReadUint(hKey, L"EnclosureType", &type, NULL))
|
|
|
|
|
return "\"HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\BIOS\\EnclosureType\" doesn't exist";
|
|
|
|
|
|
|
|
|
|
const char* typeStr = ffChassisTypeToString(type);
|
|
|
|
|
if(!typeStr)
|
|
|
|
|
return "Unknown chassis type";
|
|
|
|
|
|
|
|
|
|
ffStrbufAppendS(&result->type, typeStr);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FF_MAYBE_UNUSED static const char* detectWithWmi(FFChassisResult* result)
|
|
|
|
|
{
|
|
|
|
|
FFWmiQuery query(L"SELECT Version, ChassisTypes, Manufacturer FROM Win32_SystemEnclosure");
|
|
|
|
|
if (!query)
|
|
|
|
|
return "Query WMI service failed";
|
|
|
|
|
|
|
|
|
|
if (FFWmiRecord record = query.next())
|
|
|
|
|
{
|
|
|
|
|
FFWmiVariant vtProp;
|
|
|
|
|
if(FAILED(record.obj->Get(L"ChassisTypes", 0, &vtProp, nullptr, nullptr)))
|
|
|
|
|
return "Get ChassisTypes failed";
|
|
|
|
|
|
|
|
|
|
auto [arr, len] = (std::pair<const int32_t*, uint32_t>) vtProp;
|
|
|
|
|
|
|
|
|
|
if(len == 0)
|
|
|
|
|
return "ChassisTypes contain no data failed";
|
|
|
|
|
|
2023-06-24 23:58:57 +08:00
|
|
|
for (uint32_t i = 0; i < len; ++i)
|
|
|
|
|
{
|
|
|
|
|
if (i > 0)
|
|
|
|
|
ffStrbufAppendS(&result->type, ", ");
|
|
|
|
|
ffStrbufAppendS(&result->type, ffChassisTypeToString((uint32_t) arr[i]));
|
|
|
|
|
}
|
2023-06-23 11:41:22 +08:00
|
|
|
|
|
|
|
|
record.getString(L"Version", &result->version);
|
2023-06-24 23:58:57 +08:00
|
|
|
ffCleanUpSmbiosValue(&result->version);
|
2023-06-23 11:41:22 +08:00
|
|
|
record.getString(L"Manufacturer", &result->vendor);
|
2023-06-24 23:58:57 +08:00
|
|
|
ffCleanUpSmbiosValue(&result->vendor);
|
2023-06-23 11:41:22 +08:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
return "No WMI result returned";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
extern "C"
|
|
|
|
|
const char* ffDetectChassis(FFChassisResult* result)
|
|
|
|
|
{
|
2023-06-24 23:58:57 +08:00
|
|
|
if (instance.config.allowSlowOperations)
|
|
|
|
|
return detectWithWmi(result);
|
2023-06-23 11:41:22 +08:00
|
|
|
return detectWithRegistry(result);
|
|
|
|
|
}
|