mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-25 16:37:42 +01:00
131 lines
3.6 KiB
C
131 lines
3.6 KiB
C
|
/** @file
|
||
|
|
||
|
DataHub overrides module.
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include <Library/UefiLib.h>
|
||
|
#include <Library/BaseMemoryLib.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
#include <Library/UefiBootServicesTableLib.h>
|
||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||
|
#include <Protocol/DataHub.h>
|
||
|
|
||
|
#include "Common.h"
|
||
|
|
||
|
|
||
|
/** Original DataHub protocol. */
|
||
|
EFI_DATA_HUB_PROTOCOL gOrgDataHub;
|
||
|
EFI_DATA_HUB_PROTOCOL *gDataHub;
|
||
|
|
||
|
////////////////////////////////////////////
|
||
|
//
|
||
|
// DataHub overrides
|
||
|
//
|
||
|
|
||
|
|
||
|
typedef struct _APPLE_SYSTEM_INFO_DATA_RECORD
|
||
|
{
|
||
|
UINT32 Unknown[4];
|
||
|
UINT32 NameLength;
|
||
|
UINT32 ValueLength;
|
||
|
} APPLE_SYSTEM_INFO_DATA_RECORD;
|
||
|
|
||
|
|
||
|
EFI_STATUS EFIAPI
|
||
|
OvrGetNextRecord (
|
||
|
IN EFI_DATA_HUB_PROTOCOL *This,
|
||
|
IN OUT UINT64 *MonotonicCount,
|
||
|
IN EFI_EVENT *FilterDriver OPTIONAL,
|
||
|
OUT EFI_DATA_RECORD_HEADER **Record
|
||
|
)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
UINT8 *DataRec;
|
||
|
UINTN DataSize;
|
||
|
|
||
|
Status = gOrgDataHub.GetNextRecord(This, MonotonicCount, FilterDriver, Record);
|
||
|
if (Record && ((*Record)->DataRecordClass == EFI_DATA_RECORD_CLASS_PROGRESS_CODE)) {
|
||
|
return Status; //print nothing
|
||
|
}
|
||
|
|
||
|
PRINT("DataHub->GetNextRecord(%ld, %p, %p) = %r\n", *MonotonicCount, FilterDriver, Record != NULL ? *Record : NULL, Status);
|
||
|
|
||
|
if (EFI_ERROR(Status) || !(Record && *Record)) {
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
PRINT(" DataHub Record: Version=0x%x, RecordSize=0x%x, LogMonotonicCount=%ld, ",
|
||
|
(*Record)->Version, (*Record)->RecordSize, (*Record)->LogMonotonicCount);
|
||
|
PRINT(" ProducerName=%s\n", GuidStr(&(*Record)->ProducerName));
|
||
|
PRINT(" DataRecordGuid=%s, DataRecordClass=0x%lx\n",
|
||
|
GuidStr(&(*Record)->DataRecordGuid), (*Record)->DataRecordClass);
|
||
|
|
||
|
DataRec = (UINT8 *)(*Record) + sizeof(EFI_DATA_RECORD_HEADER);
|
||
|
|
||
|
if (CompareGuid(&(*Record)->ProducerName, &mEfiApplePlatformInfoGuid)) {
|
||
|
APPLE_SYSTEM_INFO_DATA_RECORD *AppleRec = (APPLE_SYSTEM_INFO_DATA_RECORD*) DataRec;
|
||
|
CHAR16 NameBuffer[256];
|
||
|
|
||
|
//PrintBytes((CHAR8 *)(*Record), (*Record)->RecordSize);
|
||
|
|
||
|
// We'll print apple specific record
|
||
|
PRINT(" APPLE_SYSTEM_INFO_DATA_RECORD:\n");
|
||
|
|
||
|
if (AppleRec->NameLength + 2 < sizeof(NameBuffer)) {
|
||
|
CopyMem(NameBuffer, (DataRec + sizeof(APPLE_SYSTEM_INFO_DATA_RECORD)), AppleRec->NameLength);
|
||
|
NameBuffer[AppleRec->NameLength / sizeof(CHAR16)] = L'\0';
|
||
|
PRINT(" Name: %s\n", NameBuffer);
|
||
|
}
|
||
|
PRINT(" Value: %d bytes\n", AppleRec->ValueLength);
|
||
|
// Limit output
|
||
|
DataSize = AppleRec->ValueLength;
|
||
|
if (DataSize > 256) {
|
||
|
DataSize = 256;
|
||
|
}
|
||
|
PrintBytes((CHAR8 *)(DataRec + sizeof(APPLE_SYSTEM_INFO_DATA_RECORD) + AppleRec->NameLength), DataSize);
|
||
|
if (DataSize != AppleRec->ValueLength) {
|
||
|
PRINT("( ... truncated ... )\n");
|
||
|
}
|
||
|
} else {
|
||
|
// Print the whole record
|
||
|
// Limit output
|
||
|
DataSize = (*Record)->RecordSize;
|
||
|
if (DataSize > 256) {
|
||
|
DataSize = 256;
|
||
|
}
|
||
|
PrintBytes((CHAR8 *)(*Record), DataSize);
|
||
|
if (DataSize != (*Record)->RecordSize) {
|
||
|
PRINT("( ... truncated ... )\n");
|
||
|
}
|
||
|
}
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
|
||
|
/** Installs our DataHub overrides. */
|
||
|
EFI_STATUS EFIAPI
|
||
|
OvrDataHub(VOID)
|
||
|
{
|
||
|
EFI_STATUS Status;
|
||
|
|
||
|
PRINT("Overriding DataHub ...\n");
|
||
|
|
||
|
// Locate DataHub protocol
|
||
|
Status = gBS->LocateProtocol(&gEfiDataHubProtocolGuid, NULL, (VOID **) &gDataHub);
|
||
|
if (EFI_ERROR(Status)) {
|
||
|
PRINT("Error Overriding DataHub: %r\n", Status);
|
||
|
return Status;
|
||
|
}
|
||
|
|
||
|
// Store originals
|
||
|
CopyMem(&gOrgDataHub, gDataHub, sizeof(EFI_DATA_HUB_PROTOCOL));
|
||
|
|
||
|
// Override with our implementation
|
||
|
gDataHub->GetNextRecord = OvrGetNextRecord;
|
||
|
|
||
|
PRINT("DataHub overriden!\n");
|
||
|
return EFI_SUCCESS;
|
||
|
}
|
||
|
|