[I8042PRT] Move DMI/SMBIOS parsing functions into library

This commit is contained in:
Stanislav Motylkov 2018-07-31 00:22:35 +03:00 committed by Mark Jansen
parent d956eafda8
commit 0854c69a75
8 changed files with 179 additions and 116 deletions

View file

@ -18,6 +18,7 @@ if(MSVC)
endif()
add_subdirectory(delayimp)
add_subdirectory(dmilib)
#add_subdirectory(dnslib) Nothing links to this lib.
add_subdirectory(drivers)
add_subdirectory(dxguid)

View file

@ -0,0 +1,8 @@
list(APPEND SOURCE
dmilib.c
precomp.h)
add_library(dmilib ${SOURCE})
add_pch(dmilib precomp.h SOURCE)
add_dependencies(dmilib psdk)

109
sdk/lib/dmilib/dmi.h Normal file
View file

@ -0,0 +1,109 @@
/*
* PROJECT: ReactOS DMI/SMBIOS Library
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dmi.h
* PURPOSE: SMBIOS table parsing functions
* PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
#pragma once
enum DMI_DEVICE_TYPE
{
DMI_DEV_TYPE_ANY = 0,
DMI_DEV_TYPE_OTHER,
DMI_DEV_TYPE_UNKNOWN,
DMI_DEV_TYPE_VIDEO,
DMI_DEV_TYPE_SCSI,
DMI_DEV_TYPE_ETHERNET,
DMI_DEV_TYPE_TOKENRING,
DMI_DEV_TYPE_SOUND,
DMI_DEV_TYPE_PATA,
DMI_DEV_TYPE_SATA,
DMI_DEV_TYPE_SAS,
DMI_DEV_TYPE_IPMI = -1,
DMI_DEV_TYPE_OEM_STRING = -2,
DMI_DEV_TYPE_DEV_ONBOARD = -3,
};
enum DMI_ENTRY_TYPE
{
DMI_ENTRY_BIOS = 0,
DMI_ENTRY_SYSTEM = 1,
DMI_ENTRY_BASEBOARD = 2,
DMI_ENTRY_CHASSIS = 3,
DMI_ENTRY_PROCESSOR = 4,
DMI_ENTRY_MEM_CONTROLLER = 5,
DMI_ENTRY_MEM_MODULE = 6,
DMI_ENTRY_CACHE = 7,
DMI_ENTRY_PORT_CONNECTOR = 8,
DMI_ENTRY_SYSTEM_SLOT = 9,
DMI_ENTRY_ONBOARD_DEVICE = 10,
DMI_ENTRY_OEMSTRINGS = 11,
DMI_ENTRY_SYSCONF = 12,
DMI_ENTRY_BIOS_LANG = 13,
DMI_ENTRY_GROUP_ASSOC = 14,
DMI_ENTRY_SYSTEM_EVENT_LOG = 15,
DMI_ENTRY_PHYS_MEM_ARRAY = 16,
DMI_ENTRY_MEM_DEVICE = 17,
DMI_ENTRY_32_MEM_ERROR = 18,
DMI_ENTRY_MEM_ARRAY_MAPPED_ADDR = 19,
DMI_ENTRY_MEM_DEV_MAPPED_ADDR = 20,
DMI_ENTRY_BUILTIN_POINTING_DEV,
DMI_ENTRY_PORTABLE_BATTERY,
DMI_ENTRY_SYSTEM_RESET,
DMI_ENTRY_HW_SECURITY,
DMI_ENTRY_SYSTEM_POWER_CONTROLS = 25,
DMI_ENTRY_VOLTAGE_PROBE,
DMI_ENTRY_COOLING_DEV,
DMI_ENTRY_TEMP_PROBE,
DMI_ENTRY_ELECTRICAL_CURRENT_PROBE,
DMI_ENTRY_OOB_REMOTE_ACCESS = 30,
DMI_ENTRY_BIS_ENTRY,
DMI_ENTRY_SYSTEM_BOOT = 32,
DMI_ENTRY_MGMT_DEV,
DMI_ENTRY_MGMT_DEV_COMPONENT,
DMI_ENTRY_MGMT_DEV_THRES = 35,
DMI_ENTRY_MEM_CHANNEL = 36,
DMI_ENTRY_IPMI_DEV = 37,
DMI_ENTRY_SYS_POWER_SUPPLY = 38,
DMI_ENTRY_ADDITIONAL = 39,
DMI_ENTRY_ONBOARD_DEV_EXT = 40,
DMI_ENTRY_MGMT_CONTROLLER_HOST = 41,
DMI_ENTRY_INACTIVE = 126,
DMI_ENTRY_END_OF_TABLE = 127,
};
enum _DMI_FIELD_OFFSETS
{
/* Type = 0: DMI_ENTRY_BIOS */
DMI_BIOS_VENDOR = 0x04,
DMI_BIOS_VERSION = 0x05,
DMI_BIOS_DATE = 0x08,
DMI_BIOS_SIZE = 0x14,
/* Type = 1: DMI_ENTRY_SYSTEM */
DMI_SYS_VENDOR = 0x04,
DMI_SYS_PRODUCT = 0x05,
DMI_SYS_VERSION = 0x06,
DMI_SYS_SERIAL = 0x07,
DMI_SYS_SIZE = 0x1b,
/* Type = 2: DMI_ENTRY_BASEBOARD */
DMI_BOARD_VENDOR = 0x04,
DMI_BOARD_NAME = 0x05,
DMI_BOARD_VERSION = 0x06,
DMI_BOARD_SERIAL = 0x07,
DMI_BOARD_ASSET_TAG = 0x08,
DMI_BOARD_SIZE = 0x10,
};
typedef struct _DMI_HEADER
{
UCHAR Type;
UCHAR Length;
USHORT Handle;
} DMI_HEADER, *PDMI_HEADER;

113
sdk/lib/dmilib/dmilib.c Normal file
View file

@ -0,0 +1,113 @@
/*
* PROJECT: ReactOS DMI/SMBIOS Library
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dmilib.c
* PURPOSE: SMBIOS table parsing functions
* PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
* REFERENCES: http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
*/
#include "precomp.h"
static
PCHAR
GetDmiString(
_In_ PDMI_HEADER Header,
_In_ ULONG FieldOffset)
{
ULONG StringIndex;
PCHAR String;
StringIndex = ((PUCHAR)Header)[FieldOffset];
if (StringIndex == 0)
{
return NULL;
}
String = (PCHAR)Header + Header->Length;
while (--StringIndex != 0)
{
while (*String != 0)
String++;
String++;
}
return String;
}
VOID
ParseSMBiosTables(
_In_reads_bytes_(TableSize) PVOID SMBiosTables,
_In_ ULONG TableSize,
_Inout_updates_(ID_STRINGS_MAX) PCHAR * Strings)
{
PMSSmBios_RawSMBiosTables BiosTablesHeader = SMBiosTables;
PDMI_HEADER Header;
ULONG Remaining;
PCHAR Data;
Header = (PDMI_HEADER)(&BiosTablesHeader->SMBiosData);
Remaining = BiosTablesHeader->Size;
while (Remaining >= sizeof(*Header))
{
if (Header->Type == DMI_ENTRY_END_OF_TABLE)
break;
switch (Header->Type)
{
case DMI_ENTRY_BIOS:
if (Remaining < DMI_BIOS_SIZE)
return;
Strings[BIOS_VENDOR] = GetDmiString(Header, DMI_BIOS_VENDOR);
Strings[BIOS_VERSION] = GetDmiString(Header, DMI_BIOS_VERSION);
Strings[BIOS_DATE] = GetDmiString(Header, DMI_BIOS_DATE);
break;
case DMI_ENTRY_SYSTEM:
if (Remaining < DMI_SYS_SIZE)
return;
Strings[SYS_VENDOR] = GetDmiString(Header, DMI_SYS_VENDOR);
Strings[SYS_PRODUCT] = GetDmiString(Header, DMI_SYS_PRODUCT);
Strings[SYS_VERSION] = GetDmiString(Header, DMI_SYS_VERSION);
Strings[SYS_SERIAL] = GetDmiString(Header, DMI_SYS_SERIAL);
break;
case DMI_ENTRY_BASEBOARD:
if (Remaining < DMI_BOARD_SIZE)
return;
Strings[BOARD_VENDOR] = GetDmiString(Header, DMI_BOARD_VENDOR);
Strings[BOARD_NAME] = GetDmiString(Header, DMI_BOARD_NAME);
Strings[BOARD_VERSION] = GetDmiString(Header, DMI_BOARD_VERSION);
Strings[BOARD_SERIAL] = GetDmiString(Header, DMI_BOARD_SERIAL);
Strings[BOARD_ASSET_TAG] = GetDmiString(Header, DMI_BOARD_ASSET_TAG);
break;
case DMI_ENTRY_CHASSIS:
case DMI_ENTRY_ONBOARD_DEVICE:
case DMI_ENTRY_OEMSTRINGS:
// DMI_ENTRY_IPMI_DEV?
// DMI_ENTRY_ONBOARD_DEV_EXT?
break;
}
Remaining -= Header->Length;
Data = (PCHAR)Header + Header->Length;
/* Now loop until we find 2 zeroes */
while ((Remaining >= 2) && ((Data[0] != 0) || (Data[1] != 0)))
{
Data++;
Remaining--;
}
if (Remaining < 2)
break;
/* Go to the next header */
Remaining -= 2;
Header = (PDMI_HEADER)((PUCHAR)Data + 2);
}
}

34
sdk/lib/dmilib/dmilib.h Normal file
View file

@ -0,0 +1,34 @@
/*
* PROJECT: ReactOS DMI/SMBIOS Library
* LICENSE: GPL - See COPYING in the top level directory
* FILE: dmilib.h
* PURPOSE: SMBIOS table parsing functions
* PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
*/
#pragma once
enum _ID_STRINGS
{
ID_NONE = 0,
BIOS_VENDOR,
BIOS_VERSION,
BIOS_DATE,
SYS_VENDOR,
SYS_PRODUCT,
SYS_VERSION,
SYS_SERIAL,
BOARD_VENDOR,
BOARD_NAME,
BOARD_VERSION,
BOARD_SERIAL,
BOARD_ASSET_TAG,
ID_STRINGS_MAX,
};
VOID
ParseSMBiosTables(
_In_reads_bytes_(TableSize) PVOID SMBiosTables,
_In_ ULONG TableSize,
_Inout_updates_(ID_STRINGS_MAX) PCHAR * Strings);

9
sdk/lib/dmilib/precomp.h Normal file
View file

@ -0,0 +1,9 @@
#ifndef _DMILIB_PCH_
#define _DMILIB_PCH_
#include <ntdef.h>
#include <wmidata.h>
#include "dmi.h"
#include "dmilib.h"
#endif /* _DMILIB_PCH_ */