summaryrefslogtreecommitdiff
path: root/MdePkg/Include/IndustryStandard/SmBios.h
blob: 4926e5c8b2849c79971edc05a7c35472fd10e861 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
/** @file
  Industry Standard Definitions of SMBIOS Table Specification v2.6

  Copyright (c) 2006 - 2008, Intel Corporation All rights
  reserved. This program and the accompanying materials are
  licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at        
  http://opensource.org/licenses/bsd-license.php                                            

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

**/

#ifndef __SMBIOS_STANDARD_H__
#define __SMBIOS_STANDARD_H__
///
/// Smbios Table Entry Point Structure
///
typedef struct {
  UINT8   AnchorString[4];
  UINT8   EntryPointStructureChecksum;
  UINT8   EntryPointLength;
  UINT8   MajorVersion;
  UINT8   MinorVersion;
  UINT16  MaxStructureSize;
  UINT8   EntryPointRevision;
  UINT8   FormattedArea[5];
  UINT8   IntermediateAnchorString[5];
  UINT8   IntermediateChecksum;
  UINT16  TableLength;
  UINT32  TableAddress;
  UINT16  NumberOfSmbiosStructures;
  UINT8   SmbiosBcdRevision;
} SMBIOS_TABLE_ENTRY_POINT;

///
/// The Smbios structure header
///
typedef struct {
  UINT8   Type;
  UINT8   Length;
  UINT16  Handle;
} SMBIOS_STRUCTURE;

typedef UINT8 SMBIOS_TABLE_STRING;

#pragma pack(1)
///
/// BIOS Information (Type 0)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Vendor;
  SMBIOS_TABLE_STRING   BiosVersion;
  UINT16                BiosSegment;
  SMBIOS_TABLE_STRING   BiosReleaseDate;
  UINT8                 BiosSize;
  UINT64                BiosCharacteristics;
  UINT8                 BIOSCharacteristicsExtensionBytes[2];
  UINT8                 SystemBiosMajorRelease;
  UINT8                 SystemBiosMinorRelease;
  UINT8                 EmbeddedControllerFirmwareMajorRelease;
  UINT8                 EmbeddedControllerFirmwareMinorRelease;
} SMBIOS_TABLE_TYPE0;
#pragma pack()

///
/// System Information (Type 1)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Manufacturer;
  SMBIOS_TABLE_STRING   ProductName;
  SMBIOS_TABLE_STRING   Version;
  SMBIOS_TABLE_STRING   SerialNumber;
  EFI_GUID              Uuid;
  UINT8                 WakeUpType;
  SMBIOS_TABLE_STRING   SKUNumber;
  SMBIOS_TABLE_STRING   Family;
} SMBIOS_TABLE_TYPE1;

#pragma pack(1)
///
/// Base Board (or Module) Information (Type 2)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Manufacturer;
  SMBIOS_TABLE_STRING   ProductName;
  SMBIOS_TABLE_STRING   Version;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   AssetTag;
  UINT8                 FeatureFlag;
  SMBIOS_TABLE_STRING   LocationInChassis;
  UINT16                ChassisHandle;
  UINT8                 BoardType;
  UINT8                 NumberOfContainedObjectHandles;
  UINT16                ContainedObjectHandles[1];
} SMBIOS_TABLE_TYPE2;
#pragma pack()

typedef struct {
  UINT8                 ContainedElementType;
  UINT8                 ContainedElementMinimum;
  UINT8                 ContainedElementMaximum;
} CONTAINED_ELEMENT;

///
/// System Enclosure or Chassis (Type 3)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Manufacturer;
  UINT8                 Type;
  SMBIOS_TABLE_STRING   Version;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   AssetTag;
  UINT8                 BootupState;
  UINT8                 PowerSupplyState;
  UINT8                 ThermalState;
  UINT8                 SecurityStatus;
  UINT8                 OemDefined[4];
  UINT8                 Height;
  UINT8                 NumberofPowerCords;
  UINT8                 ContainedElementCount;
  UINT8                 ContainedElementRecordLength;
  CONTAINED_ELEMENT     ContainedElements[1];
} SMBIOS_TABLE_TYPE3;

///
/// Processor Information (Type 4)
///
typedef struct { 
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Socket;
  UINT8                 ProcessorType;
  UINT8                 ProcessorFamily;
  SMBIOS_TABLE_STRING   ProcessorManufacture;
  UINT8                 ProcessorId[8];
  SMBIOS_TABLE_STRING   ProcessorVersion;
  UINT8                 Voltage;
  UINT16                ExternalClock;
  UINT16                MaxSpeed;
  UINT16                CurrentSpeed;
  UINT8                 Status;
  UINT8                 ProcessorUpgrade;
  UINT16                L1CacheHandle;
  UINT16                L2CacheHandle;
  UINT16                L3CacheHandle;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   AssetTag;
  SMBIOS_TABLE_STRING   PartNumber;
  //
  // Add for smbios 2.5
  //
  UINT8                 CoreCount;
  UINT8                 EnabledCoreCount;
  UINT8                 ThreadCount;
  UINT16                ProcessorCharacteristics;
  //
  // Add for smbios 2.6
  //
  UINT16                ProcessorFamily2;
} SMBIOS_TABLE_TYPE4;

#pragma pack(1)
///
/// Memory Controller Information (Type 5, Obsolete)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 ErrDetectMethod;
  UINT8                 ErrCorrectCapability;
  UINT8                 SupportInterleave;
  UINT8                 CurrentInterleave;
  UINT8                 MaxMemoryModuleSize;
  UINT16                SupportSpeed;
  UINT16                SupportMemoryType;
  UINT8                 MemoryModuleVoltage;
  UINT8                 AssociatedMemorySlotNum;
  UINT16                MemoryModuleConfigHandles[1];
} SMBIOS_TABLE_TYPE5;

///
/// Memory Module Information (Type 6, Obsolete)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   SocketDesignation;
  UINT8                 BankConnections;
  UINT8                 CurrentSpeed;
  UINT16                CurrentMemoryType;
  UINT8                 InstalledSize;
  UINT8                 EnabledSize;
  UINT8                 ErrorStatus;
} SMBIOS_TABLE_TYPE6;

///
/// Cache Information (Type 7)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   SocketDesignation;
  UINT16                CacheConfiguration;
  UINT16                MaximumCacheSize;
  UINT16                InstalledSize;
  UINT16                SupportedSRAMType;
  UINT16                CurrentSRAMType;
  UINT8                 CacheSpeed;
  UINT8                 ErrorCorrectionType;
  UINT8                 SystemCacheType;
  UINT8                 Associativity;
} SMBIOS_TABLE_TYPE7;
#pragma pack()

///
/// Port Connector Information (Type 8)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   InternalReferenceDesignator;
  UINT8                 InternalConnectorType;
  SMBIOS_TABLE_STRING   ExternalReferenceDesignator;
  UINT8                 ExternalConnectorType;
  UINT8                 PortType;
} SMBIOS_TABLE_TYPE8;

#pragma pack(1)
///
/// System Slots (Type 9)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   SlotDesignation;
  UINT8                 SlotType;
  UINT8                 SlotDataBusWidth;
  UINT8                 CurrentUsage;
  UINT8                 SlotLength;
  UINT16                SlotID;
  UINT8                 SlotCharacteristics1;
  UINT8                 SlotCharacteristics2;
  //
  // Add for smbios 2.6
  //
  UINT16                SegmentGroupNum;
  UINT8                 BusNum;
  UINT8                 DevFuncNum;
} SMBIOS_TABLE_TYPE9;
#pragma pack()

typedef struct {
  UINT8                 DeviceType;
  SMBIOS_TABLE_STRING   DescriptionString;
} DEVICE_STRUCT;

///
/// On Board Devices Information (Type 10, obsolete)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  DEVICE_STRUCT         Device[1];
} SMBIOS_TABLE_TYPE10;

///
/// OEM Strings (Type 11)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 StringCount;
} SMBIOS_TABLE_TYPE11;

///
/// System Configuration Options (Type 12)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 StringCount;
} SMBIOS_TABLE_TYPE12;

///
/// BIOS Language Information (Type 13)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 InstallableLanguages;
  UINT8                 Flags;
  UINT8                 reserved[15];
  SMBIOS_TABLE_STRING   CurrentLanguages;
} SMBIOS_TABLE_TYPE13;

#pragma pack(1)
typedef struct {
  UINT8                 ItemType;
  UINT16                ItemHandle;
} GROUP_STRUCT;

///
/// Group Associations (Type 14)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   GroupName;
  GROUP_STRUCT          Group[1];
} SMBIOS_TABLE_TYPE14;

typedef struct {
  UINT8                 LogType;
  UINT8                 DataFormatType;
} EVENT_LOG_TYPE;

///
/// System Event Log (Type 15)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT16                LogAreaLength;
  UINT16                LogHeaderStartOffset;
  UINT16                LogDataStartOffset;
  UINT8                 AccessMethod;
  UINT8                 LogStatus;
  UINT32                LogChangeToken;
  UINT32                AccessMethodAddress;
  UINT8                 LogHeaderFormat;
  UINT8                 NumberOfSupportedLogTypeDescriptors;
  UINT8                 LengthOfLogTypeDescriptor;
  EVENT_LOG_TYPE        EventLogTypeDescriptors[1];
} SMBIOS_TABLE_TYPE15;

///
/// Physical Memory Array (Type 16)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Location;
  UINT8                 Use;
  UINT8                 MemoryErrorCorrection;
  UINT32                MaximumCapacity;
  UINT16                MemoryErrorInformationHandle;
  UINT16                NumberOfMemoryDevices;
} SMBIOS_TABLE_TYPE16;

///
/// Memory Device (Type 17)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT16                MemoryArrayHandle;
  UINT16                MemoryErrorInformationHandle;
  UINT16                TotalWidth;
  UINT16                DataWidth;
  UINT16                Size;
  UINT8                 FormFactor;
  UINT8                 DeviceSet;
  SMBIOS_TABLE_STRING   DeviceLocator;
  SMBIOS_TABLE_STRING   BankLocator;
  UINT8                 MemoryType;
  UINT16                TypeDetail;
  UINT16                Speed;
  SMBIOS_TABLE_STRING   Manufacturer;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   AssetTag;
  SMBIOS_TABLE_STRING   PartNumber;
  //
  // Add for smbios 2.6
  //  
  UINT8                 Attributes;
} SMBIOS_TABLE_TYPE17;

///
/// 32-bit Memory Error Information (Type 18)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 ErrorType;
  UINT8                 ErrorGranularity;
  UINT8                 ErrorOperation;
  UINT32                VendorSyndrome;
  UINT32                MemoryArrayErrorAddress;
  UINT32                DeviceErrorAddress;
  UINT32                ErrorResolution;
} SMBIOS_TABLE_TYPE18;
#pragma pack()

///
/// Memory Array Mapped Address (Type 19)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT32                StartingAddress;
  UINT32                EndingAddress;
  UINT16                MemoryArrayHandle;
  UINT8                 PartitionWidth;
} SMBIOS_TABLE_TYPE19;

///
/// Memory Device Mapped Address (Type 20)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT32                StartingAddress;
  UINT32                EndingAddress;
  UINT16                MemoryDeviceHandle;
  UINT16                MemoryArrayMappedAddressHandle;
  UINT8                 PartitionRowPosition;
  UINT8                 InterleavePosition;
  UINT8                 InterleavedDataDepth;
} SMBIOS_TABLE_TYPE20;

///
/// Built-in Pointing Device (Type 21)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Type;
  UINT8                 Interface;
  UINT8                 NumberOfButtons;
} SMBIOS_TABLE_TYPE21;

#pragma pack(1)
///
/// Portable Battery (Type 22)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Location;
  SMBIOS_TABLE_STRING   Manufacturer;
  SMBIOS_TABLE_STRING   ManufactureDate;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   DeviceName;
  UINT8                 DeviceChemistry;
  UINT16                DeviceCapacity;
  UINT16                DesignVoltage;
  SMBIOS_TABLE_STRING   SBDSVersionNumber;
  UINT8                 MaximumErrorInBatteryData;
  UINT16                SBDSSerialNumber;
  UINT16                SBDSManufactureDate;
  SMBIOS_TABLE_STRING   SBDSDeviceChemistry;
  UINT8                 DesignCapacityMultiplier;
  UINT32                OEMSpecific;
} SMBIOS_TABLE_TYPE22;

///
/// System Reset (Type 23)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Capabilities;
  UINT16                ResetCount;
  UINT16                ResetLimit;
  UINT16                TimerInterval;
  UINT16                Timeout;
} SMBIOS_TABLE_TYPE23;
#pragma pack()

///
/// Hardware Security (Type 24)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 HardwareSecuritySettings;
} SMBIOS_TABLE_TYPE24;

///
/// System Power Controls (Type 25)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 NextScheduledPowerOnMonth;
  UINT8                 NextScheduledPowerOnDayOfMonth;
  UINT8                 NextScheduledPowerOnHour;
  UINT8                 NextScheduledPowerOnMinute;
  UINT8                 NextScheduledPowerOnSecond;
} SMBIOS_TABLE_TYPE25;

///
/// Voltage Probe (Type 26)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Description;
  UINT8                 LocationAndStatus;
  UINT16                MaximumValue;
  UINT16                MinimumValue;
  UINT16                Resolution;
  UINT16                Tolerance;
  UINT16                Accuracy;
  UINT32                OEMDefined;
  UINT16                NominalValue;
} SMBIOS_TABLE_TYPE26;

///
/// Cooling Device (Type 27)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT16                TemperatureProbeHandle;
  UINT8                 DeviceTypeAndStatus;
  UINT8                 CoolingUnitGroup;
  UINT32                OEMDefined;
  UINT16                NominalSpeed;
} SMBIOS_TABLE_TYPE27;

///
/// Temperature Probe (Type 28)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Description;
  UINT8                 LocationAndStatus;
  UINT16                MaximumValue;
  UINT16                MinimumValue;
  UINT16                Resolution;
  UINT16                Tolerance;
  UINT16                Accuracy;
  UINT32                OEMDefined;
  UINT16                NominalValue;
} SMBIOS_TABLE_TYPE28;

///
/// Electrical Current Probe (Type 29)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Description;
  UINT8                 LocationAndStatus;
  UINT16                MaximumValue;
  UINT16                MinimumValue;
  UINT16                Resolution;
  UINT16                Tolerance;
  UINT16                Accuracy;
  UINT32                OEMDefined;
  UINT16                NominalValue;
} SMBIOS_TABLE_TYPE29;

///
/// Out-of-Band Remote Access (Type 30)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   ManufacturerName;
  UINT8                 Connections;
} SMBIOS_TABLE_TYPE30;

///
/// Boot Integrity Services (BIS) Entry Point (Type 31)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Checksum;
  UINT8                 Reserved1;
  UINT16                Reserved2;
  UINT32                BisEntry16;
  UINT32                BisEntry32;
  UINT64                Reserved3;
  UINT32                Reserved4;
} SMBIOS_TABLE_TYPE31;

///
/// System Boot Information (Type 32)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 Reserved[6];
  UINT8                 BootStatus[1];
} SMBIOS_TABLE_TYPE32;

#pragma pack(1)
///
/// 64-bit Memory Error Information (Type 33)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 ErrorType;
  UINT8                 ErrorGranularity;
  UINT8                 ErrorOperation;
  UINT32                VendorSyndrome;
  UINT64                MemoryArrayErrorAddress;
  UINT64                DeviceErrorAddress;
  UINT32                ErrorResolution;
} SMBIOS_TABLE_TYPE33;

///
/// Management Device (Type 34)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Description;
  UINT8                 Type;
  UINT32                Address;
  UINT8                 AddressType;
} SMBIOS_TABLE_TYPE34;

///
/// Management Device Component (Type 35)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  SMBIOS_TABLE_STRING   Description;
  UINT16                ManagementDeviceHandle;
  UINT16                ComponentHandle;
  UINT16                ThresholdHandle;
} SMBIOS_TABLE_TYPE35;
#pragma pack()

///
/// Management Device Threshold Data (Type 36)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT16                LowerThresholdNonCritical;
  UINT16                UpperThresholdNonCritical;
  UINT16                LowerThresholdCritical;
  UINT16                UpperThresholdCritical;
  UINT16                LowerThresholdNonRecoverable;
  UINT16                UpperThresholdNonRecoverable;
} SMBIOS_TABLE_TYPE36;

#pragma pack(1)
typedef struct {
  UINT8                 DeviceLoad;
  UINT16                DeviceHandle;
} MEMORY_DEVICE;

///
/// Memory Channel (Type 37)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 ChannelType;
  UINT8                 MaximumChannelLoad;
  UINT8                 MemoryDeviceCount;
  MEMORY_DEVICE         MemoryDevice[1];
} SMBIOS_TABLE_TYPE37;
#pragma pack()

///
/// IPMI Device Information (Type 38)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 InterfaceType;
  UINT8                 IPMISpecificationRevision;
  UINT8                 I2CSlaveAddress;
  UINT8                 NVStorageDeviceAddress;
  UINT64                BaseAddress;
  UINT8                 BaseAddressModifier_InterruptInfo;
  UINT8                 InterruptNumber;
} SMBIOS_TABLE_TYPE38;

///
/// System Power Supply (Type 39)
///
typedef struct {
  SMBIOS_STRUCTURE      Hdr;
  UINT8                 PowerUnitGroup;
  SMBIOS_TABLE_STRING   Location;
  SMBIOS_TABLE_STRING   DeviceName;
  SMBIOS_TABLE_STRING   Manufacturer;
  SMBIOS_TABLE_STRING   SerialNumber;
  SMBIOS_TABLE_STRING   AssetTagNumber;
  SMBIOS_TABLE_STRING   ModelPartNumber;
  SMBIOS_TABLE_STRING   RevisionLevel;
  UINT16                MaxPowerCapacity;
  UINT16                PowerSupplyCharacteristics;
  UINT16                InputVoltageProbeHandle;
  UINT16                CoolingDeviceHandle;
  UINT16                InputCurrentProbeHandle;
} SMBIOS_TABLE_TYPE39;

#pragma pack(1)
typedef struct {                       
  UINT8                   EntryLength; 
  UINT16                  ReferencedHandle;
  UINT8                   ReferencedOffset;
  SMBIOS_TABLE_STRING     EntryString;
  UINT8                   Value[1];
}ADDITIONAL_INFORMATION_ENTRY;

///
/// Additional Information (Type 40)
///
typedef struct {
  SMBIOS_STRUCTURE                      Hdr;
  UINT8                                 NumberOfAdditionalInformationEntries;
  ADDITIONAL_INFORMATION_ENTRY          AdditionalInfoEntries[1];  
} SMBIOS_TABLE_TYPE40;

///
/// Onboard Devices Extended Information (Type 41)
///
typedef struct {
  SMBIOS_STRUCTURE        Hdr;
  SMBIOS_TABLE_STRING     ReferenceDesignation;
  UINT8                   DeviceType;
  UINT8                   DeviceTypeInstance;
  UINT16                  SegmentGroupNum;
  UINT8                   BusNum;
  UINT8                   DevFuncNum;  
} SMBIOS_TABLE_TYPE41;
#pragma pack()

///
/// Inactive (Type 126)
///
typedef struct {
  SMBIOS_STRUCTURE   Hdr;
} SMBIOS_TABLE_TYPE126;

///
/// End-of-Table (Type 127)
///
typedef struct {
  SMBIOS_STRUCTURE   Hdr;
} SMBIOS_TABLE_TYPE127;

///
/// Union of all the possible SMBIOS record types
///
typedef union {
  SMBIOS_STRUCTURE      *Hdr;
  SMBIOS_TABLE_TYPE0    *Type0;
  SMBIOS_TABLE_TYPE1    *Type1;
  SMBIOS_TABLE_TYPE2    *Type2;
  SMBIOS_TABLE_TYPE3    *Type3;
  SMBIOS_TABLE_TYPE4    *Type4;
  SMBIOS_TABLE_TYPE5    *Type5;
  SMBIOS_TABLE_TYPE6    *Type6;
  SMBIOS_TABLE_TYPE7    *Type7;
  SMBIOS_TABLE_TYPE8    *Type8;
  SMBIOS_TABLE_TYPE9    *Type9;
  SMBIOS_TABLE_TYPE10   *Type10;
  SMBIOS_TABLE_TYPE11   *Type11;
  SMBIOS_TABLE_TYPE12   *Type12;
  SMBIOS_TABLE_TYPE13   *Type13;
  SMBIOS_TABLE_TYPE14   *Type14;
  SMBIOS_TABLE_TYPE15   *Type15;
  SMBIOS_TABLE_TYPE16   *Type16;
  SMBIOS_TABLE_TYPE17   *Type17;
  SMBIOS_TABLE_TYPE18   *Type18;
  SMBIOS_TABLE_TYPE19   *Type19;
  SMBIOS_TABLE_TYPE20   *Type20;
  SMBIOS_TABLE_TYPE21   *Type21;
  SMBIOS_TABLE_TYPE22   *Type22;
  SMBIOS_TABLE_TYPE23   *Type23;
  SMBIOS_TABLE_TYPE24   *Type24;
  SMBIOS_TABLE_TYPE25   *Type25;
  SMBIOS_TABLE_TYPE26   *Type26;
  SMBIOS_TABLE_TYPE27   *Type27;
  SMBIOS_TABLE_TYPE28   *Type28;
  SMBIOS_TABLE_TYPE29   *Type29;
  SMBIOS_TABLE_TYPE30   *Type30;
  SMBIOS_TABLE_TYPE31   *Type31;
  SMBIOS_TABLE_TYPE32   *Type32;
  SMBIOS_TABLE_TYPE33   *Type33;
  SMBIOS_TABLE_TYPE34   *Type34;
  SMBIOS_TABLE_TYPE35   *Type35;
  SMBIOS_TABLE_TYPE36   *Type36;
  SMBIOS_TABLE_TYPE37   *Type37;
  SMBIOS_TABLE_TYPE38   *Type38;
  SMBIOS_TABLE_TYPE39   *Type39;
  SMBIOS_TABLE_TYPE40   *Type40;
  SMBIOS_TABLE_TYPE41   *Type41;
  SMBIOS_TABLE_TYPE126  *Type126;
  SMBIOS_TABLE_TYPE127  *Type127;
  UINT8                 *Raw;
} SMBIOS_STRUCTURE_POINTER;

#endif