Newer
Older
AMI-Aptio-BIOS-Reversed / UuidPeiInit / UuidPeiInit.c
@Ajax Dong Ajax Dong 2 days ago 18 KB Init
/*
 *UuidPeiInit.c - Decompiled source for UuidPeiInit.efi
 *
 *Copyright (c) HR650X BIOS Decompilation Project
 */

#include "UuidPeiInit.h"

char *InternalCopyMem(char *dst, char *src, unsigned int count)
{
 unsigned int count_1; // edx char *dst_1; // edi char *src_1; // esi count_1 = count; /*0xffdb0e62*/
 if ( src < dst && &src[count - 1] >= dst ) /*0xffdb0e70*/
 {
 src_1 = &src[count - 1]; /*0xffdb0e84*/
 dst_1 = &dst[count - 1]; /*0xffdb0e86*/
 }
 else
 {
 count_1 = count & 3; /*0xffdb0e74*/
 qmemcpy(dst, src, 4 * (count >> 2)); /*0xffdb0e7d*/
 src_1 = &src[4 * (count >> 2)]; /*0xffdb0e7d*/
 dst_1 = &dst[4 * (count >> 2)]; /*0xffdb0e7d*/
 }
 qmemcpy(dst_1, src_1, count_1); /*0xffdb0e8d*/
 return dst; /*0xffdb0e94*/
}

void *SetMem(void *buf, unsigned int count, char value)
{
 memset(buf, value, count); /*0xffdb0ec5*/
 return buf; /*0xffdb0ecb*/
}

int SetMem32(int a1, int a2, int a3, int a4)
{
 do /*0xffdb0ef1*/
 {
 *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffdb0ee9*/
 *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffdb0eed*/
 }
 while ( a2 ); /*0xffdb0ef1*/
 return a1; /*0xffdb0ef5*/
}

void *SetMem16(void *buf, unsigned int count, int value)
{
 memset32(buf, value, count); /*0xffdb0f05*/
 return buf; /*0xffdb0f0b*/
}

// bad sp value at call has been detected, the output may be wrong!
EFI_STATUS UuidPeiInitEntry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 int PeiServicesTable; // eax int Status; // eax int DebugOutputProtocol; // eax int Status; // eax int Status; // eax EFI_STATUS PdrUuidInit; // edi int v8; // ecx int NextHob; // eax int NextHob_1; // esi char src[32]; // [esp-38h] [ebp-38h] BYREF char dst_; // [esp-18h] [ebp-18h] BYREF int v14; // [esp-17h] [ebp-17h]
 int v15; // [esp-13h] [ebp-13h]
 int v16; // [esp-Fh] [ebp-Fh]
 __int16 v17; // [esp-Bh] [ebp-Bh]
 char v18; // [esp-9h] [ebp-9h]
 int Table; // [esp-8h] [ebp-8h] BYREF Table = 0; /*0xffdb0f1c*/
 dst_ = 0; /*0xffdb0f24*/
 v14 = 0; /*0xffdb0f2b*/
 v15 = 0; /*0xffdb0f2e*/
 v16 = 0; /*0xffdb0f2f*/
 v17 = 0; /*0xffdb0f30*/
 v18 = 0; /*0xffdb0f32*/
 PeiServicesTable = GetPeiServicesTable(); /*0xffdb0f33*/
 Status = (*(int ( **)(int, int *))(*(_DWORD *)PeiServicesTable + 40))(PeiServicesTable, &Table); /*0xffdb0f3f*/
 if ( Status < 0 ) /*0xffdb0f46*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffdb0f53*/
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0xffdb0f5b*/
 if ( DebugOutputProtocol ) /*0xffdb0f62*/
 (*(void ( **)(const char *, int, const char *))(DebugOutputProtocol + 4))( /*0xffdb0f70*/
 "e:\\hs\\PurleyPlatPkg\\Platform\\Pei\\UuidPeiInit\\UuidPeiInit.c",
 56,
 "!EFI_ERROR (Status)");
 }
 if ( Table == 7 ) /*0xffdb0f7c*/
 {
 Status = MfgUuidGet(SystemTable, &dst_); /*0xffdb0f81*/
 if ( Status < 0 ) /*0xffdb0f88*/
 DebugPrint(64, "MfgUuidGet return Status:%r\n", Status); /*0xffdb0f90*/
 }
 else
 {
 Status = UuidGetByPdr(SystemTable, (int)src); /*0xffdb0f95*/
 if ( Status < 0 ) /*0xffdb0f9c*/
 DebugPrint(64, "UuidGetByPdr return Status:%r\n", Status); /*0xffdb0fb6*/
 else CopyMem(&dst_, src, 0x10u); /*0xffdb0fa6*/
 }
 PdrUuidInit = GetPdrUuidInit(SystemTable, (int)&dst_); /*0xffdb0fcb*/
 NextHob = GetNextHob(v8, 40); /*0xffdb0fcd*/
 NextHob_1 = NextHob; /*0xffdb0fd2*/
 if ( NextHob ) /*0xffdb0fd6*/
 {
 InitGlobalVariable((void *)(NextHob + 8)); /*0xffdb0fdb*/
 if ( NextHob_1 != -24 ) /*0xffdb0fe5*/
 CopyMem((char *)(NextHob_1 + 24), &dst_, 0x10u); /*0xffdb0fec*/
 }
 return PdrUuidInit; /*0xffdb0ff9*/
}

int GetNextHob(int a1, int n40)
{
 int PeiServicesTable; // eax int DebugOutputProtocol; // eax int Result; // [esp+4h] [ebp-4h] BYREF PeiServicesTable = GetPeiServicesTable(); /*0xffdb1001*/
 if ( (*(int ( **)(int, int, int, int *))(*(_DWORD *)PeiServicesTable + 52))(PeiServicesTable, 4, n40, &Result) < 0 ) /*0xffdb1019*/
 Result = 0; /*0xffdb101b*/
 if ( !Result ) /*0xffdb1023*/
 {
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0xffdb1025*/
 if ( DebugOutputProtocol ) /*0xffdb102c*/
 (*(void ( **)(const char *, int, const char *))(DebugOutputProtocol + 4))( /*0xffdb103d*/
 "e:\\hs\\MdePkg\\Library\\PeiHobLib\\HobLib.c",
 250,
 "Hob != ((void *) 0)");
 }
 return Result; /*0xffdb1016*/
}

int GetDebugOutputProtocol()
{
 int PeiServicesTable; // eax int v2; // [esp+0h] [ebp-8h] BYREF int Result; // [esp+4h] [ebp-4h] BYREF PeiServicesTable = GetPeiServicesTable(); /*0xffdb104f*/
 if ( (*(int ( **)(int, void *, _DWORD, int *, int *))(*(_DWORD *)PeiServicesTable + 32))( /*0xffdb106e*/
 PeiServicesTable,
 &unk_FFDB1E98,
 0,
 &v2,
 &Result) >= 0 )
 return Result; /*0xffdb1074*/
 else return 0; /*0xffdb1070*/
}

int DebugPrint(int a1, const char *a2, ...)
{
 int result; // eax int ( **v3)(int, const char *, char *); // esi va_list va; // [esp+10h] [ebp+Ch] BYREF va_start(va, a2);
 result = GetDebugOutputProtocol(); /*0xffdb107c*/
 v3 = (int ( **)(int, const char *, char *))result; /*0xffdb1081*/
 if ( result ) /*0xffdb1085*/
 {
 result = GetDebugPrintErrorLevel(); /*0xffdb1087*/
 if ( (result & a1) != 0 ) /*0xffdb1092*/
 return (*v3)(a1, a2, (char *)va); /*0xffdb109e*/
 }
 return result; /*0xffdb10a3*/
}

int DebugAssert(
 int e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 int n48,
 int PeiServices____((void__)_0))
{
 int result; // eax result = GetDebugOutputProtocol(); /*0xffdb10ab*/
 if ( result ) /*0xffdb10b2*/
 return (*(int ( **)(int, int, int))(result + 4))( /*0xffdb10ba*/
 e:__hs__MdePkg__Library__PeiServicesTablePointerLibIdt__PeiServ,
 n48,
 PeiServices____((void__)_0));
 return result; /*0xffdb10c0*/
}

int WriteUuidToFlash(int SystemTable, int dst)
{
 int result; // eax int v5; // ebx int Status; // eax int Result; // esi int Status; // eax int Status; // eax _BYTE *v10; // edx unsigned int i; // ecx char v12; // al int Status; // eax int Status; // eax char v15; // [esp+17h] [ebp-21h]
 int v16; // [esp+18h] [ebp-20h] BYREF _BYTE *v17; // [esp+1Ch] [ebp-1Ch] BYREF int Table; // [esp+20h] [ebp-18h] BYREF int v19; // [esp+24h] [ebp-14h] BYREF _DWORD v20[4]; // [esp+28h] [ebp-10h] BYREF v20[2] = 512; /*0xffdb10d6*/
 v20[0] = 1036288; /*0xffdb10e1*/
 v20[3] = 0; /*0xffdb10ed*/
 v20[1] = 0; /*0xffdb10f6*/
 CalculatePcdPoint(0, 0, v20, &v19); /*0xffdb10fa*/
 result = (*(int ( **)(int, void *, _DWORD, _DWORD, int *))(*(_DWORD *)SystemTable + 32))( /*0xffdb110e*/
 SystemTable,
 &unk_FFDB1EA8,
 0,
 0,
 &v16);
 if ( result >= 0 ) /*0xffdb1116*/
 {
 v5 = v19; /*0xffdb111c*/
 v15 = *(_BYTE *)(v19 + 220); /*0xffdb1126*/
 if ( (v15 & 0x20) != 0 ) /*0xffdb1130*/
 *(_BYTE *)(v19 + 220) &= ~0x20u; /*0xffdb113a*/
 Status = (*(int ( **)(int, int, _BYTE **))(*(_DWORD *)SystemTable + 76))(SystemTable, 0x8000, &v17); /*0xffdb114d*/
 Result = Status; /*0xffdb1150*/
 if ( Status >= 0 ) /*0xffdb1157*/
 {
 Result = (*(int ( **)(int, int, int *))(*(_DWORD *)SystemTable + 76))(SystemTable, 0x8000, &Table); /*0xffdb1181*/
 if ( Result >= 0 ) /*0xffdb1188*/
 {
 Status = (*(int ( **)(int, int, _DWORD, int, _BYTE *))(v16 + 4))(v16, 4, 0, 0x8000, v17); /*0xffdb11a1*/
 Result = Status; /*0xffdb11a4*/
 if ( Status >= 0 ) /*0xffdb11ab*/
 {
 Status = (*(int ( **)(int, int, int, int, int))(v16 + 4))(v16, 4, 0x8000, 0x8000, Table); /*0xffdb11c2*/
 Result = Status; /*0xffdb11c5*/
 if ( Status >= 0 ) /*0xffdb11cc*/
 {
 v10 = v17; /*0xffdb11d6*/
 for ( i = 0; i < 0x10; ++i ) /*0xffdb11da*/
 {
 v12 = *(_BYTE *)(i + dst); /*0xffdb11dc*/
 *v10++ = v12; /*0xffdb11e0*/
 }
 Status = (*(int ( **)(int, int, _DWORD, int))(v16 + 12))(v16, 4, 0, 0x10000); /*0xffdb11f6*/
 Result = Status; /*0xffdb11f9*/
 if ( Status >= 0 ) /*0xffdb1200*/
 {
 Status = (*(int ( **)(int, int, _DWORD, int, _BYTE *))(v16 + 8))(v16, 4, 0, 0x8000, v17); /*0xffdb121b*/
 Result = Status; /*0xffdb121e*/
 if ( Status >= 0 ) /*0xffdb1225*/
 {
 Result = (*(int ( **)(int, int, int, int, int))(v16 + 8))(v16, 4, 0x8000, 0x8000, Table); /*0xffdb1242*/
 if ( Result < 0 ) /*0xffdb1249*/
 DebugPrint(0x80000000, "UUID Update failed !\n"); /*0xffdb1255*/
 }
 else
 {
 DebugPrint(0x80000000, "FlashWrite back the first 32 Status:%r\n", Status); /*0xffdb122d*/
 }
 }
 else
 {
 DebugPrint(0x80000000, "FlashErase Status:%r\n", Status); /*0xffdb1208*/
 }
 }
 else
 {
 DebugPrint(0x80000000, "FlashRead the second 32kb Status:%r\n", Status); /*0xffdb11d4*/
 }
 }
 else
 {
 DebugPrint(0x80000000, "FlashRead the first 32kb Status:%r\n", Status); /*0xffdb11b3*/
 }
 }
 }
 else
 {
 DebugPrint(0x80000000, "AllocatePool BackUpBlock1 Status:%r\n", Status); /*0xffdb1164*/
 }
 if ( (v15 & 0x20) != 0 ) /*0xffdb1261*/
 *(_BYTE *)(v5 + 220) = v15; /*0xffdb1267*/
 return Result; /*0xffdb126d*/
 }
 return result; /*0xffdb126f*/
}

int UuidGetByPdr(EFI_SYSTEM_TABLE *SystemTable, int src)
{
 int Result; // esi int Status; // eax int v6; // [esp+8h] [ebp-4h] BYREF Result = (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, int *))(LODWORD(SystemTable->Hdr.Signature) + 32))( /*0xffdb1292*/
 SystemTable,
 &unk_FFDB1EA8,
 0,
 0,
 &v6);
 if ( Result >= 0 ) /*0xffdb1299*/
 {
 Status = (*(int ( **)(int, int, _DWORD, int, int))(v6 + 4))(v6, 4, 0, 32, src); /*0xffdb12b9*/
 Result = Status; /*0xffdb12bc*/
 if ( Status < 0 ) /*0xffdb12c3*/
 DebugPrint(0x80000000, "PIT from SPI PDR reports Platform ID invalidation. Status:%r!\n", Status); /*0xffdb12d0*/
 }
 else
 {
 DebugPrint(0x80000000, "Cannot Locate gPchSpiPpiGuid!\n"); /*0xffdb12a5*/
 }
 return Result; /*0xffdb12d8*/
}

int GetPdrUuidInit(EFI_SYSTEM_TABLE *SystemTable, int dst)
{
 int result; // eax int Result; // edx unsigned __int8 Index; // cl char v7; // al int v8; // [esp+Ch] [ebp-4h] BYREF result = (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, int *))(LODWORD(SystemTable->Hdr.Signature) /*0xffdb12fb*/
 + 32))(
 SystemTable,
 &unk_FFDB1EA8,
 0,
 0,
 &v8);
 Result = result; /*0xffdb12fe*/
 if ( result >= 0 )
 {
 Index = 0; /*0xffdb130b*/
 while ( 1 )
 {
 v7 = *(_BYTE *)(Index + dst); /*0xffdb1310*/
 if ( v7 != -1 ) /*0xffdb1315*/
 {
 if ( v7 ) /*0xffdb1319*/
 break; /*0xffdb1319*/
 }
 if ( ++Index >= 0x10u )
 {
 if ( (*(int ( **)(int, int, _DWORD, int, int))(v8 + 4))(v8, 3, 0, 6, dst) < 0 )
 {
 DebugPrint(0x80000000, "GetPDRUUID: ERROR: Can't get GbE MAC address\n");
 *(_DWORD *)dst = -1515870811; /*0xffdb134f*/
 *(_WORD *)(dst + 4) = -23131; /*0xffdb1352*/
 }
 *(_BYTE *)(dst + 6) = CmosReadBcdByte(9); /*0xffdb1361*/
 *(_BYTE *)(dst + 7) = CmosReadBcdByte(7); /*0xffdb136c*/
 *(_BYTE *)(dst + 8) = CmosReadBcdByte(8); /*0xffdb1377*/
 *(_BYTE *)(dst + 9) = CmosReadBcdByte(4); /*0xffdb1382*/
 *(_BYTE *)(dst + 10) = CmosReadBcdByte(2); /*0xffdb138c*/
 *(_BYTE *)(dst + 11) = CmosReadBcdByte(0); /*0xffdb1396*/
 *(_DWORD *)(dst + 12) = -1515870811; /*0xffdb139d*/
 return WriteUuidToFlash((int)SystemTable, dst); /*0xffdb13a7*/
 }
 }
 return Result; /*0xffdb13a9*/
 }
 return result; /*0xffdb13ab*/
}

int MfgUuidGet(EFI_SYSTEM_TABLE *SystemTable, char *dst)
{
 int Result; // esi int n16; // [esp+8h] [ebp-28h] BYREF int ( **v7)(_DWORD, const __int16 *, void *, _DWORD, int *, char *); // [esp+Ch] [ebp-24h] BYREF char src[32]; // [esp+10h] [ebp-20h] BYREF if ( (*(int ( **)(EFI_SYSTEM_TABLE *, void *, _DWORD, _DWORD, int ( ***)(_DWORD, const __int16 *, void *, _DWORD, int *, char *)))(LODWORD(SystemTable->Hdr.Signature) + 32))( /*0xffdb13da*/
 SystemTable,
 &unk_FFDB1E88,
 0,
 0,
 &v7) >= 0 )
 {
 n16 = 16; /*0xffdb13e1*/
 if ( (*v7)(v7, L"MfgSystemUuid", &unk_FFDB1EB8, 0, &n16, dst) >= 0 ) /*0xffdb1402*/
 return WriteUuidToFlash((int)SystemTable, (int)dst); /*0xffdb1410*/
 }
 Result = UuidGetByPdr(SystemTable, (int)src); /*0xffdb141f*/
 if ( Result >= 0 ) /*0xffdb1423*/
 CopyMem(dst, src, 0x10u); /*0xffdb142d*/
 return Result; /*0xffdb1433*/
}

char CmosReadBcdByte(char a1)
{
 unsigned __int8 v1; // al unsigned __int8 Result; // al v1 = __inbyte(0x70u); /*0xffdb1443*/
 __outbyte(0x70u, a1 | v1 & 0x80); /*0xffdb1448*/
 Result = __inbyte(0x71u); /*0xffdb144f*/
 return Result - 6 * (Result >> 4); /*0xffdb1460*/
}

int GetPeiServicesTable()
{
 int Result; // esi _BYTE v2[8]; // [esp+4h] [ebp-8h] BYREF ReadIdtr(v2); /*0xffdb1470*/
 Result = *(_DWORD *)(*(_DWORD *)&v2[2] - 4); /*0xffdb1478*/
 if ( !Result ) /*0xffdb147d*/
 DebugAssert( /*0xffdb148c*/
 (int)"e:\\hs\\MdePkg\\Library\\PeiServicesTablePointerLibIdt\\PeiServicesTablePointer.c",
 48,
 (int)"PeiServices != ((void *) 0)");
 return Result; /*0xffdb1494*/
}

int GetDebugPrintErrorLevel()
{
 unsigned __int8 v0; // al char Result; // al char n3_1; // cl v0 = __inbyte(0x70u); /*0xffdb149f*/
 __outbyte(0x70u, v0 & 0x80 | 0x4A); /*0xffdb14a4*/
 Result = __inbyte(0x71u); /*0xffdb14ab*/
 n3_1 = Result; /*0xffdb14ac*/
 if ( (unsigned __int8)Result <= 3u ) /*0xffdb14b1*/
 {
LABEL_4:
 if ( !n3_1 ) /*0xffdb14cc*/
 return 0; /*0xffdb14cc*/
 goto LABEL_5; /*0xffdb14cc*/
 }
 n3_1 = Result; /*0xffdb14b3*/
 if ( !Result ) /*0xffdb14bb*/
 {
 n3_1 = MEMORY[0xFDAF0490] & 2 | 1; /*0xffdb14c7*/
 goto LABEL_4; /*0xffdb14c7*/
 }
LABEL_5:
 if ( n3_1 != -1 )
 return n3_1 != 1 ? -2147483578 : -2147483644;
 return 0; /*0xffdb14e4*/
}

void *__thiscall InitGlobalVariable(void *this)
{
 __int64 Unaligned64; // rax __int64 Unaligned64_1; // rax Unaligned64 = ReadUnaligned64(&unk_FFDB1E78); /*0xffdb14f0*/
 WriteUnaligned64(Unaligned64, SHIDWORD(Unaligned64)); /*0xffdb14f9*/
 Unaligned64_1 = ReadUnaligned64(&unk_FFDB1E80); /*0xffdb1503*/
 WriteUnaligned64(Unaligned64_1, SHIDWORD(Unaligned64_1)); /*0xffdb150d*/
 return this; /*0xffdb1517*/
}

char *CopyMem(char *dst, char *src, unsigned int n16)
{
 int DebugOutputProtocol; // eax int Protocol; // eax if ( n16 - 1 > -1 - (int)dst ) /*0xffdb152f*/
 {
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0xffdb1531*/
 if ( DebugOutputProtocol ) /*0xffdb1538*/
 (*(void ( **)(const char *, int, const char *))(DebugOutputProtocol + 4))( /*0xffdb1546*/
 "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
 56,
 "(Length - 1) <= (0xFFFFFFFF - (UINTN)DestinationBuffer)");
 }
 if ( n16 - 1 > -1 - (int)src ) /*0xffdb1550*/
 {
 Protocol = GetDebugOutputProtocol(); /*0xffdb1552*/
 if ( Protocol ) /*0xffdb1559*/
 (*(void ( **)(const char *, int, const char *))(Protocol + 4))( /*0xffdb1567*/
 "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
 57,
 "(Length - 1) <= (0xFFFFFFFF - (UINTN)SourceBuffer)");
 }
 if ( dst == src ) /*0xffdb156f*/
 return dst; /*0xffdb1571*/
 else return InternalCopyMem(dst, src, n16); /*0xffdb157b*/
}

void *__thiscall ReadIdtr(void *this)
{
 void *this_1; // eax if ( !this ) /*0xffdb158e*/
 DebugAssert((int)"e:\\hs\\MdePkg\\Library\\BaseLib\\X86ReadIdtr.c", 37, (int)"Idtr != ((void *) 0)"); /*0xffdb159d*/
 this_1 = this; /*0xffdb15a3*/
 __sidt(this); /*0xffdb15a6*/
 return this_1; /*0xffdb15aa*/
}

__int64 __thiscall ReadUnaligned64(void *this)
{
 int DebugOutputProtocol; // eax if ( !this ) /*0xffdb15b0*/
 {
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0xffdb15b2*/
 if ( DebugOutputProtocol ) /*0xffdb15b9*/
 (*(void ( **)(const char *, int, const char *))(DebugOutputProtocol + 4))( /*0xffdb15ca*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 192,
 "Buffer != ((void *) 0)");
 }
 return *(_QWORD *)this; /*0xffdb15d5*/
}

int WriteUnaligned64(int Unaligned64, int a2)
{
 _DWORD *v2; // ecx _DWORD *v3; // esi int DebugOutputProtocol; // eax v3 = v2; /*0xffdb15d8*/
 if ( !v2 ) /*0xffdb15dc*/
 {
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0xffdb15de*/
 if ( DebugOutputProtocol ) /*0xffdb15e5*/
 (*(void ( **)(const char *, int, const char *))(DebugOutputProtocol + 4))( /*0xffdb15f6*/
 "e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c",
 219,
 "Buffer != ((void *) 0)");
 }
 *v3 = Unaligned64; /*0xffdb1604*/
 v3[1] = a2; /*0xffdb1606*/
 return Unaligned64; /*0xffdb1609*/
}

void *__thiscall PeiPcdGetBool(void *this)
{
 int PeiServicesTable; // eax int Status; // eax int DebugOutputProtocol; // eax void *this_1; // [esp+0h] [ebp-4h]

 this_1 = this; /*0xffdb160e*/
 PeiServicesTable = GetPeiServicesTable(); /*0xffdb160f*/
 Status = (*(int (__stdcall **)(int))(*(_DWORD *)PeiServicesTable + 32))(PeiServicesTable); /*0xffdb1624*/
 if ( Status < 0 ) /*0xffdb162c*/
 {
 DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0xffdb1639*/
 DebugOutputProtocol = GetDebugOutputProtocol(); /*0xffdb1641*/
 if ( DebugOutputProtocol ) /*0xffdb1648*/
 (*(void ( **)(const char *, int, const char *))(DebugOutputProtocol + 4))( /*0xffdb1656*/
 "e:\\hs\\MdePkg\\Library\\PeiPcdLib\\PeiPcdLib.c",
 49,
 "!EFI_ERROR (Status)");
 }
 return this_1; /*0xffdb1661*/
}

int __thiscall PcdGetBool(void *this)
{
 int ( **Bool)(void *); // eax Bool = (int ( **)(void *))PeiPcdGetBool(this); /*0xffdb1666*/
 return Bool[4](this); /*0xffdb1670*/
}

int __thiscall PcdGetPtr(void *this)
{
 int ( **Bool)(void *); // eax Bool = (int ( **)(void *))PeiPcdGetBool(this); /*0xffdb1675*/
 return Bool[5](this); /*0xffdb167f*/
}

int *CalculatePcdPoint(int a1, int a2, _DWORD *a3, int *a4)
{
 int v4; // ecx v4 = GetPcdPtrValue((int)a3) + (*a3 & 0xFFFFFFF); /*0xffdb1695*/
 *a4 = v4; /*0xffdb169c*/
 return a4; /*0xffdb169b*/
}

int SioGetFixedAddress(_DWORD *a1, int n8)
{
 int Ptr; // [esp+Ch] [ebp-4h]

 Ptr = PcdGetPtr((void *)6); /*0xffdb16cf*/
 a1[1] = 16 *n8 + 16; /*0xffdb16d8*/
 if ( !a1[4] && !a1[5] ) /*0xffdb16f4*/
 {
 *(_DWORD *)(Ptr + 16) = PcdGetBool((void *)5); /*0xffdb1719*/
 *(_DWORD *)(Ptr + 20) = 0; /*0xffdb1730*/
 }
 return 0; /*0xffdb1736*/
}

int GetPcdPtrValue(int a1)
{
 int Ptr; // [esp+Ch] [ebp-Ch]
 int v3; // [esp+10h] [ebp-8h]
 int Bool; // [esp+14h] [ebp-4h]

 if ( *(_DWORD *)(a1 + 12) ) /*0xffdb174f*/
 {
 v3 = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 255544); /*0xffdb1845*/
 Bool = *(_DWORD *)(*(_DWORD *)(a1 + 12) + 4 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 255560); /*0xffdb1861*/
 }
 else
 {
 Ptr = PcdGetPtr((void *)6); /*0xffdb1762*/
 if ( *(_DWORD *)(Ptr + 4) ) /*0xffdb1768*/
 {
 v3 = *(_DWORD *)(Ptr + 16 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 20); /*0xffdb1783*/
 Bool = *(_DWORD *)(Ptr + 16 * (unsigned __int16)*(_DWORD *)(a1 + 4) + 16); /*0xffdb179b*/
 }
 else
 {
 SioGetFixedAddress(dword_FFDB1ED8, 8); /*0xffdb17ae*/
 v3 = dword_FFDB1EEC[4 * (unsigned __int16)*(_DWORD *)(a1 + 4)]; /*0xffdb17c9*/
 Bool = dword_FFDB1EE8[4 * (unsigned __int16)*(_DWORD *)(a1 + 4)]; /*0xffdb17e0*/
 if ( !Bool && !v3 ) /*0xffdb17ed*/
 {
 Bool = PcdGetBool((void *)5); /*0xffdb181a*/
 v3 = 0; /*0xffdb1827*/
 }
 }
 }
 if ( !Bool && !v3 ) /*0xffdb186e*/
 return PcdGetBool((void *)5); /*0xffdb189b*/
 return Bool; /*0xffdb18b4*/
}