2 * PROJECT: ReactOS DMI/SMBIOS Library
3 * LICENSE: GPL - See COPYING in the top level directory
5 * PURPOSE: SMBIOS table parsing functions
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
7 * REFERENCES: http://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.0.0.pdf
15 _In_ PDMI_HEADER Header
,
16 _In_ ULONG FieldOffset
)
21 StringIndex
= ((PUCHAR
)Header
)[FieldOffset
];
27 String
= (PCHAR
)Header
+ Header
->Length
;
29 while (--StringIndex
!= 0)
42 _In_reads_bytes_(TableSize
) PVOID SMBiosTables
,
44 _Inout_updates_(ID_STRINGS_MAX
) PCHAR
* Strings
)
46 PMSSmBios_RawSMBiosTables BiosTablesHeader
= SMBiosTables
;
51 Header
= (PDMI_HEADER
)(&BiosTablesHeader
->SMBiosData
);
52 Remaining
= BiosTablesHeader
->Size
;
54 while (Remaining
>= sizeof(*Header
))
56 if (Header
->Type
== DMI_ENTRY_END_OF_TABLE
)
62 if (Remaining
< DMI_BIOS_SIZE
)
64 Strings
[BIOS_VENDOR
] = GetDmiString(Header
, DMI_BIOS_VENDOR
);
65 Strings
[BIOS_VERSION
] = GetDmiString(Header
, DMI_BIOS_VERSION
);
66 Strings
[BIOS_DATE
] = GetDmiString(Header
, DMI_BIOS_DATE
);
69 case DMI_ENTRY_SYSTEM
:
70 if (Remaining
< DMI_SYS_SIZE
)
72 Strings
[SYS_VENDOR
] = GetDmiString(Header
, DMI_SYS_VENDOR
);
73 Strings
[SYS_PRODUCT
] = GetDmiString(Header
, DMI_SYS_PRODUCT
);
74 Strings
[SYS_VERSION
] = GetDmiString(Header
, DMI_SYS_VERSION
);
75 Strings
[SYS_SERIAL
] = GetDmiString(Header
, DMI_SYS_SERIAL
);
76 Strings
[SYS_SKU
] = GetDmiString(Header
, DMI_SYS_SKU
);
77 Strings
[SYS_FAMILY
] = GetDmiString(Header
, DMI_SYS_FAMILY
);
80 case DMI_ENTRY_BASEBOARD
:
81 if (Remaining
< DMI_BOARD_SIZE
)
83 Strings
[BOARD_VENDOR
] = GetDmiString(Header
, DMI_BOARD_VENDOR
);
84 Strings
[BOARD_NAME
] = GetDmiString(Header
, DMI_BOARD_NAME
);
85 Strings
[BOARD_VERSION
] = GetDmiString(Header
, DMI_BOARD_VERSION
);
86 Strings
[BOARD_SERIAL
] = GetDmiString(Header
, DMI_BOARD_SERIAL
);
87 Strings
[BOARD_ASSET_TAG
] = GetDmiString(Header
, DMI_BOARD_ASSET_TAG
);
90 case DMI_ENTRY_CHASSIS
:
91 case DMI_ENTRY_ONBOARD_DEVICE
:
92 case DMI_ENTRY_OEMSTRINGS
:
93 // DMI_ENTRY_IPMI_DEV?
94 // DMI_ENTRY_ONBOARD_DEV_EXT?
98 Remaining
-= Header
->Length
;
99 Data
= (PCHAR
)Header
+ Header
->Length
;
101 /* Now loop until we find 2 zeroes */
102 while ((Remaining
>= 2) && ((Data
[0] != 0) || (Data
[1] != 0)))
111 /* Go to the next header */
113 Header
= (PDMI_HEADER
)((PUCHAR
)Data
+ 2);