2023-06-22 10:45:43 +00:00
|
|
|
#include "smbiosHelper.h"
|
2023-12-23 00:06:37 +08:00
|
|
|
#include "common/io/io.h"
|
2023-06-22 10:45:43 +00:00
|
|
|
|
|
|
|
|
bool ffIsSmbiosValueSet(FFstrbuf* value)
|
|
|
|
|
{
|
|
|
|
|
return
|
|
|
|
|
value->length > 0 &&
|
|
|
|
|
!ffStrbufStartsWithIgnCaseS(value, "To be filled") &&
|
|
|
|
|
!ffStrbufStartsWithIgnCaseS(value, "To be set") &&
|
|
|
|
|
!ffStrbufStartsWithIgnCaseS(value, "OEM") &&
|
|
|
|
|
!ffStrbufStartsWithIgnCaseS(value, "O.E.M.") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "None") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "System Product") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "System Product Name") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "System Product Version") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "System Name") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "System Version") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "Default string") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "Undefined") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "Not Specified") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "Not Applicable") &&
|
2023-12-17 09:10:11 +08:00
|
|
|
!ffStrbufIgnCaseEqualS(value, "Not Defined") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "Not Available") &&
|
2023-06-22 10:45:43 +00:00
|
|
|
!ffStrbufIgnCaseEqualS(value, "INVALID") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "Type1ProductConfigId") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "All Series") &&
|
|
|
|
|
!ffStrbufIgnCaseEqualS(value, "N/A")
|
|
|
|
|
;
|
|
|
|
|
}
|
2023-12-23 00:06:37 +08:00
|
|
|
|
|
|
|
|
#ifdef __linux__
|
|
|
|
|
void ffGetSmbiosValue(const char* devicesPath, const char* classPath, FFstrbuf* buffer)
|
|
|
|
|
{
|
|
|
|
|
if (ffReadFileBuffer(devicesPath, buffer))
|
|
|
|
|
{
|
|
|
|
|
ffStrbufTrimRightSpace(buffer);
|
|
|
|
|
if(ffIsSmbiosValueSet(buffer))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ffReadFileBuffer(classPath, buffer))
|
|
|
|
|
{
|
|
|
|
|
ffStrbufTrimRightSpace(buffer);
|
|
|
|
|
if(ffIsSmbiosValueSet(buffer))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ffStrbufClear(buffer);
|
|
|
|
|
}
|
2024-01-06 00:41:02 +08:00
|
|
|
#elif defined(_WIN32)
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
|
|
#pragma GCC diagnostic ignored "-Wmultichar"
|
|
|
|
|
|
2024-01-06 14:46:54 +08:00
|
|
|
const FFSmbiosHeader* ffSmbiosNextEntry(const FFSmbiosHeader* header)
|
|
|
|
|
{
|
|
|
|
|
const char* p = ((const char*) header) + header->Length;
|
|
|
|
|
if (*p)
|
|
|
|
|
{
|
|
|
|
|
do
|
|
|
|
|
p += strlen(p) + 1;
|
|
|
|
|
while (*p);
|
|
|
|
|
}
|
|
|
|
|
else // The terminator is always double 0 even if there is no string
|
|
|
|
|
p ++;
|
|
|
|
|
|
|
|
|
|
return (const FFSmbiosHeader*) (p + 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const FFSmbiosHeaderTable* ffGetSmbiosHeaderTable()
|
2024-01-06 00:41:02 +08:00
|
|
|
{
|
|
|
|
|
static FFRawSmbiosData* buffer;
|
2024-01-06 14:46:54 +08:00
|
|
|
static FFSmbiosHeaderTable table;
|
|
|
|
|
|
2024-01-06 00:41:02 +08:00
|
|
|
if (!buffer)
|
|
|
|
|
{
|
|
|
|
|
const DWORD signature = 'RSMB';
|
|
|
|
|
uint32_t bufSize = GetSystemFirmwareTable(signature, 0, NULL, 0);
|
|
|
|
|
assert(bufSize > sizeof(FFRawSmbiosData));
|
|
|
|
|
buffer = (FFRawSmbiosData*) malloc(bufSize);
|
2024-01-06 14:46:54 +08:00
|
|
|
assert(buffer);
|
2024-01-06 17:07:36 +08:00
|
|
|
uint32_t resultSize = GetSystemFirmwareTable(signature, 0, buffer, bufSize);
|
|
|
|
|
assert(resultSize == bufSize);
|
2024-01-06 14:46:54 +08:00
|
|
|
|
|
|
|
|
for (
|
|
|
|
|
const FFSmbiosHeader* header = (const FFSmbiosHeader*) buffer->SMBIOSTableData;
|
|
|
|
|
(const uint8_t*) header < buffer->SMBIOSTableData + buffer->Length;
|
|
|
|
|
header = ffSmbiosNextEntry(header)
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
if (header->Type < FF_SMBIOS_TYPE_END_OF_TABLE)
|
|
|
|
|
{
|
|
|
|
|
if (!table[header->Type])
|
|
|
|
|
table[header->Type] = header;
|
|
|
|
|
}
|
|
|
|
|
else if (header->Type == FF_SMBIOS_TYPE_END_OF_TABLE)
|
|
|
|
|
break;
|
|
|
|
|
}
|
2024-01-06 00:41:02 +08:00
|
|
|
}
|
2024-01-06 14:46:54 +08:00
|
|
|
|
|
|
|
|
return &table;
|
2024-01-06 00:41:02 +08:00
|
|
|
}
|
2023-12-23 00:06:37 +08:00
|
|
|
#endif
|