From ea5d514727e1b9abcc4558e62ca9311755937a5d Mon Sep 17 00:00:00 2001 From: Konstantin Aladyshev Date: Mon, 12 Jul 2021 13:04:07 +0300 Subject: Add 'UefiLessonsPkg' folder to the repo Signed-off-by: Konstantin Aladyshev --- UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c | 88 ++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c (limited to 'UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c') diff --git a/UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c b/UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c new file mode 100644 index 0000000..b75026d --- /dev/null +++ b/UefiLessonsPkg/SmbiosInfo/SmbiosInfo.c @@ -0,0 +1,88 @@ +#include +#include + +#include +#include + +CHAR8* GetRecordString(EFI_SMBIOS_TABLE_HEADER* Record, UINTN number) +{ + if (!number) + return ""; + + CHAR8* String = (CHAR8*)Record + Record->Length; + UINTN i=1; + while (i < number) { + String = String + AsciiStrSize(String); + i++; + } + return String; +} + +EFI_STATUS +EFIAPI +UefiMain ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + for (UINTN i=0; iNumberOfTableEntries; i++) { + if (CompareGuid(&(SystemTable->ConfigurationTable[i].VendorGuid), &gEfiSmbiosTableGuid)) { + Print(L"SMBIOS table is placed at %p\n\n", SystemTable->ConfigurationTable[i].VendorTable); + } + } + + EFI_SMBIOS_PROTOCOL* SmbiosProtocol; + EFI_STATUS Status = gBS->LocateProtocol ( + &gEfiSmbiosProtocolGuid, + NULL, + (VOID**)&SmbiosProtocol + ); + if (EFI_ERROR (Status)) { + return Status; + } + + EFI_SMBIOS_HANDLE SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; + EFI_SMBIOS_TABLE_HEADER* Record; + Status = SmbiosProtocol->GetNext(SmbiosProtocol, + &SmbiosHandle, + NULL, + &Record, + NULL); + while (!EFI_ERROR(Status)) { + Print (L"SMBIOS Type %d \n", Record->Type); + switch (Record->Type) { + case EFI_SMBIOS_TYPE_BIOS_INFORMATION: { + SMBIOS_TABLE_TYPE0* Type0Record = (SMBIOS_TABLE_TYPE0*) Record; + Print(L"\tVendor=%a\n", GetRecordString(Record, Type0Record->Vendor)); + Print(L"\tBiosVersion=%a\n", GetRecordString(Record, Type0Record->BiosVersion)); + Print(L"\tBiosReleaseDate=%a\n", GetRecordString(Record, Type0Record->BiosReleaseDate)); + Print(L"\tBiosSegment=0x%x\n", Type0Record->BiosSegment); + Print(L"\tSystemBiosMajorRelease=0x%x\n", Type0Record->SystemBiosMajorRelease); + Print(L"\tSystemBiosMinorRelease=0x%x\n", Type0Record->SystemBiosMinorRelease); + break; + } + case EFI_SMBIOS_TYPE_SYSTEM_INFORMATION: { + SMBIOS_TABLE_TYPE1* Type1Record = (SMBIOS_TABLE_TYPE1*) Record; + Print(L"\tManufacturer=%a\n", GetRecordString(Record, Type1Record->Manufacturer)); + Print(L"\tProductName=%a\n", GetRecordString(Record, Type1Record->ProductName)); + Print(L"\tVersion=%a\n", GetRecordString(Record, Type1Record->Version)); + Print(L"\tSerialNumber=%a\n", GetRecordString(Record, Type1Record->SerialNumber)); + Print(L"\tUUID=%g\n", Type1Record->Uuid); + Print(L"\tWakeUpType=%d\n", Type1Record->WakeUpType); + Print(L"\tSKUNumber=%a\n", GetRecordString(Record, Type1Record->SKUNumber)); + Print(L"\tFamily=%a\n", GetRecordString(Record, Type1Record->Family)); + break; + } + default: + Print(L"\tTODO: Parsing for this table is not ready yet\n"); + break; + } + Status = SmbiosProtocol->GetNext(SmbiosProtocol, + &SmbiosHandle, + NULL, + &Record, + NULL); + } + + return EFI_SUCCESS; +} -- cgit v1.2.3-18-g5258