ReactOS  0.4.14-dev-606-g14ebc0b
dmilib.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS DMI/SMBIOS Library
3  * LICENSE: GPL - See COPYING in the top level directory
4  * FILE: dmilib.c
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
8  */
9 
10 #include "precomp.h"
11 
12 static
13 PCHAR
16  _In_ ULONG FieldOffset)
17 {
18  ULONG StringIndex;
19  PCHAR String;
20 
21  StringIndex = ((PUCHAR)Header)[FieldOffset];
22  if (StringIndex == 0)
23  {
24  return NULL;
25  }
26 
27  String = (PCHAR)Header + Header->Length;
28 
29  while (--StringIndex != 0)
30  {
31  while (*String != 0)
32  String++;
33 
34  String++;
35  }
36 
37  return String;
38 }
39 
40 VOID
42  _In_reads_bytes_(TableSize) PVOID SMBiosTables,
45 {
46  PMSSmBios_RawSMBiosTables BiosTablesHeader = SMBiosTables;
48  ULONG Remaining;
49  PCHAR Data;
50 
51  Header = (PDMI_HEADER)(&BiosTablesHeader->SMBiosData);
52  Remaining = BiosTablesHeader->Size;
53 
54  while (Remaining >= sizeof(*Header))
55  {
56  if (Header->Type == DMI_ENTRY_END_OF_TABLE)
57  break;
58 
59  switch (Header->Type)
60  {
61  case DMI_ENTRY_BIOS:
62  if (Remaining < DMI_BIOS_SIZE)
63  return;
67  break;
68 
69  case DMI_ENTRY_SYSTEM:
70  if (Remaining < DMI_SYS_SIZE)
71  return;
78  break;
79 
81  if (Remaining < DMI_BOARD_SIZE)
82  return;
88  break;
89 
90  case DMI_ENTRY_CHASSIS:
93  // DMI_ENTRY_IPMI_DEV?
94  // DMI_ENTRY_ONBOARD_DEV_EXT?
95  break;
96  }
97 
98  Remaining -= Header->Length;
99  Data = (PCHAR)Header + Header->Length;
100 
101  /* Now loop until we find 2 zeroes */
102  while ((Remaining >= 2) && ((Data[0] != 0) || (Data[1] != 0)))
103  {
104  Data++;
105  Remaining--;
106  }
107 
108  if (Remaining < 2)
109  break;
110 
111  /* Go to the next header */
112  Remaining -= 2;
113  Header = (PDMI_HEADER)((PUCHAR)Data + 2);
114  }
115 }
signed char * PCHAR
Definition: retypes.h:7
Definition: dmilib.h:22
VOID ParseSMBiosTables(_In_reads_bytes_(TableSize) PVOID SMBiosTables, _In_ ULONG TableSize, _Inout_updates_(ID_STRINGS_MAX) PCHAR *Strings)
Definition: dmilib.c:41
unsigned char * PUCHAR
Definition: retypes.h:3
struct _DMI_HEADER * PDMI_HEADER
static WCHAR String[]
Definition: stringtable.c:55
while(1)
Definition: macro.lex.yy.c:740
Definition: Header.h:8
smooth NULL
Definition: ftsmooth.c:416
_In_ LPGUID _In_ PVOID Data
Definition: classpnp.h:778
#define PCHAR
Definition: match.c:90
static const WCHAR Strings[]
Definition: reg.c:35
#define _In_reads_bytes_(size)
Definition: no_sal2.h:229
#define _In_
Definition: no_sal2.h:204
static PCHAR GetDmiString(_In_ PDMI_HEADER Header, _In_ ULONG FieldOffset)
Definition: dmilib.c:14
_In_ ULONG _In_ ULONG _Inout_updates_(8 *8) ULONG *pul)
Definition: winddi.h:3522
_Must_inspect_result_ typedef _Out_ PULONG TableSize
Definition: iotypes.h:3971
unsigned int ULONG
Definition: retypes.h:1