summaryrefslogtreecommitdiffstats
path: root/src/detection/board/board_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/detection/board/board_windows.c')
-rw-r--r--src/detection/board/board_windows.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/detection/board/board_windows.c b/src/detection/board/board_windows.c
new file mode 100644
index 0000000..079e64d
--- /dev/null
+++ b/src/detection/board/board_windows.c
@@ -0,0 +1,46 @@
+#include "board.h"
+#include "common/smbios.h"
+
+typedef struct FFSmbiosBaseboard {
+ FFSmbiosHeader Header;
+
+ uint8_t Manufacturer; // string
+ uint8_t Product; // string
+ uint8_t Version; // string
+ uint8_t SerialNumber; // string
+ uint8_t AssetTag; // string
+ uint8_t FeatureFlags; // bit field
+ uint8_t LocationInChassis; // string
+ uint16_t ChassisHandle; // varies
+ uint8_t BoardType; // enum
+ uint8_t NumberOfContainedObjectHandles; // varies
+ uint16_t ContainedObjectHandles[]; // varies
+} FF_A_PACKED FFSmbiosBaseboard;
+
+static_assert(offsetof(FFSmbiosBaseboard, ContainedObjectHandles) == 0x0F,
+ "FFSmbiosBaseboard: Wrong struct alignment");
+
+const char* ffDetectBoard(FFBoardResult* board) {
+ const FFSmbiosHeaderTable* smbiosTable = ffGetSmbiosHeaderTable();
+ if (!smbiosTable) {
+ return "Failed to get SMBIOS data";
+ }
+
+ const FFSmbiosBaseboard* data = (const FFSmbiosBaseboard*) (*smbiosTable)[FF_SMBIOS_TYPE_BASEBOARD_INFO];
+ if (!data) {
+ return "Baseboard information section is not found in SMBIOS data";
+ }
+
+ const char* strings = (const char*) data + data->Header.Length;
+
+ ffStrbufSetStatic(&board->name, ffSmbiosLocateString(strings, data->Product));
+ ffCleanUpSmbiosValue(&board->name);
+ ffStrbufSetStatic(&board->serial, ffSmbiosLocateString(strings, data->SerialNumber));
+ ffCleanUpSmbiosValue(&board->serial);
+ ffStrbufSetStatic(&board->vendor, ffSmbiosLocateString(strings, data->Manufacturer));
+ ffCleanUpSmbiosValue(&board->vendor);
+ ffStrbufSetStatic(&board->version, ffSmbiosLocateString(strings, data->Version));
+ ffCleanUpSmbiosValue(&board->version);
+
+ return NULL;
+}