diff --git a/CMakeLists.txt b/CMakeLists.txt index 96cb3784e..669233184 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -250,6 +250,7 @@ set(LIBFASTFETCH_SRC src/common/printing.c src/common/properties.c src/common/settings.c + src/detection/chassis/chassis.c src/detection/cpu/cpu.c src/detection/cpuusage/cpuusage.c src/detection/datetime/datetime.c @@ -530,7 +531,7 @@ elseif(WIN32) src/detection/bluetooth/bluetooth_windows.c src/detection/board/board_windows.c src/detection/brightness/brightness_windows.cpp - src/detection/chassis/chassis_nosupport.c + src/detection/chassis/chassis_windows.c src/detection/cpu/cpu_windows.c src/detection/cpuusage/cpuusage_windows.c src/detection/cursor/cursor_windows.c diff --git a/src/detection/chassis/chassis.c b/src/detection/chassis/chassis.c new file mode 100644 index 000000000..732df2074 --- /dev/null +++ b/src/detection/chassis/chassis.c @@ -0,0 +1,46 @@ +#include "chassis.h" + +const char* ffChassisTypeToString(uint32_t chassisType) +{ + // https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.2.0.pdf + // 7.4.1 System Enclosure or Chassis Types + switch (chassisType) + { + case 0x01: return "Other"; + case 0x02: return "Unknown"; + case 0x03: return "Desktop"; + case 0x04: return "Low Profile Desktop"; + case 0x05: return "Pizza Box"; + case 0x06: return "Mini Tower"; + case 0x07: return "Tower"; + case 0x08: return "Portable"; + case 0x09: return "Laptop"; + case 0x0A: return "Notebook"; + case 0x0B: return "Hand Held"; + case 0x0C: return "Docking Station"; + case 0x0D: return "All in One"; + case 0x0E: return "Sub Notebook"; + case 0x0F: return "Space-saving"; + case 0x10: return "Lunch Box"; + case 0x11: return "Main Server Chassis"; + case 0x12: return "Expansion Chassis"; + case 0x13: return "SubChassis"; + case 0x14: return "Bus Expansion Chassis"; + case 0x15: return "Peripheral Chassis"; + case 0x16: return "RAID Chassis"; + case 0x17: return "Rack Mount Chassis"; + case 0x18: return "Sealed-case PC"; + case 0x19: return "Multi-system chassis"; + case 0x1A: return "Compact PCI"; + case 0x1B: return "Advanced TCA"; + case 0x1C: return "Blade"; + case 0x1E: return "Tablet"; + case 0x1F: return "Convertible"; + case 0x20: return "Detachable"; + case 0x21: return "IoT Gateway"; + case 0x22: return "Embedded PC"; + case 0x23: return "Mini PC"; + case 0x24: return "Stick PC"; + default: return NULL; + } +} diff --git a/src/detection/chassis/chassis.h b/src/detection/chassis/chassis.h index 221b066ce..b7551d38b 100644 --- a/src/detection/chassis/chassis.h +++ b/src/detection/chassis/chassis.h @@ -13,5 +13,6 @@ typedef struct FFChassisResult } FFChassisResult; const char* ffDetectChassis(FFChassisResult* result); +const char* ffChassisTypeToString(uint32_t chassisType); #endif diff --git a/src/detection/chassis/chassis_windows.c b/src/detection/chassis/chassis_windows.c new file mode 100644 index 000000000..f80d0ff28 --- /dev/null +++ b/src/detection/chassis/chassis_windows.c @@ -0,0 +1,20 @@ +#include "chassis.h" +#include "util/windows/registry.h" + +const char* ffDetectChassis(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 chassisType = 0; + if(!ffRegReadUint(hKey, L"EnclosureType", &chassisType, NULL)) + return "\"HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\BIOS\\EnclosureType\" doesn't exist"; + + const char* chassisTypeStr = ffChassisTypeToString(chassisType); + if(!chassisTypeStr) + return "Unknown chassis type"; + + ffStrbufAppendS(&result->chassisType, chassisTypeStr); + return NULL; +}