datahubgen.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 505 行 · 第 1/2 页
C
505 行
//
// Record Header
//
EfiCopyMem (&DataRecord, &mMiscSubclassDriverDataHeader, sizeof (DataRecord.Header));
//
// Record Type 2
//
AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type0->BiosVersion);
UString = EfiLibAllocateZeroPool ((EfiAsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_BIOS_VERSIONE));
ASSERT (UString != NULL);
EfiCopyMem (UString, FIRMWARE_BIOS_VERSIONE, sizeof(FIRMWARE_BIOS_VERSIONE));
Ascii2Unicode (UString + sizeof(FIRMWARE_BIOS_VERSIONE) / sizeof(CHAR16) - 1, AString);
Token = 0;
Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);
if (EFI_ERROR (Status)) {
gBS->FreePool (UString);
return ;
}
gBS->FreePool (UString);
DataRecord.Header.RecordType = EFI_MISC_BIOS_VENDOR_RECORD_NUMBER;
DataRecord.Record.MiscBiosVendor.BiosVendor = 0;
DataRecord.Record.MiscBiosVendor.BiosVersion = Token;
DataRecord.Record.MiscBiosVendor.BiosReleaseDate = 0;
DataRecord.Record.MiscBiosVendor.BiosStartingAddress = 0;
DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Value = 0;
DataRecord.Record.MiscBiosVendor.BiosPhysicalDeviceSize.Exponent = 0;
// DataRecord.Record.MiscBiosVendor.BiosCharacteristics1 = {0};
// DataRecord.Record.MiscBiosVendor.BiosCharacteristics2 = {0};
DataRecord.Record.MiscBiosVendor.BiosMajorRelease = 0;
DataRecord.Record.MiscBiosVendor.BiosMinorRelease = 0;
DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMajorRelease = 0;
DataRecord.Record.MiscBiosVendor.BiosEmbeddedFirmwareMinorRelease = 0;
Status = gDataHub->LogData (
gDataHub,
&gMiscSubClassName,
&gMiscProducerGuid,
EFI_DATA_RECORD_CLASS_DATA,
&DataRecord,
sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscBiosVendor)
);
//
// System information (TYPE 1)
//
SmbiosTable = GetSmbiosTableFromType ((SMBIOS_TABLE_STRUCTURE *)Smbios, 1, 0);
if (SmbiosTable.Raw == NULL) {
DEBUG ((EFI_D_ERROR, "SmbiosTable: Type 1 (System Information) not found!\n"));
return ;
}
//
// Record Type 3
//
AString = GetSmbiosString (SmbiosTable, SmbiosTable.Type1->ProductName);
UString = EfiLibAllocateZeroPool ((EfiAsciiStrLen(AString) + 1) * sizeof(CHAR16) + sizeof(FIRMWARE_PRODUCT_NAME));
ASSERT (UString != NULL);
EfiCopyMem (UString, FIRMWARE_PRODUCT_NAME, sizeof(FIRMWARE_PRODUCT_NAME));
Ascii2Unicode (UString + sizeof(FIRMWARE_PRODUCT_NAME) / sizeof(CHAR16) - 1, AString);
Token = 0;
Status = gHii->NewString (gHii, NULL, gStringHandle, &Token, UString);
if (EFI_ERROR (Status)) {
gBS->FreePool (UString);
return ;
}
gBS->FreePool (UString);
DataRecord.Header.RecordType = EFI_MISC_SYSTEM_MANUFACTURER_RECORD_NUMBER;
DataRecord.Record.MiscSystemManufacturer.SystemManufacturer = 0;
DataRecord.Record.MiscSystemManufacturer.SystemProductName = Token;
DataRecord.Record.MiscSystemManufacturer.SystemVersion = 0;
DataRecord.Record.MiscSystemManufacturer.SystemSerialNumber = 0;
// DataRecord.Record.MiscSystemManufacturer.SystemUuid = {0};
DataRecord.Record.MiscSystemManufacturer.SystemWakeupType = 0;
DataRecord.Record.MiscSystemManufacturer.SystemSKUNumber = 0;
DataRecord.Record.MiscSystemManufacturer.SystemFamily = 0;
Status = gDataHub->LogData (
gDataHub,
&gMiscSubClassName,
&gMiscProducerGuid,
EFI_DATA_RECORD_CLASS_DATA,
&DataRecord,
sizeof (DataRecord.Header) + sizeof (DataRecord.Record.MiscSystemManufacturer)
);
return ;
}
EFI_DRIVER_ENTRY_POINT (DataHubGenEntrypoint);
EFI_STATUS
EFIAPI
DataHubGenEntrypoint (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
VOID *Smbios;
EfiInitializeDriverLib (ImageHandle, SystemTable);
Smbios = GetSmbiosTablesFromHob ();
if (Smbios == NULL) {
return EFI_NOT_FOUND;
}
Status = gBS->LocateProtocol (
&gEfiDataHubProtocolGuid,
NULL,
&gDataHub
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->LocateProtocol (
&gEfiHiiProtocolGuid,
NULL,
&gHii
);
if (EFI_ERROR (Status)) {
return Status;
}
PrepareHiiPackage ();
InstallProcessorDataHub (Smbios);
InstallCacheDataHub (Smbios);
InstallMemoryDataHub (Smbios);
InstallMiscDataHub (Smbios);
return EFI_SUCCESS;
}
//
// Internal function
//
UINTN
SmbiosTableLength (
IN SMBIOS_STRUCTURE_POINTER SmbiosTable
)
{
CHAR8 *AChar;
UINTN Length;
AChar = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);
while ((*AChar != 0) || (*(AChar + 1) != 0)) {
AChar ++;
}
Length = ((UINTN)AChar - (UINTN)SmbiosTable.Raw + 2);
return Length;
}
SMBIOS_STRUCTURE_POINTER
GetSmbiosTableFromType (
IN SMBIOS_TABLE_STRUCTURE *Smbios,
IN UINT8 Type,
IN UINTN Index
)
{
SMBIOS_STRUCTURE_POINTER SmbiosTable;
UINTN SmbiosTypeIndex;
SmbiosTypeIndex = 0;
SmbiosTable.Raw = (UINT8 *)(UINTN)Smbios->TableAddress;
if (SmbiosTable.Raw == NULL) {
return SmbiosTable;
}
while ((SmbiosTypeIndex != Index) || (SmbiosTable.Hdr->Type != Type)) {
if (SmbiosTable.Hdr->Type == 127) {
SmbiosTable.Raw = NULL;
return SmbiosTable;
}
if (SmbiosTable.Hdr->Type == Type) {
SmbiosTypeIndex ++;
}
SmbiosTable.Raw = (UINT8 *)(SmbiosTable.Raw + SmbiosTableLength (SmbiosTable));
}
return SmbiosTable;
}
CHAR8 *
GetSmbiosString (
IN SMBIOS_STRUCTURE_POINTER SmbiosTable,
IN SMBIOS_TABLE_STRING String
)
{
CHAR8 *AString;
UINT8 Index;
Index = 1;
AString = (CHAR8 *)(SmbiosTable.Raw + SmbiosTable.Hdr->Length);
while (Index != String) {
while (*AString != 0) {
AString ++;
}
AString ++;
if (*AString == 0) {
return AString;
}
Index ++;
}
return AString;
}
//
// Internal library
//
CHAR16 *
Ascii2Unicode (
OUT CHAR16 *UnicodeStr,
IN CHAR8 *AsciiStr
)
/*++
Routine Description:
Converts ASCII characters to Unicode.
Arguments:
UnicodeStr - the Unicode string to be written to. The buffer must be large enough.
AsciiStr - The ASCII string to be converted.
Returns:
The address to the Unicode string - same as UnicodeStr.
--*/
{
CHAR16 *Str;
Str = UnicodeStr;
while (TRUE) {
*(UnicodeStr++) = (CHAR16) *AsciiStr;
if (*(AsciiStr++) == '\0') {
return Str;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?