master ohmu/fastfetch-openbsd / src / detection / chassis / chassis_windows.c
ohmu  ·  2026-10-15
 1#include "chassis.h"
 2#include "common/debug.h"
 3#include "common/smbios.h"
 4
 5// 7.4
 6typedef struct [[gnu::packed]] FFSmbiosSystemEnclosure {
 7    FFSmbiosHeader Header;
 8
 9    uint8_t Manufacturer;   // string
10    uint8_t Type;           // varies
11    uint8_t Version;        // string
12    uint8_t SerialNumber;   // string
13    uint8_t AssetTagNumber; // string
14
15    // 2.1+
16    uint8_t BootupState;      // enum
17    uint8_t PowerSupplyState; // enum
18    uint8_t ThermalState;     // enum
19    uint8_t SecurityStatus;   // enum
20
21    // 2.3+
22    uint32_t OEMDefined;           // varies
23    uint8_t Height;                // varies
24    uint8_t NumberOfPowerCords;    // varies
25    uint8_t ContainedElementCount; // varies
26    uint8_t ContainedRecordLength; // varies
27    uint8_t ContainedElements[];   // varies
28} FFSmbiosSystemEnclosure;
29
30static_assert(offsetof(FFSmbiosSystemEnclosure, ContainedElements) == 0x15,
31    "FFSmbiosSystemEnclosure: Wrong struct alignment");
32
33const char* ffDetectChassis(FFChassisResult* result) {
34    const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
35    if (!smbiosTable) {
36        FF_DEBUG("System enclosure: failed to get SMBIOS data");
37        return "Failed to get SMBIOS data";
38    }
39
40    const FFSmbiosSystemEnclosure* data = (const FFSmbiosSystemEnclosure*) (*smbiosTable)[FF_SMBIOS_TYPE_SYSTEM_ENCLOSURE];
41    if (!data) {
42        FF_DEBUG("System enclosure: section is not found in SMBIOS data");
43        return "System enclosure is not found in SMBIOS data";
44    }
45
46    const char* strings = (const char*) data + data->Header.Length;
47
48    ffStrbufSetStatic(&result->vendor, ffSmbiosLocateString(strings, data->Manufacturer));
49    ffCleanUpSmbiosValue(&result->vendor);
50    ffStrbufSetStatic(&result->serial, ffSmbiosLocateString(strings, data->SerialNumber));
51    ffCleanUpSmbiosValue(&result->serial);
52    ffStrbufSetStatic(&result->version, ffSmbiosLocateString(strings, data->Version));
53    ffCleanUpSmbiosValue(&result->version);
54    ffStrbufSetStatic(&result->type, ffChassisTypeToString(data->Type));
55
56    return nullptr;
57}