#include "FboGroupForm.h"
//
// FboGroupForm - UEFI Module
// Total functions: 58
//
// Function: _ModuleEntryPoint @ 0x3b0 (0x148 bytes)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
EFI_BOOT_SERVICES *BootServices; // r10
EFI_RUNTIME_SERVICES *RuntimeServices; // rax
EFI_STATUS result; // rax
_DWORD v7[4]; // [rsp+30h] [rbp-10h] BYREF
__int64 v8; // [rsp+50h] [rbp+10h] BYREF
char v9; // [rsp+58h] [rbp+18h] BYREF
::ImageHandle = (__int64)ImageHandle; /*0x3c2*/
if ( !ImageHandle ) /*0x3d2*/
AssertMsg( /*0x3e5*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
51,
(__int64)"gImageHandle != ((void *) 0)");
::SystemTable = (__int64)SystemTable; /*0x3ea*/
if ( !SystemTable ) /*0x3f4*/
AssertMsg( /*0x407*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
57,
(__int64)"gST != ((void *) 0)");
::BootServices = (__int64)SystemTable->BootServices; /*0x410*/
if ( !::BootServices ) /*0x41a*/
AssertMsg( /*0x42d*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
63,
(__int64)"gBS != ((void *) 0)");
::RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x436*/
if ( !::RuntimeServices ) /*0x440*/
AssertMsg( /*0x453*/
(__int64)"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
47,
(__int64)"gRT != ((void *) 0)");
DebugPrint((UINTN)ImageHandle, (const CHAR8 *)SystemTable); /*0x458*/
v7[0] = 2114425114; /*0x465*/
v7[1] = 1259292679; /*0x46c*/
v7[2] = 1140159652; /*0x473*/
v7[3] = -1274566372; /*0x47a*/
if ( SystemTable_0 ) /*0x481*/
{
BootServices = (EFI_BOOT_SERVICES *)BootServices_0; /*0x4a2*/
}
else
{
SystemTable_0 = (__int64)SystemTable; /*0x483*/
BootServices = SystemTable->BootServices; /*0x48a*/
RuntimeServices = SystemTable->RuntimeServices; /*0x48e*/
BootServices_0 = (__int64)BootServices; /*0x492*/
RuntimeServices_0 = (__int64)RuntimeServices; /*0x499*/
}
result = ((__int64 (__fastcall *)(__int64, __int64, void (__fastcall *)(__int64, __int64), EFI_HANDLE, __int64 *))BootServices->CreateEvent)( /*0x4c6*/
512,
8,
FormDriverEntry,
ImageHandle,
&v8);
if ( (result & 0x8000000000000000uLL) == 0LL ) /*0x4cd*/
return (*(__int64 (__fastcall **)(_DWORD *, __int64, char *))(BootServices_0 + 168))(v7, v8, &v9); /*0x4e2*/
return result; /*0x4f2*/
}
// Function: LookupDevIndex @ 0x4f8 (0x40 bytes)
__int64 __fastcall sub_4F8(__int16 a1)
{
unsigned __int16 v1; // dx
__int16 v2; // ax
v1 = 0; /*0x506*/
if ( !*(_WORD *)Status ) /*0x50a*/
return 0xFFFF; /*0x52e*/
v2 = *(_WORD *)Status; /*0x510*/
while ( v2 != a1 ) /*0x518*/
{
v2 = *(_WORD *)(Status + 10LL * ++v1); /*0x524*/
if ( !v2 ) /*0x52c*/
return 0xFFFF; /*0x52c*/
}
return v1; /*0x533*/
}
// Function: DebugDumpArray @ 0x538 (0x206 bytes)
__int64 __fastcall DebugDumpArray(unsigned __int8 *Arr, __int64 ResultPtr, unsigned __int8 i, unsigned __int8 IdxA_5)
{
unsigned __int64 IdxA; // rsi
char Found; // r13
unsigned __int64 IdxA_6; // rbp
unsigned __int8 *Arr_1; // rbx
unsigned __int64 IdxA_2; // rdi
unsigned __int8 ValA; // r15
unsigned __int8 ValB; // r12
unsigned __int64 ValA_1; // rcx
unsigned __int64 IdxA_4; // rdx
bool v14; // zf
unsigned __int64 IdxA_1; // rdx
bool v16; // zf
__int64 ResultPtr_1; // r8
unsigned __int64 IdxA_3; // rax
_BYTE *Arr_2; // rcx
unsigned __int64 IdxE; // rax
unsigned __int8 n18; // cl
unsigned __int64 j; // rax
__int64 ResultPtr_2; // [rsp+58h] [rbp+10h]
IdxA = i; /*0x558*/
Found = 0; /*0x55c*/
IdxA_6 = 0; /*0x55f*/
Arr_1 = Arr; /*0x565*/
IdxA_2 = IdxA_5; /*0x568*/
ValA = Arr[i]; /*0x56b*/
ValB = *(_BYTE *)(i + ResultPtr); /*0x56f*/
while ( IdxA_6 < IdxA_2 ) /*0x576*/
LogDebugMsg(0x400000, "%d ", Arr_1[IdxA_6++]); /*0x589*/
LogDebugMsg(0x400000, "\n"); /*0x5a2*/
if ( ValB == 18 ) /*0x5ad*/
{
if ( ValA ) /*0x5b6*/
{
LODWORD(ValA_1) = IdxA_5 - 1; /*0x5ff*/
if ( ValA != (_DWORD)ValA_1 ) /*0x607*/
goto LABEL_29; /*0x607*/
ValA_1 = (int)ValA_1; /*0x609*/
if ( IdxA_5 == 1 ) /*0x60f*/
goto LABEL_29; /*0x60f*/
do /*0x63c*/
{
IdxA_1 = 0; /*0x611*/
if ( IdxA_2 ) /*0x616*/
{
while ( IdxA_1 == IdxA || ValA_1 != Arr_1[IdxA_1] ) /*0x624*/
{
v16 = ++IdxA_1 == IdxA_2; /*0x629*/
if ( IdxA_1 >= IdxA_2 ) /*0x62c*/
goto LABEL_25; /*0x62c*/
}
Found = 1; /*0x630*/
}
v16 = IdxA_1 == IdxA_2; /*0x633*/
LABEL_25:
if ( v16 ) /*0x636*/
break; /*0x636*/
--ValA_1; /*0x638*/
}
while ( ValA_1 ); /*0x63c*/
}
else
{
ValA_1 = 0; /*0x5b8*/
if ( IdxA_5 == 1 ) /*0x5c4*/
{
LABEL_31:
ResultPtr_1 = ResultPtr; /*0x657*/
IdxA_3 = 0; /*0x65c*/
if ( IdxA ) /*0x661*/
{
Arr_2 = Arr_1; /*0x666*/
while ( Arr_2[ResultPtr - (_QWORD)Arr_1] != ValA ) /*0x670*/
{
if ( *Arr_2 == 18 ) /*0x675*/
{
Arr_1[IdxA_3] = ValA; /*0x684*/
break; /*0x684*/
}
++IdxA_3; /*0x677*/
++Arr_2; /*0x67a*/
if ( IdxA_3 >= IdxA ) /*0x680*/
goto LABEL_52; /*0x680*/
}
Arr_1[IdxA] = 18; /*0x688*/
}
goto LABEL_52; /*0x68c*/
}
do /*0x5f7*/
{
IdxA_4 = 0; /*0x5ca*/
if ( IdxA_2 ) /*0x5cf*/
{
while ( IdxA_4 == IdxA || ValA_1 != Arr_1[IdxA_4] ) /*0x5dd*/
{
v14 = ++IdxA_4 == IdxA_2; /*0x5e2*/
if ( IdxA_4 >= IdxA_2 ) /*0x5e5*/
goto LABEL_13; /*0x5e5*/
}
Found = 1; /*0x5e9*/
}
v14 = IdxA_4 == IdxA_2; /*0x5ec*/
LABEL_13:
if ( v14 ) /*0x5ef*/
break; /*0x5ef*/
++ValA_1; /*0x5f1*/
}
while ( ValA_1 < IdxA_5 - 1 ); /*0x5f7*/
}
if ( Found ) /*0x641*/
{
Arr_1[IdxA] = ValA_1; /*0x643*/
ValA = ValA_1; /*0x646*/
}
}
LABEL_29:
if ( ValB == ValA ) /*0x64c*/
return 0; /*0x64c*/
if ( ValB == 18 ) /*0x655*/
goto LABEL_31; /*0x655*/
if ( ValA == 18 ) /*0x691*/
{
for ( IdxE = IdxA + 1; IdxE < IdxA_2; ++IdxE ) /*0x693*/
{
n18 = Arr_1[IdxE]; /*0x699*/
if ( n18 != 18 ) /*0x69f*/
{
Arr_1[IdxA] = n18; /*0x6a1*/
IdxA = IdxE; /*0x6a4*/
Arr_1[IdxE] = 18; /*0x6a7*/
}
}
}
else
{
for ( j = 0; j < IdxA_2; ++j ) /*0x6ba*/
{
if ( j != IdxA && ValA == Arr_1[j] ) /*0x6c5*/
Arr_1[j] = ValB; /*0x6c7*/
}
}
ResultPtr_1 = ResultPtr; /*0x6d3*/
LABEL_52:
if ( IdxA_2 ) /*0x6db*/
{
ResultPtr_1 -= (__int64)Arr_1; /*0x6dd*/
ResultPtr_2 = ResultPtr_1; /*0x6e0*/
do /*0x70c*/
{
Arr_1[ResultPtr_1] = *Arr_1; /*0x6ee*/
LogDebugMsg(0x400000, "%d ", *Arr_1); /*0x6fb*/
ResultPtr_1 = ResultPtr_2; /*0x700*/
++Arr_1; /*0x705*/
--IdxA_2; /*0x708*/
}
while ( IdxA_2 ); /*0x70c*/
}
LogDebugMsg(0x400000, "\n", ResultPtr_1); /*0x71a*/
return 0; /*0x730*/
}
// Function: TokenizeConfigStr @ 0x740 (0x1c1 bytes)
__int64 __fastcall TokenizeConfigStr(__int64 BufPtr, unsigned __int16 *p_StrId, __int64 *buf)
{
char IsFirst; // r15
__int64 result; // rax
char *DstPtr; // rax
unsigned __int64 Idx; // rdx
char Ch; // cl
bool EndOfStr; // di
__int64 Status; // rax
__int64 Status_1; // rbx
__int64 LineSize; // [rsp+40h] [rbp-20h] BYREF
unsigned __int64 Idx_1; // [rsp+48h] [rbp-18h] BYREF
__int64 HiiHandle; // [rsp+50h] [rbp-10h] BYREF
char *DstPtr_2; // [rsp+58h] [rbp-8h]
char *DstPtr_1; // [rsp+A8h] [rbp+48h] BYREF
DstPtr_1 = 0; /*0x76b*/
Idx_1 = 0; /*0x772*/
LineSize = 0; /*0x779*/
IsFirst = 1; /*0x78d*/
result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_57F0, 0, &HiiHandle); /*0x791*/
if ( result >= 0 ) /*0x79a*/
{
result = (*(__int64 (__fastcall **)(__int64, __int64, char *, unsigned __int64 *))(HiiHandle + 24))( /*0x7b2*/
HiiHandle,
BufPtr,
DstPtr_1,
&Idx_1);
if ( result == 0x8000000000000005uLL ) /*0x7c5*/
{
result = (*(__int64 (__fastcall **)(__int64, unsigned __int64, char **))(BootServices_0 + 64))( /*0x7d8*/
4,
Idx_1,
&DstPtr_1);
if ( result < 0 ) /*0x7de*/
return result; /*0x7de*/
result = (*(__int64 (__fastcall **)(__int64, __int64, char *, unsigned __int64 *))(HiiHandle + 24))( /*0x7f6*/
HiiHandle,
BufPtr,
DstPtr_1,
&Idx_1);
}
if ( result >= 0 ) /*0x7fc*/
{
result = (*(__int64 (__fastcall **)(__int64, unsigned __int64, __int64 *))(BootServices_0 + 64))( /*0x813*/
4,
Idx_1,
&LineSize);
if ( result >= 0 ) /*0x819*/
{
DstPtr = DstPtr_1; /*0x81f*/
DstPtr_2 = DstPtr_1; /*0x828*/
do /*0x8be*/
{
for ( Idx = 0; ; ++Idx ) /*0x830*/
{
Ch = *DstPtr; /*0x854*/
if ( *DstPtr == 59 || !Ch || Idx >= Idx_1 ) /*0x83d*/
break; /*0x83d*/
*(_BYTE *)(Idx + LineSize) = Ch; /*0x843*/
DstPtr = ++DstPtr_1; /*0x84d*/
}
*(_BYTE *)(Idx + LineSize) = 0; /*0x863*/
EndOfStr = *DstPtr_1 == 0; /*0x877*/
if ( IsFirst ) /*0x880*/
{
Status = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *, __int64, _QWORD, __int64 *, _QWORD))HiiHandle)( /*0x894*/
HiiHandle,
BufPtr,
p_StrId,
LineSize,
0,
buf,
0);
IsFirst = 0; /*0x896*/
}
else
{
Status = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64, __int64 *, _QWORD))(HiiHandle + 16))( /*0x8aa*/
HiiHandle,
BufPtr,
*p_StrId,
LineSize,
buf,
0);
}
Status_1 = Status; /*0x8ad*/
DstPtr = ++DstPtr_1; /*0x8b4*/
}
while ( !EndOfStr ); /*0x8be*/
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(LineSize); /*0x8cf*/
(*(void (__fastcall **)(char *))(BootServices_0 + 72))(DstPtr_2); /*0x8dd*/
return Status_1; /*0x8e0*/
}
}
}
return result; /*0x8f4*/
}
// Function: ExtractConfigRoute @ 0x904 (0x1af bytes)
__int64 __fastcall ExtractConfigRoute(__int64 BufPtr, _BYTE *Result, _QWORD *p_LinePtr)
{
_BYTE *Result_1; // rbx
_BYTE *Result_2; // rdi
__int64 result; // rax
bool Done; // zf
__int64 StrLen; // rdx
__int64 Idx; // r8
__int64 StrLen2; // rdx
__int64 Idx2; // r8
_BYTE Buf[528]; // [rsp+40h] [rbp-228h] BYREF
__int64 BufSize; // [rsp+278h] [rbp+10h] BYREF
__int64 HiiHandle; // [rsp+288h] [rbp+20h] BYREF
BufSize = 256; /*0x91d*/
Result_1 = Result; /*0x929*/
Result_2 = Result; /*0x936*/
result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_57F0, 0, &HiiHandle); /*0x942*/
if ( result >= 0 ) /*0x94e*/
{
for ( Done = *Result_1 == 0; !Done; Done = *Result_2 == 0 ) /*0x954*/
{
if ( *Result_2 == 59 ) /*0x960*/
{
*Result_2 = 0; /*0x97f*/
if ( (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64, __int64, _BYTE *, __int64 *, _QWORD))(HiiHandle + 8))( /*0x99e*/
HiiHandle,
Result_1,
BufPtr,
4,
Buf,
&BufSize,
0) >= 0 )
{
StrLen = 0; /*0x9af*/
if ( *Result_1 ) /*0x9b2*/
{
do /*0x9ba*/
++StrLen; /*0x9b7*/
while ( Result_1[StrLen] ); /*0x9ba*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD *))(BootServices_0 + 64))( /*0x9d2*/
4,
StrLen + 1,
p_LinePtr);
if ( result >= 0 ) /*0x9d8*/
{
Idx = 0; /*0x9da*/
if ( *Result_1 ) /*0x9dd*/
{
do /*0x9e5*/
++Idx; /*0x9e2*/
while ( Result_1[Idx] ); /*0x9e5*/
}
(*(void (__fastcall **)(_QWORD, _BYTE *, __int64))(BootServices_0 + 352))(*p_LinePtr, Result_1, Idx + 1); /*0x9fb*/
result = 0; /*0xa01*/
}
*Result_2 = 59; /*0xa04*/
return result; /*0xa07*/
}
*Result_2 = 59; /*0x9a0*/
Result_1 = Result_2 + 1; /*0x9a3*/
}
++Result_2; /*0x9a7*/
}
result = (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64, __int64, _BYTE *, __int64 *, _QWORD))(HiiHandle + 8))( /*0xa3f*/
HiiHandle,
Result_1,
BufPtr,
4,
Buf,
&BufSize,
0);
if ( result >= 0 ) /*0xa45*/
{
StrLen2 = 0; /*0xa47*/
if ( *Result_1 ) /*0xa4a*/
{
do /*0xa52*/
++StrLen2; /*0xa4f*/
while ( Result_1[StrLen2] ); /*0xa52*/
}
result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD *))(BootServices_0 + 64))(4, StrLen2 + 1, p_LinePtr); /*0xa6a*/
if ( result >= 0 ) /*0xa70*/
{
Idx2 = 0; /*0xa72*/
if ( *Result_1 ) /*0xa75*/
{
do /*0xa7d*/
++Idx2; /*0xa7a*/
while ( Result_1[Idx2] ); /*0xa7d*/
}
(*(void (__fastcall **)(_QWORD, _BYTE *, __int64))(BootServices_0 + 352))(*p_LinePtr, Result_1, Idx2 + 1); /*0xa93*/
return 0; /*0xa99*/
}
}
}
return result; /*0xaab*/
}
// Function: ParseConfigString @ 0xab4 (0x36f bytes)
__int64 __fastcall ParseConfigString(__int64 BufPtr, unsigned __int16 a2, unsigned __int16 Total)
{
__int64 Total_1; // r15
char IsFirst; // r14
__int64 Status; // rax
_BYTE *Result_1; // rax
_BYTE *Result_2; // rsi
int Idx; // r8d
__int64 Pos; // rdx
char Ch; // cl
_BYTE *Result_3; // rax
__int64 Line; // rbx
__int64 Ptr; // rax
__int64 Ptr_1; // rcx
_BYTE *OutBuf; // [rsp+40h] [rbp-C0h] BYREF
__int64 HiiHandle; // [rsp+48h] [rbp-B8h] BYREF
unsigned __int64 Idx_1; // [rsp+50h] [rbp-B0h] BYREF
__int64 n256; // [rsp+58h] [rbp-A8h] BYREF
__int64 p_LinePtr; // [rsp+60h] [rbp-A0h] BYREF
__int16 LineBuf[264]; // [rsp+70h] [rbp-90h] BYREF
__int16 TokenBuf[264]; // [rsp+280h] [rbp+180h] BYREF
__int16 m[288]; // [rsp+490h] [rbp+390h] BYREF
unsigned __int16 v26; // [rsp+6F0h] [rbp+5F0h] BYREF
_BYTE *Result; // [rsp+6F8h] [rbp+5F8h] BYREF
Total_1 = Total; /*0xae1*/
Result = 0; /*0xae8*/
OutBuf = 0; /*0xaf4*/
Idx_1 = 0; /*0xafb*/
v26 = 0; /*0xb07*/
IsFirst = 0; /*0xb0f*/
n256 = 0; /*0xb12*/
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_57F0, 0, &HiiHandle) < 0 ) /*0xb21*/
return 0; /*0xb21*/
Status = (*(__int64 (__fastcall **)(__int64, __int64, _BYTE *, unsigned __int64 *))(HiiHandle + 24))( /*0xb3e*/
HiiHandle,
BufPtr,
Result,
&Idx_1);
if ( Status == 0x8000000000000005uLL ) /*0xb4e*/
{
if ( (*(__int64 (__fastcall **)(__int64, unsigned __int64, _BYTE **))(BootServices_0 + 64))(4, Idx_1, &Result) < 0 ) /*0xb6d*/
return 0; /*0xe04*/
Status = (*(__int64 (__fastcall **)(__int64, __int64, _BYTE *, unsigned __int64 *))(HiiHandle + 24))( /*0xb8a*/
HiiHandle,
BufPtr,
Result,
&Idx_1);
}
if ( Status < 0 /*0xbb2*/
|| (*(__int64 (__fastcall **)(__int64, unsigned __int64, _BYTE **))(BootServices_0 + 64))(4, Idx_1, &OutBuf) < 0 )
{
return 0; /*0xbb2*/
}
Result_1 = Result; /*0xbb8*/
Result_2 = Result; /*0xbc4*/
do /*0xd7a*/
{
Idx = 0; /*0xbc7*/
for ( Pos = 0; ; ++Pos ) /*0xbca*/
{
Ch = *Result_1; /*0xbfc*/
if ( *Result_1 == 59 || !Ch || Idx >= Idx_1 ) /*0xbdb*/
break; /*0xbdb*/
++Idx; /*0xbe2*/
OutBuf[Pos] = Ch; /*0xbe5*/
Result_1 = ++Result; /*0xbf2*/
}
OutBuf[Pos] = 0; /*0xc0c*/
Result_3 = Result; /*0xc10*/
if ( !*Result ) /*0xc1c*/
IsFirst = 1; /*0xc1f*/
if ( *OutBuf == 120 && OutBuf[1] == 45 ) /*0xc2c*/
goto LABEL_17; /*0xc2c*/
n256 = 256; /*0xc5f*/
if ( (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64, __int64, __int16 *, __int64 *, _QWORD))(HiiHandle + 8))( /*0xc7b*/
HiiHandle,
OutBuf,
BufPtr,
4,
LineBuf,
&n256,
0) < 0 )
{
p_LinePtr = 0; /*0xc82*/
if ( ExtractConfigRoute(BufPtr, Result_2, &p_LinePtr) < 0 /*0xce3*/
|| (Line = (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64, __int16 *, __int64 *, _QWORD))(HiiHandle + 8))(
HiiHandle,
p_LinePtr,
BufPtr,
4,
LineBuf,
&n256,
0),
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(p_LinePtr),
Line < 0) )
{
Result_3 = Result; /*0xce5*/
LABEL_17:
Result_1 = Result_3 + 1; /*0xc2e*/
Result = Result_1; /*0xc31*/
continue; /*0xc38*/
}
}
WideToUpper(TokenBuf, (char *)LineBuf, a2); /*0xd01*/
if ( v26 ) /*0xd21*/
Ptr = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, _BYTE *, __int16 *, _QWORD))(HiiHandle + 16))( /*0xd57*/
HiiHandle,
BufPtr,
v26,
OutBuf,
TokenBuf,
0);
else
Ptr = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *, _BYTE *, _QWORD, __int16 *, _QWORD))HiiHandle)( /*0xd41*/
HiiHandle,
BufPtr,
&v26,
OutBuf,
0,
TokenBuf,
0);
Ptr_1 = Ptr; /*0xd5a*/
Result_1 = ++Result; /*0xd64*/
if ( Ptr_1 < 0 ) /*0xd71*/
{
(*(void (__fastcall **)(_BYTE *))(BootServices_0 + 72))(Result_2); /*0xe01*/
return 0; /*0xe01*/
}
}
while ( !IsFirst ); /*0xd7a*/
WideToUpper(m, (char *)L"FBO%03d", Total_1 + 400); /*0xd95*/
(*(void (__fastcall **)(__int64, __int64, _QWORD, const char *, __int16 *, _QWORD))(HiiHandle + 16))( /*0xdc5*/
HiiHandle,
BufPtr,
v26,
"x-AMI",
m,
0);
if ( Result_2 ) /*0xdcb*/
(*(void (__fastcall **)(_BYTE *))(BootServices_0 + 72))(Result_2); /*0xdd7*/
if ( OutBuf ) /*0xde2*/
(*(void (**)(void))(BootServices_0 + 72))(); /*0xdeb*/
return v26; /*0xe10*/
}
// Function: ProcessDeviceData @ 0xe24 (0x246 bytes)
__int64 __fastcall ProcessDeviceData(
__int64 FormCtx,
unsigned __int64 src,
__int64 BufPtr,
__int64 Dst,
unsigned __int64 n8)
{
__int64 result; // rax
unsigned __int64 Src; // rbx
__int64 FormCtx_1; // rdi
unsigned __int16 DevType; // r15
__int64 Idx; // rsi
char *DevRec; // r12
char *HiiString; // rax
char *HiiString_1; // rdi
char *matched; // rax
char *matched_1; // r13
__int64 FormStr; // r12
__int64 Result; // rdx
unsigned __int64 Src_1; // [rsp+40h] [rbp-C0h]
__int64 StrBuf[72]; // [rsp+50h] [rbp-B0h] BYREF
unsigned __int16 p_StrId; // [rsp+2A8h] [rbp+1A8h] BYREF
__int64 BufPtra; // [rsp+2B0h] [rbp+1B0h]
__int64 MaxStrLen; // [rsp+2B8h] [rbp+1B8h] BYREF
BufPtra = BufPtr; /*0xe24*/
result = src + n8; /*0xe53*/
Src = src; /*0xe56*/
Src_1 = src + n8; /*0xe59*/
FormCtx_1 = FormCtx; /*0xe5e*/
if ( src < src + n8 ) /*0xe64*/
{
while ( 1 ) /*0xe71*/
{
DevType = 0; /*0xe71*/
if ( ((*(unsigned __int16 *)(Src + 4) - 2LL) & 0xFFFFFFFFFFFFFFFEuLL) != 0 ) /*0xe7f*/
break; /*0xe7f*/
LABEL_11:
Src += *(unsigned __int16 *)(Src + 4) + 4LL; /*0xf57*/
result = *(unsigned __int16 *)(Dst + 4); /*0xf62*/
Dst += result + 4; /*0xf6b*/
if ( Src >= Src_1 ) /*0xf73*/
return result; /*0xf73*/
}
Idx = 0; /*0xe85*/
while ( 1 ) /*0xe8a*/
{
p_StrId = 0; /*0xe8a*/
MaxStrLen = 256; /*0xe98*/
MemSet((int *)StrBuf, 0, 0x200u); /*0xea8*/
LOWORD(n8) = *(_WORD *)(Src + 2 * Idx + 6); /*0xeb9*/
if ( !HiiHandle_0 /*0xee2*/
&& (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_58E8, 0, &HiiHandle_0) < 0 )
{
goto LABEL_10; /*0xee2*/
}
DevRec = (char *)GetHiiCurrLang(); /*0xeec*/
HiiString = (char *)GetHiiString(FormCtx_1); /*0xeef*/
HiiString_1 = HiiString; /*0xef4*/
if ( HiiString ) /*0xefa*/
{
matched = MatchConfigString(HiiString, DevRec, "en-US", "en-US"); /*0xf1a*/
matched_1 = matched; /*0xf1f*/
if ( matched ) /*0xf25*/
{
FormStr = (*(__int64 (__fastcall **)(__int64, char *, __int64, _QWORD, __int64 *, __int64 *, _QWORD))(HiiHandle_0 + 8))( /*0xfd2*/
HiiHandle_0,
matched,
FormCtx,
(unsigned __int16)n8,
StrBuf,
&MaxStrLen,
0);
(*(void (__fastcall **)(char *))(BootServices_0 + 72))(matched_1); /*0xfd5*/
if ( FormStr == 0x8000000000000020uLL ) /*0xfe5*/
FormStr = GetBrowserData(HiiString_1, Result, FormCtx, n8, &MaxStrLen, StrBuf); /*0x1014*/
(*(void (__fastcall **)(char *))(BootServices_0 + 72))(HiiString_1); /*0x1021*/
if ( FormStr >= 0 ) /*0x102a*/
{
FormCtx_1 = FormCtx; /*0x1048*/
if ( TokenizeConfigStr(BufPtra, &p_StrId, StrBuf) >= 0 ) /*0x1052*/
*(_WORD *)(Dst + 2 * Idx + 6) = p_StrId; /*0x105f*/
goto LABEL_10; /*0x1065*/
}
}
else
{
(*(void (__fastcall **)(char *))(BootServices_0 + 72))(HiiString_1); /*0xf31*/
}
}
FormCtx_1 = FormCtx; /*0xf34*/
LABEL_10:
Idx = ++DevType; /*0xf47*/
if ( DevType >= ((unsigned __int64)*(unsigned __int16 *)(Src + 4) - 2) >> 1 ) /*0xf51*/
goto LABEL_11; /*0xf51*/
}
}
return result; /*0xf79*/
}
// Function: ProcessLegacyDevData @ 0x106c (0x4a4 bytes)
__int64 __fastcall ProcessLegacyDevData(__int64 RuntimeHii, __int64 BufPtr)
{
__int16 Status; // r13
__int64 Idx; // rsi
char *Dst; // rbx
__int64 Buffer; // r15
__int64 Result; // r14
unsigned __int64 Iter; // r12
unsigned __int16 DevIdx; // ax
int Key; // r11d
unsigned __int64 DataSize_1; // rax
unsigned __int64 Dst_1; // rdi
__int16 NewIdx; // ax
__int64 p_Buffer_2; // r14
__int64 ByteVal; // rax
unsigned __int16 VarStoreId; // r15
__int64 BufPtr_1; // rsi
__int16 FormPackage_1; // bx
__int16 IdxB; // cx
__int16 IdxC; // r14
__int16 Byte2; // ax
EFI_STRING_ID Byte3; // dx
unsigned __int16 n0x12; // r14
__int64 p_Buffer_1; // r14
unsigned __int64 VarStoreId_1; // rcx
unsigned __int64 DataSize; // [rsp+48h] [rbp-31h] BYREF
__int64 p_Buffer; // [rsp+50h] [rbp-29h] BYREF
unsigned __int64 OrderSize; // [rsp+58h] [rbp-21h] BYREF
unsigned __int64 Idx_1; // [rsp+60h] [rbp-19h] BYREF
char *Src; // [rsp+68h] [rbp-11h] BYREF
__int64 Dst... [8555 chars total]
// Function: ProcessUefiDevData @ 0x1510 (0x49f bytes)
__int64 __fastcall ProcessUefiDevData(__int64 RuntimeHii, __int64 BufPtr)
{
unsigned __int64 DstSize; // rdi
char *Dst; // rsi
__int64 p_Buffer_1; // r13
__int64 Status; // r14
unsigned __int64 OrderSize; // r12
unsigned __int64 DstSize_2; // r15
unsigned __int16 DevIdx; // ax
__int16 *OrderEntry; // r11
char *Dst_1; // rbx
char *Iter; // rcx
__int16 Idx; // cx
__int16 Temp; // ax
__int64 p_Buffer_4; // r12
__int64 v17; // rax
unsigned __int16 VarStoreId; // r14
__int64 BufPtr_1; // rdi
__int16 IdxB; // r13
__int16 IdxC; // r12
__int16 Byte2; // ax
EFI_STRING_ID StringId; // dx
unsigned __int16 n0x12; // r12
__int64 p_Buffer_3; // r12
bool v26; // cf
__int16 FormPackage; // [rsp+40h] [rbp-39h]
unsigned __int64 DataSize; // [rsp+48h] [rbp-31h] BYREF
__int64 p_Buffer; // [rsp+50h] [rbp-29h] BYREF
unsigned __int64 OrderSize_1; // [rsp+58h] [rbp-21h] BYREF
unsigned __int64 DstSize_1; // [rsp+60h] [rbp-19h] BYREF
char *Src; // [rsp+6... [8424 chars total]
// Function: ModuleInit @ 0x19b0 (0x17a bytes)
void __fastcall ModuleInit(__int64 BufPtr, __int64 a2)
{
bool HasContext; // zf
__int64 Status; // rax
__int64 VarSize; // [rsp+10h] [rbp-28h] BYREF
__int64 VarSize2; // [rsp+18h] [rbp-20h] BYREF
_DWORD Guid[6]; // [rsp+20h] [rbp-18h] BYREF
__int64 (**HiiProtocol)(void); // [rsp+48h] [rbp+10h] BYREF
__int64 RuntimeHii; // [rsp+50h] [rbp+18h] BYREF
__int64 HandleSize; // [rsp+58h] [rbp+20h] BYREF
if ( a2 ) /*0x19b3*/
{
VarSize = 0; /*0x19c6*/
VarSize2 = 0; /*0x19cb*/
HasContext = *(_QWORD *)(a2 + 24) == 0; /*0x19d0*/
HandleSize = 8; /*0x19d5*/
Guid[0] = -326642109; /*0x19dd*/
Guid[1] = 1270213540; /*0x19e4*/
Guid[2] = 1044374945; /*0x19eb*/
Guid[3] = -1458720202; /*0x19f2*/
if ( !HasContext /*0x1a35*/
&& *(_WORD *)(a2 + 16) == 16
&& (*(__int64 (__fastcall **)(const __int16 *, void *, _QWORD, __int64 *, __int64 *))(RuntimeServices_0 + 72))(
L"FixedBootOrderHii",
&unk_5810,
0,
&HandleSize,
&RuntimeHii) >= 0 )
{
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 (***)(void)))(BootServices_0 + 320))( /*0x1a58*/
&unk_5810,
0,
&HiiProtocol) >= 0 )
{
qword_5EA8 = HiiProtocol[6](); /*0x1a61*/
qword_5EC0 = HiiProtocol[7](); /*0x1a6f*/
Status = HiiProtocol[9](); /*0x1a7a*/
qword_5EA0 = 0; /*0x1a7d*/
::Status = Status; /*0x1a85*/
}
if ( GetHiiVariable((__int64)L"FixedBootGroup", (__int64)Guid, 0, &VarSize, &GroupPtr) >= 0 /*0x1add*/
&& GetHiiVariable((__int64)L"FixedBoot", (__int64)&unk_5858, 0, &VarSize2, &Result2) >= 0 )
{
ProcessLegacyDevData(RuntimeHii, BufPtr); /*0x1ae7*/
ProcessUefiDevData(RuntimeHii, BufPtr); /*0x1af4*/
(*(void (__fastcall **)(const __int16 *, void *, __int64))(RuntimeServices_0 + 88))( /*0x1b21*/
L"FboGfHiiHandle",
&unk_5810,
2);
}
}
}
}
// Function: FormCallbackHandler @ 0x1b2c (0x39f bytes)
__int64 __fastcall FormCallbackHandler(__int64 a1, __int64 n4096, __int64 Key, __int64 Status, int a5, __int64 a6)
{
unsigned __int16 Key_1; // bx
__int64 GroupPtr; // r15
int Key_2; // esi
__int64 KeyVal; // r8
__int64 Status_2; // r9
__int64 Result2_2; // rdx
__int64 CfgPtr; // rbx
int Idx; // esi
__int64 Buf; // rbx
int i; // esi
unsigned __int16 Idx2; // ax
_WORD *Idx5; // r8
__int64 Status2; // r9
__int64 Result; // rdx
__int64 n0x1200; // r8
__int64 Status_1; // r9
__int64 Result2_1; // rdx
int v24; // esi
__int64 Buf2; // rbx
int Idx4; // esi
unsigned __int16 Idx3; // ax
__int64 AttrData; // rdx
__int64 AttrSize; // [rsp+20h] [rbp-20h] BYREF
_DWORD AttrGuid[6]; // [rsp+28h] [rbp-18h] BYREF
__int64 Result2; // [rsp+68h] [rbp+28h] BYREF
Result2 = 0; /*0x1b47*/
Key_1 = Key; /*0x1b4c*/
GroupPtr = ::GroupPtr; /*0x1b54*/
AttrSize = 648; /*0x1b5b*/
AttrGuid[0] = 2114425114; /*0x1b63*/
AttrGuid[1] = 1259292679; /*0x1b6a*/
AttrGuid[2] = 1140159652; /*0x1b71*/
AttrGuid[3] = -1274566372; /*0x1b78*/
if ( a6 ) /*0x1b82*/
*(_QWORD *)a6 = 0; /*0x1b84*/
if ( !n4096 || n4096 == 4096 ) /*0x1b9c*/
return 0; /*0x1b9c*/
if ( n4096 == 2 ) /*0x1ba2*/
{
SubmitFormString(&AttrSize, ::Result2, Key, Status); /*0x1baf*/
return 0; /*0x1b8f*/
}
if ( n4096 != 1 ) /*0x1bba*/
return 0x8000000000000002uLL; /*0x1bc6*/
Key_2 = (unsigned __int16)Key; /*0x1bcb*/
LogDebugMsg(0x400000, "FboGroupFormCallback : Callback key:%X\n", (unsigned __int16)Key, Status);
if ( (unsigned __int16)(Key_1 - 4096) <= 0x488u ) /*0x1bf0*/
{
if ( Key_1 < 0x1344u ) /*0x1bfe*/
{
if ( Key_1 < 0x1200u ) /*0x1d7a*/
return 0; /*0x1d7a*/
(*(void (__fastcall **)(__int64, __int64, __int64 *))(BootServices_0 + 64))(4, AttrSize, &Result2); /*0x1d94*/
Result2_1 = Result2; /*0x1d97*/
if ( !Result2 ) /*0x1d9e*/
{
AssertMsg( /*0x1db3*/
(__int64)"e:\\hs\\AmiModulePkg\\FixedBootOrder\\FboGroupForm\\FboGroupForm.c",
1142,
(__int64)"IfrNvDataSubMenu != ((void *) 0)");
Result2_1 = Result2; /*0x1db8*/
}
CfgPtr = SubmitFormString(&AttrSize, Result2_1, n0x1200, Status_1); /*0x1dda*/
LogDebugMsg(0x80000000LL, "[FixedBootOrder.c] HiiLibGetBrowserData(%r) BufferSize=%x\n", CfgPtr, AttrSize); /*0x1ddd*/
if ( CfgPtr < 0 ) /*0x1de5*/
goto LABEL_15; /*0x1de5*/
v24 = Key_2 - 4608; /*0x1deb*/
Buf2 = (unsigned __int16)(v24 / 18); /*0x1e02*/
Idx4 = v24 % 18; /*0x1e0e*/
Idx3 = LookupDevIndex(*(_WORD *)(7 * Buf2 + qword_5EA8)); /*0x1e1c*/
if ( Idx3 != 0xFFFF ) /*0x1e29*/
DebugDumpArray( /*0x1e5d*/
(unsigned __int8 *)(Result2 + 18 * Buf2),
::Result2 + 18 * Buf2,
Idx4,
*(_BYTE *)(*(unsigned __int16 *)(::Status + 10LL * Idx3 + 8) + GroupPtr));
if ( (*(__int64 (__fastcall **)(_DWORD *, _QWORD, __int64 *))(BootServices_0 + 320))(AttrGuid, 0, &a6) >= 0 ) /*0x1e7c*/
{
AttrData = 9 * Buf2; /*0x1e89*/
LOBYTE(AttrData) = *(_BYTE *)(::Result2 + 18 * Buf2); /*0x1e8d*/
(*(void (__fastcall **)(_QWORD, __int64))(a6 + 16))(*(unsigned __int16 *)(7 * Buf2 + qword_5EA8), AttrData); /*0x1ea0*/
}
}
else
{
(*(void (__fastcall **)(__int64, __int64, __int64 *))(BootServices_0 + 64))(4, AttrSize, &Result2); /*0x1c18*/
Result2_2 = Result2; /*0x1c1b*/
if ( !Result2 ) /*0x1c22*/
{
AssertMsg( /*0x1c37*/
(__int64)"e:\\hs\\AmiModulePkg\\FixedBootOrder\\FboGroupForm\\FboGroupForm.c",
1096,
(__int64)"IfrNvDataSubMenu != ((void *) 0)");
Result2_2 = Result2; /*0x1c3c*/
}
CfgPtr = SubmitFormString(&AttrSize, Result2_2, KeyVal, Status_2); /*0x1c5e*/
LogDebugMsg(0x80000000LL, "[FixedBootOrder.c] HiiLibGetBrowserData(%r) BufferSize=%x\n", CfgPtr, AttrSize); /*0x1c61*/
if ( CfgPtr < 0 ) /*0x1c69*/
goto LABEL_15; /*0x1c69*/
Idx = Key_2 - 4932; /*0x1c81*/
Buf = (unsigned __int16)(Idx / 18); /*0x1c98*/
i = Idx % 18; /*0x1ca4*/
Idx2 = LookupDevIndex(*(_WORD *)(7 * Buf + qword_5EC0)); /*0x1cb2*/
if ( Idx2 != 0xFFFF ) /*0x1cbf*/
DebugDumpArray( /*0x1d01*/
(unsigned __int8 *)(Result2 + 2 * (9 * Buf + 162)),
::Result2 + 324 + 18 * Buf,
i,
*(_BYTE *)(*(unsigned __int16 *)(::Status + 10LL * Idx2 + 8) + GroupPtr));
if ( (*(__int64 (__fastcall **)(_DWORD *, _QWORD, __int64 *))(BootServices_0 + 320))(AttrGuid, 0, &a6) >= 0 ) /*0x1d20*/
{
Result = 9 * Buf; /*0x1d29*/
LOBYTE(Result) = *(_BYTE *)(::Result2 + 18 * Buf + 324); /*0x1d2d*/
(*(void (__fastcall **)(_QWORD, __int64))(a6 + 24))(*(unsigned __int16 *)(7 * Buf + qword_5EC0), Result); /*0x1d44*/
}
}
CfgPtr = NewFormString(AttrSize, Result2, Idx5, Status2); /*0x1d65*/
LogDebugMsg(0x80000000LL, "[FixedBootOrder.c] HiiLibSetBrowserData(%r) BufferSize=%x\n", CfgPtr, AttrSize); /*0x1d68*/
LABEL_15:
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(Result2); /*0x1c6b*/
return CfgPtr; /*0x1c7c*/
}
return 0x8000000000000003uLL; /*0x1ec1*/
}
// Function: FormDriverEntry @ 0x1ecc (0x119 bytes)
void __fastcall FormDriverEntry(__int64 a1, __int64 a2)
{
__int64 Arg; // r8
unsigned __int64 Iter; // rdx
__int64 BufPtr; // [rsp+38h] [rbp-18h] BYREF
__int64 HiiProto; // [rsp+40h] [rbp-10h] BYREF
__int64 (__fastcall **PkgList)(_QWORD, __int64, _QWORD, __int64 *); // [rsp+48h] [rbp-8h] BYREF
__int64 PkgHdr; // [rsp+78h] [rbp+28h] BYREF
if ( (*(__int64 (__fastcall **)(__int64, void *, __int64 *))(BootServices_0 + 152))(a2, &unk_5928, &HiiProto) >= 0 /*0x1f52*/
&& (*(__int64 (__fastcall **)(__int64, void *, __int64 *, __int64, _QWORD, int))(BootServices_0 + 280))(
a2,
&unk_59E8,
&PkgHdr,
a2,
0,
2) >= 0
&& (*(__int64 (__fastcall **)(void *, _QWORD, __int64 (__fastcall ***)(_QWORD, __int64, _QWORD, __int64 *)))(BootServices_0 + 320))(
&unk_5898,
0,
&PkgList) >= 0 )
{
for ( Iter = PkgHdr + 20; /*0x1f69*/
Iter < PkgHdr + (unsigned __int64)*(unsigned int *)(PkgHdr + 16) && *(_BYTE *)(Iter + 3) != 2;
Iter += *(_DWORD *)Iter & 0xFFFFFF )
{
; /*0x1f7f*/
}
RegisterFormEntries(HiiProto, Iter + 4, Arg); /*0x1fa1*/
if ( (*PkgList)(PkgList, PkgHdr, 0, &BufPtr) >= 0 ) /*0x1fbe*/
ModuleInit(BufPtr, 0); /*0x1fd5*/
}
}
// Function: BuildIfrBuffer @ 0x1fe8 (0x2e0 bytes)
unsigned __int64 __fastcall BuildIfrBuffer(
__int16 TypeId,
__int64 PkgList,
int PkgLen,
unsigned __int16 StrId,
__int64 TotalSize,
__int64 *OutBuf,
_DWORD *Status)
{
_DWORD *Status_1; // rdi
__int64 TotalSize_1; // r14
__int64 IfrPtr; // rax
__int64 *OutBuf_1; // r15
char Status_2; // bl
__int64 HdrPtr; // r13
__int64 BootServices; // rax
__int64 DataPtr; // r13
int Flags; // eax
_BYTE *BytePtr; // rsi
unsigned __int16 StrId_2; // r15
unsigned int Offset; // r12d
char Byte; // al
int Tmp; // ebx
int Len; // eax
__int64 Remaining; // rax
int Tag; // ecx
__int64 *OutBuf_2; // r15
bool IsLast; // [rsp+30h] [rbp-10h]
unsigned __int16 StrId_3; // [rsp+34h] [rbp-Ch] BYREF
int Flags_1; // [rsp+38h] [rbp-8h] BYREF
__int16 TypeId_1; // [rsp+80h] [rbp+40h] BYREF
unsigned __int16 StrId_1; // [rsp+98h] [rbp+58h]
StrId_1 = StrId; /*0x1fed*/
TypeId_1 = TypeId; /*0x1ff3*/
Status_1 = Status; /*0x200a*/
if ( !Status ) /*0x2014*/
return 0x8000000000000002uLL; /*0x2020*/
TotalSize_1 = TotalSize; /*0x2025*/
*Status = PkgLen; /*0x2029*/
if ( TotalSize_1 ) /*0x202f*/
*Status_1 = PkgLen + *(_DWORD *)(TotalSize_1 + 4); /*0x2038*/
IfrPtr = AllocPool((unsigned int)*Status_1); /*0x203c*/
OutBuf_1 = OutBuf; /*0x2041*/
*OutBuf = IfrPtr; /*0x2045*/
if ( !IfrPtr ) /*0x204b*/
return 0x8000000000000009uLL; /*0x2057*/
Status_2 = 0; /*0x205f*/
(*(void (__fastcall **)(__int64, __int64, __int64))(BootServices_0 + 352))(IfrPtr, PkgList, 4); /*0x2071*/
HdrPtr = *OutBuf_1; /*0x2077*/
BootServices = BootServices_0; /*0x207e*/
*Status_1 = 4; /*0x208b*/
DataPtr = HdrPtr + 4; /*0x208d*/
(*(void (__fastcall **)(int *, __int64, __int64))(BootServices + 352))(&Flags_1, PkgList, 4); /*0x2090*/
Flags = Flags_1; /*0x2096*/
BytePtr = (_BYTE *)(PkgList + 4); /*0x2099*/
StrId_2 = StrId_1; /*0x209c*/
Offset = 4; /*0x20a1*/
IsLast = 0; /*0x20a6*/
LOBYTE(Status) = 0; /*0x20aa*/
while ( Offset < (Flags & 0xFFFFFFu) ) /*0x20b8*/
{
(*(void (__fastcall **)(__int64, _BYTE *, _QWORD))(BootServices_0 + 352))(DataPtr, BytePtr, BytePtr[1] & 0x7F); /*0x20d4*/
Byte = BytePtr[1]; /*0x20de*/
*Status_1 += Byte & 0x7F; /*0x20e3*/
DataPtr += Byte & 0x7F; /*0x20eb*/
if ( *BytePtr == 1 ) /*0x20f1*/
{
IsLast = StrPrefixWide((unsigned __int64)(BytePtr + 2), &TypeId_1, 2u) == 0; /*0x2240*/
}
else if ( *BytePtr == 95 && IsLast ) /*0x210d*/
{
LogDebugMsg(0x400000, "EFI_IFR_GUID_OP 1\n"); /*0x211f*/
if ( !StrPrefixWide((unsigned __int64)(BytePtr + 2), &byte_5868, 0x10u) ) /*0x2135*/
{
Tmp = (unsigned __int8)BytePtr[18]; /*0x2143*/
(*(void (__fastcall **)(unsigned __int16 *, _BYTE *, __int64))(BootServices_0 + 352))(&StrId_3, BytePtr + 19, 2); /*0x215a*/
LogDebugMsg(0x400000, "EFI_IFR_GUID_OP 2 ExtendOpCode=%x LabelNumber=%x Label=%x\n", Tmp, StrId_3, StrId_2); /*0x217c*/
if ( !(_BYTE)Tmp && StrId_3 == StrId_2 ) /*0x218e*/
{
LogDebugMsg(0x400000, "EFI_IFR_GUID_OP 3\n"); /*0x21a2*/
Len = BytePtr[1] & 0x7F; /*0x21b0*/
BytePtr += BytePtr[1] & 0x7F; /*0x21b3*/
Offset += Len; /*0x21b6*/
if ( TotalSize_1 ) /*0x21bc*/
{
LogDebugMsg(0x400000, "EFI_IFR_GUID_OP 4\n"); /*0x21c7*/
(*(void (__fastcall **)(__int64, _QWORD, _QWORD))(BootServices_0 + 352))( /*0x21de*/
DataPtr,
*(_QWORD *)(TotalSize_1 + 8),
*(unsigned int *)(TotalSize_1 + 4));
Remaining = *(unsigned int *)(TotalSize_1 + 4); /*0x21e4*/
DataPtr += Remaining; /*0x21e8*/
*Status_1 += Remaining; /*0x21eb*/
}
(*(void (__fastcall **)(__int64, _BYTE *, _QWORD))(BootServices_0 + 352))( /*0x2208*/
DataPtr,
BytePtr,
(Flags_1 & 0xFFFFFF) - Offset);
Flags = Flags_1; /*0x220e*/
Status_2 = 1; /*0x2211*/
LOBYTE(Status) = 1; /*0x2215*/
*Status_1 += (Flags_1 & 0xFFFFFF) - Offset; /*0x2221*/
goto LABEL_21; /*0x2223*/
}
Status_2 = (char)Status; /*0x2225*/
}
}
Flags = Flags_1; /*0x2244*/
LABEL_21:
Tag = BytePtr[1] & 0x7F; /*0x2247*/
BytePtr += BytePtr[1] & 0x7F; /*0x2253*/
Offset += Tag; /*0x2256*/
if ( Status_2 ) /*0x225b*/
break; /*0x225b*/
}
OutBuf_2 = OutBuf; /*0x2261*/
Flags_1 = (Flags ^ *Status_1) & 0xFFFFFF ^ Flags; /*0x227b*/
(*(void (__fastcall **)(_QWORD, int *, __int64))(BootServices_0 + 352))(*OutBuf, &Flags_1, 4); /*0x2288*/
if ( Status_2 ) /*0x2290*/
return 0; /*0x22ae*/
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(*OutBuf_2); /*0x229c*/
*Status_1 = 0; /*0x229f*/
return 0x800000000000000EuLL; /*0x22b8*/
}
// Function: ExportPackageList @ 0x22c8 (0x2d4 bytes)
__int64 __fastcall ExportPackageList(__int64 BufPtr, __int16 TypeId, unsigned __int16 StrId, __int64 TotalSize)
{
__int64 Buffer; // rdi
__int64 v7; // rbx
__int64 Buffer_1; // rcx
__int64 Buffer_4; // rsi
__int64 HiiHandle; // r14
int PkgType; // r12d
unsigned int Offset; // ebx
int PkgType_1; // esi
__int64 PkgList; // r13
unsigned int PkgLen; // r15d
__int64 Status_1; // rbx
__int64 Buffer_2; // rsi
char IsForm; // [rsp+40h] [rbp-29h]
unsigned int n0x14; // [rsp+44h] [rbp-25h] BYREF
int PkgType_2; // [rsp+48h] [rbp-21h]
__int64 v22; // [rsp+50h] [rbp-19h] BYREF
int Result; // [rsp+58h] [rbp-11h] BYREF
int TmpInt; // [rsp+5Ch] [rbp-Dh] BYREF
unsigned int Status; // [rsp+60h] [rbp-9h] BYREF
__int64 v26; // [rsp+68h] [rbp-1h] BYREF
__int64 OutBuf; // [rsp+70h] [rbp+7h] BYREF
__int64 Buffer_3; // [rsp+78h] [rbp+Fh]
(*(void (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_57E0, 0, &v26); /*0x230d*/
v22 = 0; /*0x231b*/
Buffer = 0; /*0x2329*/
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64 *, _QWORD))(v26 + 32))(v26, BufPtr, &v22, 0) != 0x8000000000000005uLL ) /*0x233b*/
goto LABEL_6; /*0x233b*/
Buffer = AllocPool(v22); /*0x2346*/
if ( !Buffer ) /*0x234c*/
AssertMsg( /*0x2361*/
(__int64)"e:\\hs\\AmiModulePkg\\FixedBootOrder\\FboGroupForm\\FixedBootOrderHii.c",
374,
(__int64)"HiiPackageList != ((void *) 0)");
v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *, __int64))(v26 + 32))(v26, BufPtr, &v22, Buffer); /*0x237b*/
if ( v7 < 0 ) /*0x2381*/
{
Buffer_1 = Buffer; /*0x2383*/
}
else
{
LABEL_6:
v22 += *(unsigned int *)(TotalSize + 4); /*0x2395*/
Buffer_3 = AllocPool(v22); /*0x239e*/
Buffer_4 = Buffer_3; /*0x23a2*/
if ( !Buffer_3 ) /*0x23a8*/
return 0x8000000000000009uLL; /*0x23b4*/
(*(void (__fastcall **)(__int64, __int64, __int64))(BootServices_0 + 352))(Buffer_3, Buffer, 20); /*0x23cc*/
PkgType_2 = 0; /*0x23d2*/
HiiHandle = Buffer_4 + 20; /*0x23d6*/
IsForm = 0; /*0x23da*/
while ( 1 ) /*0x23de*/
{
Result = 0; /*0x23de*/
if ( !Buffer ) /*0x23e9*/
AssertMsg( /*0x23fc*/
(__int64)"e:\\hs\\AmiModulePkg\\FixedBootOrder\\FboGroupForm\\FixedBootOrderHii.c",
102,
(__int64)"HiiPackageList != ((void *) 0)");
PkgType = 0; /*0x240c*/
Offset = 20; /*0x2417*/
(*(void (__fastcall **)(unsigned int *, __int64, __int64))(BootServices_0 + 352))(&n0x14, Buffer + 16, 4); /*0x241c*/
if ( n0x14 <= 0x14 ) /*0x2425*/
break; /*0x2425*/
PkgType_1 = PkgType_2; /*0x242b*/
do /*0x2467*/
{
PkgList = Buffer + Offset; /*0x2442*/
(*(void (__fastcall **)(int *, __int64, __int64))(BootServices_0 + 352))(&Result, PkgList, 4); /*0x2448*/
if ( PkgType == PkgType_1 ) /*0x2455*/
break; /*0x2455*/
++PkgType; /*0x245a*/
Offset += Result & 0xFFFFFF; /*0x2462*/
}
while ( Offset < n0x14 ); /*0x2467*/
if ( Offset >= n0x14 ) /*0x246c*/
break; /*0x246c*/
PkgLen = Result & 0xFFFFFF; /*0x2486*/
(*(void (__fastcall **)(int *, __int64, __int64))(BootServices_0 + 352))(&TmpInt, PkgList, 4); /*0x248d*/
if ( (TmpInt & 0xFF000000) != 0x2000000 /*0x24da*/
|| IsForm
|| (BuildIfrBuffer(TypeId, PkgList, PkgLen, StrId, TotalSize, &OutBuf, &Status) & 0x8000000000000000uLL) != 0LL )
{
(*(void (__fastcall **)(__int64, __int64, _QWORD))(BootServices_0 + 352))(HiiHandle, PkgList, PkgLen); /*0x2520*/
HiiHandle += PkgLen; /*0x2526*/
}
else
{
Status_1 = Status; /*0x24e6*/
IsForm = 1; /*0x24f0*/
(*(void (__fastcall **)(__int64, __int64, _QWORD))(BootServices_0 + 352))(HiiHandle, OutBuf, Status); /*0x24f4*/
HiiHandle += Status_1; /*0x2501*/
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(OutBuf); /*0x2508*/
}
++PkgType_2; /*0x2529*/
}
Buffer_2 = Buffer_3; /*0x2531*/
v22 = HiiHandle - Buffer_3; /*0x2549*/
(*(void (__fastcall **)(__int64, __int64 *, __int64))(BootServices_0 + 352))(Buffer_3 + 16, &v22, 4); /*0x2551*/
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(Buffer); /*0x2561*/
v7 = (*(__int64 (__fastcall **)(__int64, __int64, __int64))(v26 + 16))(v26, BufPtr, Buffer_2); /*0x2575*/
Buffer_1 = Buffer_2; /*0x2578*/
}
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(Buffer_1); /*0x2582*/
return v7; /*0x2588*/
}
// Function: HiiNewString @ 0x259c (0x72 bytes)
__int64 __fastcall HiiNewString(__int64 *p_Buffer, __int16 FormPackage, __int16 IdxB, __int16 IdxC, __int16 Byte2)
{
__int64 Buffer; // rcx
_WORD v8[7]; // [rsp+20h] [rbp-30h] BYREF
__int64 v9; // [rsp+2Eh] [rbp-22h]
__int64 v10; // [rsp+36h] [rbp-1Ah]
__int64 v11; // [rsp+3Eh] [rbp-12h]
v8[1] = Byte2; /*0x25b0*/
v8[5] = IdxB; /*0x25bb*/
v9 = 0; /*0x25c0*/
v10 = 0; /*0x25c4*/
v11 = 0; /*0x25c8*/
v8[2] = 5; /*0x25d7*/
Buffer = *p_Buffer; /*0x25db*/
v8[4] = FormPackage; /*0x25de*/
v8[0] = -23035; /*0x25e6*/
v8[3] = IdxC; /*0x25ec*/
v8[6] = 4100; /*0x25f1*/
(*(void (__fastcall **)(__int64, _WORD *, __int64))(BootServices_0 + 352))(Buffer, v8, 38); /*0x25f7*/
*p_Buffer += 38; /*0x25fd*/
return 0; /*0x2608*/
}
// Function: HiiGetString @ 0x2610 (0x45 bytes)
EFI_STRING __cdecl HiiGetString(EFI_HII_HANDLE HiiHandle, EFI_STRING_ID StringId, const CHAR8 *Language)
{
__int16 v3; // r9
__int64 v5; // rcx
__int16 n7177; // [rsp+20h] [rbp-28h] BYREF
__int16 v8; // [rsp+22h] [rbp-26h]
__int16 v9; // [rsp+24h] [rbp-24h]
char Language_1; // [rsp+26h] [rbp-22h]
v9 = 0; /*0x2618*/
Language_1 = (char)Language; /*0x2621*/
v5 = *(_QWORD *)HiiHandle; /*0x2628*/
n7177 = 7177; /*0x2631*/
v8 = v3; /*0x2637*/
(*(void (__fastcall **)(__int64, __int16 *, __int64))(BootServices_0 + 352))(v5, &n7177, 28); /*0x2643*/
*(_QWORD *)HiiHandle += 28LL; /*0x2649*/
return 0; /*0x264f*/
}
// Function: ExportPackageLists @ 0x2658 (0x10c bytes)
__int64 __fastcall ExportPackageLists(__int64 BufPtr)
{
__int64 result; // rax
__int64 Status; // rbx
__int64 Result; // rax
_DWORD Guid[4]; // [rsp+20h] [rbp-10h] BYREF
__int64 HiiHandle; // [rsp+48h] [rbp+18h] BYREF
Guid[0] = -274742926; /*0x2678*/
Guid[1] = 1184080306; /*0x2681*/
Guid[2] = 846014387; /*0x268c*/
Guid[3] = 1113604604; /*0x2693*/
result = (*(__int64 (__fastcall **)(_DWORD *, _QWORD, __int64 *))(BootServices_0 + 320))(Guid, 0, &HiiHandle); /*0x269a*/
if ( result >= 0 ) /*0x26a3*/
{
PkgList = AllocPool(qword_5878); /*0x26b5*/
Status = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *, __int64))(HiiHandle + 32))( /*0x26e2*/
HiiHandle,
BufPtr,
&qword_5878,
PkgList);
LogDebugMsg(0x400000, "[FixedBootOrderHii.c] ExportPackageLists...%r\n", Status); /*0x26e5*/
result = 0x8000000000000005uLL; /*0x26ea*/
if ( Status == 0x8000000000000005uLL ) /*0x26f7*/
{
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(PkgList); /*0x2707*/
result = AllocPool(qword_5878); /*0x2711*/
PkgList = result; /*0x2716*/
if ( result ) /*0x2720*/
{
Result = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *, __int64))(HiiHandle + 32))( /*0x2736*/
HiiHandle,
BufPtr,
&qword_5878,
result);
return LogDebugMsg( /*0x274f*/
0x400000,
"[FixedBootOrderHii.c] Again ExportPackageLists...%r size=%x\n",
Result,
qword_5878);
}
}
}
return result; /*0x275e*/
}
// Function: FindFormPackage @ 0x2764 (0xf7 bytes)
__int64 FindFormPackage()
{
__int64 PkgList; // rcx
unsigned int Offset; // esi
unsigned int Pos; // ebx
__int64 PkgHdr; // rdi
int PkgType; // eax
__int64 IfrPtr; // rdx
_BYTE *StrPtr; // rax
char Ch; // r8
const char *FixedBoot; // rcx
int NextOff; // eax
PkgList = ::PkgList; /*0x2778*/
Offset = 0; /*0x2781*/
if ( !::PkgList ) /*0x2786*/
return 0; /*0x2786*/
Pos = 20; /*0x2788*/
if ( *(_DWORD *)(::PkgList + 16) <= 0x14u ) /*0x278e*/
return 0; /*0x27e1*/
while ( 1 ) /*0x2799*/
{
PkgHdr = PkgList + Pos; /*0x2799*/
LogDebugMsg( /*0x27b7*/
0x400000,
"[FixedBootOrderHii.c] pkgHdr=%x Type=%x Length=%x\n",
Pos,
*(unsigned __int8 *)(PkgHdr + 3),
*(_DWORD *)PkgHdr & 0xFFFFFF);
PkgType = *(unsigned __int8 *)(PkgHdr + 3); /*0x27bc*/
if ( PkgType == 2 ) /*0x27c3*/
break; /*0x27c3*/
if ( PkgType != 223 ) /*0x27ca*/
{
PkgList = ::PkgList; /*0x27ce*/
Pos += *(_DWORD *)PkgHdr & 0xFFFFFF; /*0x27da*/
if ( Pos < *(_DWORD *)(::PkgList + 16) ) /*0x27df*/
continue; /*0x27df*/
}
return 0; /*0x27df*/
}
IfrPtr = PkgHdr + 4; /*0x27fc*/
while ( 1 ) /*0x2807*/
{
if ( *(_BYTE *)IfrPtr == 36 ) /*0x280a*/
{
StrPtr = (_BYTE *)(IfrPtr + 22); /*0x280c*/
Ch = 70; /*0x2810*/
FixedBoot = "FixedBoot"; /*0x2813*/
do /*0x2825*/
{
if ( Ch != *StrPtr ) /*0x281d*/
break; /*0x281d*/
++FixedBoot; /*0x281f*/
++StrPtr; /*0x2822*/
Ch = *FixedBoot; /*0x2825*/
}
while ( *FixedBoot ); /*0x2825*/
if ( *FixedBoot == (char)*StrPtr ) /*0x2835*/
break; /*0x2835*/
}
NextOff = *(_BYTE *)(IfrPtr + 1) & 0x7F; /*0x2840*/
IfrPtr += *(_BYTE *)(IfrPtr + 1) & 0x7F; /*0x2843*/
Offset += NextOff; /*0x2846*/
if ( (*(_BYTE *)(IfrPtr + 1) & 0x7F) == 0 || Offset >= (*(_DWORD *)PkgHdr & 0xFFFFFFu) ) /*0x2851*/
return 0; /*0x2851*/
}
return *(unsigned __int16 *)(IfrPtr + 18); /*0x27f3*/
}
// Function: StrLenWide @ 0x285c (0x7f bytes)
__int64 StrLenWide()
{
__int64 result; // rax
unsigned __int64 n0x10; // rbx
__int64 v2; // rax
__int64 v3; // rcx
result = qword_5EF8; /*0x2866*/
if ( !qword_5EF8 ) /*0x2872*/
{
n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(31); /*0x288b*/
(*(void (__fastcall **)(unsigned __int64))(BootServices + 32))(n0x10); /*0x288e*/
if ( n0x10 <= 0x10 ) /*0x2895*/
{
v2 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_57C0, 0, &qword_5EF8); /*0x28b2*/
v3 = qword_5EF8; /*0x28b8*/
if ( v2 < 0 ) /*0x28c2*/
v3 = 0; /*0x28c2*/
qword_5EF8 = v3; /*0x28c6*/
return v3; /*0x28cd*/
}
else
{
return 0; /*0x2897*/
}
}
return result; /*0x28d5*/
}
// Function: LogDebugMsg @ 0x28dc (0x47 bytes)
__int64 LogDebugMsg(__int64 a1, const char *a2, ...)
{
__int64 result; // rax
__int64 (__fastcall **v4)(__int64, const char *, __int64 *); // r10
va_list va; // [rsp+40h] [rbp+18h] BYREF
va_start(va, a2);
result = StrLenWide(); /*0x28f3*/
if ( result ) /*0x28fe*/
{
result = GetDebugLevelMask(); /*0x2900*/
if ( ((unsigned int)result & (unsigned int)a1) != 0 ) /*0x290b*/
return (*v4)(a1, a2, (__int64 *)va); /*0x291a*/
}
return result; /*0x291d*/
}
// Function: AssertMsg @ 0x2924 (0x3e bytes)
__int64 __fastcall AssertMsg(__int64 a1, __int64 a2, __int64 a3)
{
__int64 result; // rax
result = StrLenWide(); /*0x293c*/
if ( result ) /*0x2944*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64))(result + 8))(a1, a2, a3); /*0x294f*/
return result; /*0x295c*/
}
// Function: DebugPrint @ 0x2964 (0xd6 bytes)
void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
__int64 SystemTable; // rdi
unsigned __int64 Status; // rbx
__int64 Result; // rsi
__int64 Ptr; // rax
if ( !::Ptr ) /*0x297d*/
{
SystemTable = SystemTable; /*0x2983*/
Status = 0; /*0x298a*/
::Ptr = 0; /*0x298c*/
if ( *(_QWORD *)(SystemTable + 104) ) /*0x2993*/
{
Result = 0; /*0x2999*/
while ( !IsEqualGuid(ErrorLevel, Result + *(_QWORD *)(SystemTable + 112)) ) /*0x29a9*/
{
++Status; /*0x29ab*/
Result += 24; /*0x29ae*/
if ( Status >= *(_QWORD *)(SystemTable + 104) ) /*0x29b6*/
goto LABEL_6; /*0x29b6*/
}
Ptr = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * Status + 16); /*0x2a2c*/
::Ptr = Ptr; /*0x2a31*/
}
else
{
LABEL_6:
LogDebugMsg(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", 0x800000000000000EuLL); /*0x29b8*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x29e6*/
Ptr = ::Ptr; /*0x29eb*/
}
if ( !Ptr ) /*0x29f5*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x2a08*/
}
}
// Function: CopyWideString @ 0x2a3c (0xe1 bytes)
__int64 CopyWideString()
{
__int64 v1; // rcx
unsigned __int64 n0x10; // rbx
__int64 SrcPtr; // rax
if ( byte_5F18 ) /*0x2a4f*/
{
if ( qword_5F20 ) /*0x2a58*/
return 0; /*0x2a5c*/
if ( !qword_5F28 ) /*0x2a6b*/
return 0x8000000000000003uLL; /*0x2a6b*/
v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(qword_5F28 + 208))(&unk_57D0, 0, &qword_5F20); /*0x2a92*/
if ( v1 < 0 ) /*0x2a98*/
qword_5F20 = 0; /*0x2a9a*/
}
else
{
if ( ::SrcPtr ) /*0x2aaa*/
return 0; /*0x2aaa*/
if ( byte_5F19 == 1 ) /*0x2ab3*/
return 0x8000000000000003uLL; /*0x2ab3*/
n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices_0 + 24))(31); /*0x2ace*/
(*(void (__fastcall **)(unsigned __int64))(BootServices_0 + 32))(n0x10); /*0x2ad1*/
if ( n0x10 > 0x10 ) /*0x2ad8*/
return 0x8000000000000003uLL; /*0x2a77*/
v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_57C0, 0, &::SrcPtr); /*0x2af7*/
SrcPtr = ::SrcPtr; /*0x2afa*/
if ( v1 < 0 ) /*0x2b04*/
SrcPtr = 0; /*0x2b04*/
::SrcPtr = SrcPtr; /*0x2b08*/
}
return v1; /*0x2b17*/
}
// Function: LogErrorMsg @ 0x2b20 (0x8a bytes)
__int64 LogErrorMsg(__int64 a1, char *HII_Extract_Config:_Guid_extraction_failed_n, ...)
{
__int64 result; // rax
__int64 (__fastcall **v4)(__int64, char *, __int64 *); // r9
char v5; // r10
char *HII_Extract_Config:_Guid_extraction_failed_n_1; // rdx
__int64 v8; // [rsp+40h] [rbp+18h] BYREF
va_list va; // [rsp+40h] [rbp+18h]
__int64 v10; // [rsp+48h] [rbp+20h]
va_list va1; // [rsp+50h] [rbp+28h] BYREF
va_start(va1, HII_Extract_Config:_Guid_extraction_failed_n);
va_start(va, HII_Extract_Config:_Guid_extraction_failed_n);
v8 = va_arg(va1, _QWORD); /*0x2b20*/
v10 = va_arg(va1, _QWORD); /*0x2b20*/
result = CopyWideString(); /*0x2b37*/
if ( result >= 0 ) /*0x2b42*/
{
result = GetDebugLevelMask(); /*0x2b5a*/
if ( v4 ) /*0x2b62*/
{
if ( ((unsigned int)a1 & (unsigned int)result) != 0 ) /*0x2b66*/
{
HII_Extract_Config:_Guid_extraction_failed_n_1 = HII_Extract_Config:_Guid_extraction_failed_n; /*0x2b68*/
if ( *HII_Extract_Config:_Guid_extraction_failed_n != v5 ) /*0x2b70*/
{
do /*0x2b92*/
{
if ( *HII_Extract_Config:_Guid_extraction_failed_n_1 == 37 ) /*0x2b75*/
{
if ( *++HII_Extract_Config:_Guid_extraction_failed_n_1 == 115 ) /*0x2b7d*/
{
*HII_Extract_Config:_Guid_extraction_failed_n_1 = 97; /*0x2b7f*/
}
else if ( *HII_Extract_Config:_Guid_extraction_failed_n_1 == 71 ) /*0x2b87*/
{
*HII_Extract_Config:_Guid_extraction_failed_n_1 = 103; /*0x2b89*/
}
}
++HII_Extract_Config:_Guid_extraction_failed_n_1; /*0x2b8c*/
}
while ( *HII_Extract_Config:_Guid_extraction_failed_n_1 != v5 ); /*0x2b92*/
HII_Extract_Config:_Guid_extraction_failed_n_1 = HII_Extract_Config:_Guid_extraction_failed_n; /*0x2b94*/
}
return (*v4)(a1, HII_Extract_Config:_Guid_extraction_failed_n_1, (__int64 *)va); /*0x2ba1*/
}
}
}
return result; /*0x2ba4*/
}
// Function: AllocCopyStr @ 0x2bac (0x2b bytes)
__int64 __fastcall AllocCopyStr(__int64 a1)
{
__int64 v2; // [rsp+38h] [rbp+10h] BYREF
v2 = 0; /*0x2bbc*/
(*(void (__fastcall **)(__int64, __int64, __int64 *))(BootServices_0 + 64))(4, a1, &v2); /*0x2bca*/
return v2; /*0x2bd2*/
}
// Function: AllocPool @ 0x2bd8 (0x3e bytes)
__int64 __fastcall AllocPool(__int64 a1)
{
__int64 result; // rax
__int64 v3; // rbx
result = AllocCopyStr(a1); /*0x2be5*/
v3 = result; /*0x2bea*/
if ( result ) /*0x2bf0*/
{
(*(void (__fastcall **)(__int64, __int64, _QWORD))(BootServices_0 + 360))(result, a1, 0); /*0x2c02*/
return v3; /*0x2c08*/
}
return result; /*0x2c10*/
}
// Function: MemCpy @ 0x2c18 (0x52 bytes)
__int64 __fastcall MemCpy(_BYTE *src)
{
_BYTE *src_1; // rdx
__int64 v3; // r8
__int64 v4; // r10
src_1 = src; /*0x2c18*/
if ( !src ) /*0x2c1e*/
return 0; /*0x2c20*/
v3 = 0; /*0x2c23*/
while ( 1 ) /*0x2c26*/
{
if ( *src_1 == 127 && src_1[1] == 0xFF ) /*0x2c2f*/
return v3 + 4; /*0x2c65*/
v4 = (unsigned __int8)src_1[2]; /*0x2c36*/
if ( !*src_1 || !((_DWORD)v4 + ((unsigned __int8)src_1[3] << 8)) ) /*0x2c41*/
break; /*0x2c41*/
v3 += (unsigned int)v4 + ((unsigned __int8)src_1[3] << 8); /*0x2c4f*/
src_1 += 256 * (unsigned __int64)(unsigned __int8)src_1[3] + v4; /*0x2c5c*/
}
return v3; /*0x2c22*/
}
// Function: InitStringPrint @ 0x2c6c (0xd5 bytes)
char *__fastcall InitStringPrint(char *src, char *src_2)
{
char *src_1; // rdi
unsigned __int64 n8; // rbx
char *dst; // rax
char *dst_2; // r14
char *dst_1; // r15
src_1 = src; /*0x2c88*/
if ( src_2 ) /*0x2c8e*/
{
if ( src ) /*0x2ca9*/
n8 = MemCpy(src) - 4; /*0x2cb0*/
else
n8 = 0; /*0x2cb6*/
dst = (char *)AllocCopyStr(n8 + ((unsigned __int64)(unsigned __int8)src_2[3] << 8) + (unsigned __int8)src_2[2] + 4LL); /*0x2cce*/
dst_2 = dst; /*0x2cd3*/
dst_1 = dst; /*0x2cd6*/
if ( n8 ) /*0x2cdc*/
{
MemMove(dst, src_1, n8); /*0x2ce7*/
dst_1 += n8; /*0x2cec*/
}
MemMove(dst_1, src_2, (unsigned __int8)src_2[2] + ((unsigned __int64)(unsigned __int8)src_2[3] << 8)); /*0x2d06*/
*(_DWORD *)&dst_1[256 * (unsigned __int64)(unsigned __int8)src_2[3] + (unsigned __int8)src_2[2]] = dword_5880; /*0x2d20*/
return dst_2; /*0x2d23*/
}
else
{
if ( !src ) /*0x2c93*/
src = (char *)&dword_5880; /*0x2c95*/
return StrCmpWide(src); /*0x2c9c*/
}
}
// Function: StrCmpWide @ 0x2d44 (0x46 bytes)
char *__fastcall StrCmpWide(char *src)
{
__int64 n8; // rbx
char *dst; // rdi
n8 = MemCpy(src); /*0x2d5e*/
dst = (char *)AllocCopyStr(n8); /*0x2d6f*/
MemMove(dst, src, n8); /*0x2d72*/
return dst; /*0x2d84*/
}
// Function: GetHiiVariable @ 0x2d8c (0xbe bytes)
__int64 __fastcall GetHiiVariable(__int64 a1, __int64 a2, __int64 a3, __int64 *a4, __int64 *a5)
{
__int64 result; // rax
__int64 v10; // rax
if ( !*a5 ) /*0x2db6*/
*a4 = 0; /*0x2dbc*/
result = (*(__int64 (__fastcall **)(__int64))(RuntimeServices_0 + 72))(a1); /*0x2dcf*/
if ( result == 0x8000000000000005uLL ) /*0x2dd5*/
{
if ( *a5 ) /*0x2de6*/
(*(void (**)(void))(BootServices_0 + 72))(); /*0x2df5*/
v10 = AllocCopyStr(*a4); /*0x2dfb*/
*a5 = v10; /*0x2e00*/
if ( v10 ) /*0x2e06*/
return (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64 *, __int64))(RuntimeServices_0 + 72))( /*0x2e2c*/
a1,
a2,
a3,
a4,
v10);
else
return 0x8000000000000009uLL; /*0x2e08*/
}
return result; /*0x2e43*/
}
// Function: StrPrefixWide @ 0x2e4c (0x78 bytes)
__int64 __fastcall StrPrefixWide(unsigned __int64 a1, _BYTE *a2, unsigned __int64 n8)
{
unsigned __int64 v3; // r10
unsigned __int64 n8_1; // r9
unsigned __int64 v5; // r8
v3 = a1 + n8; /*0x2e52*/
if ( n8 >= 8 ) /*0x2e59*/
{
n8_1 = a1 & 7; /*0x2e5e*/
if ( (a1 & 7) != 0 && n8_1 == ((unsigned __int8)a2 & 7) ) /*0x2e6d*/
{
v5 = 8 - n8_1; /*0x2e72*/
if ( n8_1 != 8 ) /*0x2e75*/
{
do /*0x2e87*/
{
if ( *(_BYTE *)a1 != *a2 ) /*0x2e7b*/
break; /*0x2e7b*/
++a1; /*0x2e7d*/
++a2; /*0x2e80*/
--v5; /*0x2e83*/
}
while ( v5 ); /*0x2e87*/
}
}
while ( a1 <= v3 - 8 && *(_QWORD *)a1 == *(_QWORD *)a2 ) /*0x2e95*/
{
a1 += 8LL; /*0x2e97*/
a2 += 8; /*0x2e9a*/
}
}
while ( 1 ) /*0x2eb0*/
{
if ( a1 >= v3 ) /*0x2eb3*/
return 0; /*0x2eb7*/
if ( *(_BYTE *)a1 != *a2 ) /*0x2ea8*/
break; /*0x2ea8*/
++a1; /*0x2eaa*/
++a2; /*0x2ead*/
}
return *(char *)a1 - (char)*a2; /*0x2eb7*/
}
// Function: GetHiiCurrLang @ 0x2ec4 (0x73 bytes)
const char *GetHiiCurrLang()
{
__int64 en_US; // rax
const char *en_US_1; // rbx
__int64 v3; // [rsp+48h] [rbp+10h] BYREF
en_US = en_US_0; /*0x2ed0*/
en_US_1 = "en-US"; /*0x2ed7*/
v3 = 0; /*0x2ee7*/
if ( (const char *)en_US_0 == "en-US" ) /*0x2ef2*/
en_US = 0; /*0x2ef2*/
en_US_0 = en_US; /*0x2efd*/
if ( GetHiiVariable((__int64)L"PlatformLang", (__int64)&unk_58A8, 0, &v3, &en_US_0) >= 0 ) /*0x2f1a*/
en_US_1 = (const char *)en_US_0; /*0x2f1a*/
en_US_0 = (__int64)en_US_1; /*0x2f22*/
return en_US_1; /*0x2f31*/
}
// Function: DecodeHexString @ 0x2f38 (0x1a9 bytes)
__int64 __fastcall DecodeHexString(__int64 a1, unsigned __int64 *p_n32, _QWORD *Store)
{
_WORD *StrPtr; // r10
unsigned __int64 Idx; // r9
__int16 Ch0; // cx
__int16 Ch1; // cx
__int16 Ch2; // cx
__int16 Ch3; // cx
char NibA; // cl
char NibB; // cl
__int16 NibC; // dx
char NibD; // cl
unsigned __int8 NibE; // cl
__int16 NibF; // r8
char NibG; // cl
unsigned __int8 NibH; // cl
__int16 NibI; // dx
char NibJ; // cl
unsigned __int8 NibK; // cl
StrPtr = (_WORD *)(a1 + 4); /*0x2f40*/
for ( Idx = 0; ; ++Idx ) /*0x2f49*/
{
Ch0 = *(StrPtr - 2); /*0x2f4c*/
if ( (unsigned __int16)(Ch0 - 48) > 0x36u ) /*0x2f58*/
break; /*0x2f58*/
if ( (unsigned __int16)(Ch0 - 58) <= 6u ) /*0x2f65*/
break; /*0x2f65*/
if ( (unsigned __int16)(Ch0 - 71) <= 0x19u ) /*0x2f73*/
break; /*0x2f73*/
Ch1 = *(StrPtr - 1); /*0x2f79*/
if ( (unsigned __int16)(Ch1 - 48) > 0x36u ) /*0x2f85*/
break; /*0x2f85*/
if ( (unsigned __int16)(Ch1 - 58) <= 6u ) /*0x2f92*/
break; /*0x2f92*/
if ( (unsigned __int16)(Ch1 - 71) <= 0x19u ) /*0x2fa0*/
break; /*0x2fa0*/
Ch2 = *StrPtr; /*0x2fa6*/
if ( (unsigned __int16)(*StrPtr - 48) > 0x36u ) /*0x2fb1*/
break; /*0x2fb1*/
if ( (unsigned __int16)(Ch2 - 58) <= 6u ) /*0x2fbe*/
break; /*0x2fbe*/
if ( (unsigned __int16)(Ch2 - 71) <= 0x19u ) /*0x2fcc*/
break; /*0x2fcc*/
Ch3 = StrPtr[1]; /*0x2fd2*/
if ( (unsigned __int16)(Ch3 - 48) > 0x36u /*0x3008*/
|| (unsigned __int16)(Ch3 - 58) <= 6u
|| (unsigned __int16)(Ch3 - 71) <= 0x19u
|| Idx >= *p_n32 - 1 )
{
break; /*0x3008*/
}
NibA = *((_BYTE *)StrPtr - 4); /*0x300e*/
if ( (unsigned __int8)(NibA - 48) > 9u ) /*0x3017*/
{
if ( (unsigned __int8)(NibA - 65) > 5u ) /*0x3023*/
NibB = NibA - 87; /*0x302a*/
else
NibB = NibA - 55; /*0x3025*/
}
else
{
NibB = NibA - 48; /*0x3019*/
}
NibC = 16 * (NibB & 0xF); /*0x3033*/
*((_WORD *)Store + Idx) = NibC; /*0x3037*/
NibD = *((_BYTE *)StrPtr - 2); /*0x303c*/
if ( (unsigned __int8)(NibD - 48) > 9u ) /*0x3045*/
{
if ( (unsigned __int8)(NibD - 65) > 5u ) /*0x3051*/
NibE = NibD - 87; /*0x3058*/
else
NibE = NibD - 55; /*0x3053*/
}
else
{
NibE = NibD - 48; /*0x3047*/
}
NibF = 16 * (NibC | NibE); /*0x3063*/
*((_WORD *)Store + Idx) = NibF; /*0x3068*/
NibG = *(_BYTE *)StrPtr; /*0x306d*/
if ( (unsigned __int8)(*(_BYTE *)StrPtr - 48) > 9u ) /*0x3075*/
{
if ( (unsigned __int8)(NibG - 65) > 5u ) /*0x3081*/
NibH = NibG - 87; /*0x3088*/
else
NibH = NibG - 55; /*0x3083*/
}
else
{
NibH = NibG - 48; /*0x3077*/
}
NibI = 16 * (NibF | NibH); /*0x3092*/
*((_WORD *)Store + Idx) = NibI; /*0x3096*/
NibJ = *((_BYTE *)StrPtr + 2); /*0x309b*/
if ( (unsigned __int8)(NibJ - 48) > 9u ) /*0x30a4*/
{
if ( (unsigned __int8)(NibJ - 65) > 5u ) /*0x30b0*/
NibK = NibJ - 87; /*0x30b7*/
else
NibK = NibJ - 55; /*0x30b2*/
}
else
{
NibK = NibJ - 48; /*0x30a6*/
}
StrPtr += 4; /*0x30bd*/
*((_WORD *)Store + Idx) = NibI | NibK; /*0x30c4*/
}
*p_n32 = Idx; /*0x30d1*/
*((_WORD *)Store + Idx) = 0; /*0x30db*/
return 0; /*0x30e0*/
}
// Function: HexStrToBytes @ 0x30e4 (0x7d bytes)
__int64 __fastcall HexStrToBytes(__int64 a1, unsigned __int64 n32, _BYTE *n4)
{
unsigned __int64 n32_1; // r9
__int64 v5; // r11
__int64 n32_2; // rbx
char v7; // dl
char v8; // dl
__int64 result; // rax
char v10; // cl
n32_1 = 0; /*0x30e9*/
v5 = a1; /*0x30ef*/
if ( n32 ) /*0x30f5*/
{
n32_2 = n32 - 1; /*0x30f7*/
do /*0x3159*/
{
if ( n32_1 == n32_2 ) /*0x30fe*/
{
LOBYTE(a1) = *(_BYTE *)(v5 + 2 * n32_1); /*0x3100*/
v7 = 0; /*0x3104*/
}
else
{
v8 = *(_BYTE *)(v5 + 2 * n32_1); /*0x3108*/
if ( (unsigned __int8)(v8 - 48) > 9u ) /*0x3111*/
{
if ( (unsigned __int8)(v8 - 65) > 5u ) /*0x311d*/
v7 = v8 - 87; /*0x3124*/
else
v7 = v8 - 55; /*0x311f*/
}
else
{
v7 = v8 - 48; /*0x3113*/
}
LOBYTE(a1) = *(_BYTE *)(v5 + 2 * n32_1 + 2); /*0x3127*/
}
result = (unsigned int)(a1 - 48); /*0x312c*/
if ( (unsigned __int8)(a1 - 48) > 9u ) /*0x3131*/
{
result = (unsigned int)(a1 - 65); /*0x3138*/
if ( (unsigned __int8)(a1 - 65) > 5u ) /*0x313d*/
v10 = a1 - 87; /*0x3144*/
else
v10 = a1 - 55; /*0x313f*/
}
else
{
v10 = a1 - 48; /*0x3133*/
}
n32_1 += 2LL; /*0x314a*/
*n4++ = v10 | (16 * v7); /*0x3150*/
}
while ( n32_1 < n32 ); /*0x3159*/
}
return result; /*0x3160*/
}
// Function: ParseDevicePath @ 0x3164 (0x165 bytes)
__int64 __fastcall ParseDevicePath(__int16 *ConfigStr, _BYTE *GUIDArr)
{
__int64 Idx; // rbx
__int16 *ConfigStr_1; // rsi
__int16 Ch; // ax
__int16 *Ptr; // rdi
unsigned __int64 HexLen; // rsi
__int16 *i; // rdx
__int16 HexCh; // cx
unsigned __int64 BufSize; // rbx
__int64 result; // rax
unsigned __int64 DstBuf_1; // rcx
__int64 Status; // rax
unsigned __int64 Status_1; // rbx
unsigned __int64 DstBuf; // [rsp+40h] [rbp+8h] BYREF
unsigned __int64 DstBuf_2; // [rsp+50h] [rbp+18h] BYREF
Idx = 0; /*0x317c*/
DstBuf = 0; /*0x317f*/
ConfigStr_1 = ConfigStr; /*0x3187*/
do /*0x31c3*/
{
for ( Ch = *ConfigStr_1; Ch != 38 && Ch; Ch = ConfigStr[Idx] ) /*0x318a*/
++Idx; /*0x3194*/
if ( !ConfigStr[Idx] ) /*0x31a6*/
return 0x800000000000000EuLL; /*0x32ac*/
ConfigStr_1 = &ConfigStr[++Idx]; /*0x31bc*/
}
while ( StrPrefixWide((unsigned __int64)ConfigStr_1, L"PATH=", 0xAu) ); /*0x31c3*/
Ptr = &ConfigStr[Idx]; /*0x31cd*/
HexLen = 0; /*0x31d1*/
for ( i = Ptr + 5; ; ++i ) /*0x31d4*/
{
HexCh = *i; /*0x31d8*/
if ( (unsigned __int16)(*i - 48) > 0x36u /*0x31f5*/
|| (unsigned __int16)(HexCh - 58) <= 6u
|| (unsigned __int16)(HexCh - 71) <= 0x19u )
{
break; /*0x31f5*/
}
++HexLen; /*0x31f7*/
}
BufSize = HexLen >> 1; /*0x3214*/
result = (*(__int64 (__fastcall **)(__int64, unsigned __int64, unsigned __int64 *))(BootServices_0 + 64))( /*0x321a*/
4,
HexLen >> 1,
&DstBuf);
if ( result >= 0 ) /*0x3220*/
{
HexStrToBytes((__int64)(Ptr + 5), HexLen, (_BYTE *)DstBuf); /*0x3235*/
result = 0; /*0x323a*/
}
else
{
BufSize = DstBuf; /*0x3222*/
}
if ( result >= 0 ) /*0x3240*/
{
DstBuf_1 = DstBuf; /*0x3242*/
if ( DstBuf /*0x3266*/
&& BufSize >= 4
&& *(unsigned __int16 *)(DstBuf + 2) <= BufSize
&& ((unsigned __int8)(*(_BYTE *)DstBuf - 1) <= 4u || *(_BYTE *)DstBuf == 127) )
{
DstBuf_2 = DstBuf; /*0x3274*/
Status = (*(__int64 (__fastcall **)(void *, unsigned __int64 *, _BYTE *))(BootServices_0 + 184))( /*0x3283*/
&unk_59D8,
&DstBuf_2,
GUIDArr);
DstBuf_1 = DstBuf; /*0x3289*/
Status_1 = Status; /*0x328e*/
}
else
{
Status_1 = 0x800000000000000EuLL; /*0x3293*/
}
(*(void (__fastcall **)(unsigned __int64))(BootServices_0 + 72))(DstBuf_1); /*0x32a4*/
return Status_1; /*0x32a7*/
}
return result; /*0x32c0*/
}
// Function: GetUnicodeString @ 0x32cc (0xd6 bytes)
__int64 __fastcall GetUnicodeString(char *dst, __int64 BufSize)
{
__int64 Len; // rbx
__int64 Buf; // rbp
__int16 n38_1; // di
char *dst_1; // rax
__int16 n38; // ax
char *src; // [rsp+40h] [rbp+8h] BYREF
Len = 0; /*0x32f0*/
Buf = 0; /*0x32f3*/
(*(void (__fastcall **)(__int64, __int64, char **))(BootServices_0 + 64))(4, BufSize, &src); /*0x32fa*/
n38_1 = *(_WORD *)dst; /*0x32fd*/
if ( *(_WORD *)dst ) /*0x32fd*/
{
dst_1 = dst; /*0x3305*/
do /*0x3356*/
{
if ( n38_1 == 38 && !StrPrefixWide((unsigned __int64)(dst_1 + 2), L"VALUE=", 0xCu) ) /*0x331f*/
{
do /*0x332e*/
{
++Len; /*0x3330*/
n38 = *(_WORD *)&dst[2 * Len]; /*0x3333*/
}
while ( n38 != 38 && n38 ); /*0x332e*/
n38_1 = *(_WORD *)&dst[2 * Len]; /*0x333d*/
if ( !n38_1 ) /*0x3344*/
break; /*0x3344*/
}
++Len; /*0x334b*/
*(_WORD *)&src[2 * Buf] = n38_1; /*0x334e*/
dst_1 = &dst[2 * Len]; /*0x3352*/
n38_1 = *(_WORD *)dst_1; /*0x3356*/
++Buf; /*0x3359*/
}
while ( *(_WORD *)dst_1 ); /*0x3356*/
}
*(_WORD *)&src[2 * Buf] = 0; /*0x3371*/
MemMove(dst, src, 2 * Buf + 2); /*0x337b*/
return (*(__int64 (__fastcall **)(char *))(BootServices_0 + 72))(src); /*0x3399*/
}
// Function: ExtractConfig @ 0x33a4 (0x2c1 bytes)
__int64 __fastcall ExtractConfig(__int64 a1, char *ConfigStr, char **a3, __int64 a4)
{
__int64 result; // rax
char *Result; // rbx
__int64 Buf; // rbx
__int16 *RestPtr_1; // rax
char *RestPtr; // r14
unsigned __int64 StrLen; // rax
_WORD *Status; // rax
_WORD *Status_1; // r12
__int64 OutPtr; // rbx
__int64 GUID; // r15
unsigned __int64 NameLen; // rax
__int64 BootServices; // rdx
__int64 OutPtr_1; // [rsp+30h] [rbp-89h] BYREF
__int64 HiiHandle; // [rsp+38h] [rbp-81h] BYREF
_BYTE GUIDBuf[16]; // [rsp+40h] [rbp-79h] BYREF
_QWORD Store[20]; // [rsp+50h] [rbp-69h] BYREF
__int64 MaxLen; // [rsp+128h] [rbp+6Fh] BYREF
OutPtr_1 = 0; /*0x33cd*/
if ( !ConfigStr ) /*0x33db*/
{
*a3 = 0; /*0x33dd*/
return 0x8000000000000002uLL; /*0x33ea*/
}
result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_58F8, 0, &HiiHandle); /*0x3404*/
if ( result >= 0 )
{
if ( StrPrefixWide((unsigned __int64)ConfigStr, L"GUID=", 0xAu) ) /*0x3426*/
{
LABEL_6:
*a3 = ConfigStr; /*0x3430*/
return 0x8000000000000002uLL; /*0x3433*/
}
MaxLen = 32; /*0x3441*/
HexStrToBytes((__int64)(ConfigStr + 10), 0x20u, GUIDBuf); /*0x3449*/
Result = ConfigStr + 74; /*0x344e*/
if ( *((_WORD *)ConfigStr + 37) != 38 )
{
LogErrorMsg(0x80000000LL, "HII Extract Config: Guid extraction failed\n");
goto LABEL_6; /*0x346e*/
}
if ( StrPrefixWide((unsigned __int64)(ConfigStr + 76), L"NAME=", 0xAu) ) /*0x347e*/
{
LABEL_10:
*a3 = Result; /*0x3488*/
return 0x8000000000000002uLL; /*0x348b*/
}
MaxLen = 80; /*0x3493*/
DecodeHexString((__int64)(ConfigStr + 86), (unsigned __int64 *)&MaxLen, Store); /*0x34aa*/
Result = &ConfigStr[8 * MaxLen + 86]; /*0x34b3*/
if ( *(_WORD *)Result != 38 )
{
LogErrorMsg(0x80000000LL, "HII Extract Config: Name extraction failed\n");
*a3 = ConfigStr + 74; /*0x34ce*/
return 0x8000000000000002uLL; /*0x34d1*/
}
MaxLen = 0; /*0x34db*/
result = GetHiiVariable((__int64)Store, (__int64)GUIDBuf, 0, &MaxLen, &OutPtr_1); /*0x34f3*/
if ( result >= 0 ) /*0x34fb*/
{
while ( 1 ) /*0x350a*/
{
Result += 2; /*0x350a*/
if ( *(_WORD *)Result == 38 ) /*0x3515*/
break; /*0x3515*/
if ( !*(_WORD *)Result ) /*0x3508*/
{
Buf = 2 * Assert_0(L"&OFFSET=0&WIDTH=") + 18; /*0x352d*/
RestPtr_1 = (__int16 *)AllocPool(Buf); /*0x3538*/
RestPtr = (char *)RestPtr_1; /*0x353d*/
if ( !RestPtr_1 ) /*0x3543*/
return 0x8000000000000009uLL; /*0x3543*/
FboSPrint(RestPtr_1, Buf, (char *)L"&OFFSET=0&WIDTH=%x", MaxLen); /*0x3565*/
StrLen = Assert_0(ConfigStr); /*0x356d*/
Status = (_WORD *)AllocPool(Buf + 2 * (StrLen + 1)); /*0x3579*/
Status_1 = Status; /*0x357e*/
if ( !Status ) /*0x3584*/
return 0x8000000000000009uLL; /*0x354f*/
Assert(Status, ConfigStr); /*0x358c*/
Assert(Status_1, RestPtr); /*0x3597*/
OutPtr = OutPtr_1; /*0x35a4*/
GUID = (*(__int64 (__fastcall **)(__int64, _WORD *, __int64, __int64, __int64, char **))(HiiHandle + 24))( /*0x35c3*/
HiiHandle,
Status_1,
OutPtr_1,
MaxLen,
a4,
a3);
NameLen = Assert_0(ConfigStr); /*0x35c6*/
BootServices = BootServices_0; /*0x35cb*/
*a3 = &ConfigStr[2 * NameLen]; /*0x35d6*/
(*(void (__fastcall **)(char *))(BootServices + 72))(RestPtr); /*0x35dc*/
(*(void (__fastcall **)(_WORD *))(BootServices_0 + 72))(Status_1); /*0x35e9*/
goto LABEL_24; /*0x35ec*/
}
}
if ( StrPrefixWide((unsigned __int64)(Result + 2), L"OFFSET=", 0xEu) ) /*0x35ff*/
goto LABEL_10; /*0x3607*/
OutPtr = OutPtr_1; /*0x3615*/
GUID = (*(__int64 (__fastcall **)(__int64, char *, __int64, __int64, __int64, char **))(HiiHandle + 24))( /*0x3631*/
HiiHandle,
ConfigStr,
OutPtr_1,
MaxLen,
a4,
a3);
LABEL_24:
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(OutPtr); /*0x3634*/
return GUID; /*0x3641*/
}
else
{
*a3 = ConfigStr; /*0x34fd*/
}
}
return result; /*0x3658*/
}
// Function: RouteConfig @ 0x3668 (0x26a bytes)
__int64 __fastcall RouteConfig(__int64 a1, __int16 *ConfigStr, __int16 **OutPtr)
{
__int64 result; // rax
__int16 *Result; // rbx
__int64 Status; // r8
__int64 MaxLen_1; // r14
__int64 Status_1; // [rsp+30h] [rbp-89h] BYREF
__int64 HiiHandle; // [rsp+38h] [rbp-81h] BYREF
unsigned __int64 GUIDBuf[2]; // [rsp+40h] [rbp-79h] BYREF
_BYTE GUIDArr[16]; // [rsp+50h] [rbp-69h] BYREF
_QWORD Store[20]; // [rsp+60h] [rbp-59h] BYREF
unsigned int VarSize; // [rsp+128h] [rbp+6Fh] BYREF
__int64 MaxLen; // [rsp+138h] [rbp+7Fh] BYREF
Status_1 = 0; /*0x3682*/
if ( !ConfigStr ) /*0x3691*/
{
*OutPtr = 0; /*0x3693*/
return 0x8000000000000002uLL; /*0x36a0*/
}
result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_58F8, 0, &HiiHandle); /*0x36ba*/
if ( result < 0 ) /*0x36c3*/
return result; /*0x36c3*/
if ( StrPrefixWide((unsigned __int64)ConfigStr, L"GUID=", 0xAu) ) /*0x36dc*/
{
*OutPtr = ConfigStr; /*0x36e6*/
return 0x8000000000000002uLL; /*0x36e9*/
}
if ( ParseDevicePath(ConfigStr, GUIDArr) < 0 ) /*0x36fa*/
return 0x800000000000000EuLL; /*0x3706*/
MaxLen = 32; /*0x3717*/
HexStrToBytes((__int64)(ConfigStr + 5), 0x20u, GUIDBuf); /*0x371f*/
Result = ConfigStr + 37; /*0x3724*/
if ( ConfigStr[37] != 38 )
{
LogErrorMsg(0x80000000LL, "HII Route Config: Guid extraction failed\n");
LABEL_11:
*OutPtr = Result; /*0x373f*/
return 0x8000000000000002uLL; /*0x3742*/
}
if ( StrPrefixWide((unsigned __int64)(ConfigStr + 38), L"NAME=", 0xAu) ) /*0x3755*/
goto LABEL_11; /*0x375d*/
MaxLen = 80; /*0x3763*/
DecodeHexString((__int64)(ConfigStr + 43), (unsigned __int64 *)&MaxLen, Store); /*0x3776*/
Result = &ConfigStr[4 * MaxLen + 43]; /*0x377f*/
if ( *Result != 38 )
{
LogErrorMsg(0x80000000LL, "HII Route Config: Name extraction failed\n");
goto LABEL_11; /*0x3790*/
}
MaxLen = 0; /*0x3792*/
if ( GetHiiVariable((__int64)Store, (__int64)GUIDBuf, (__int64)&VarSize, &MaxLen, &Status_1) >= 0 ) /*0x37b9*/
{
Status = Status_1; /*0x37e7*/
MaxLen_1 = MaxLen; /*0x37ec*/
}
else
{
if ( Status_1 ) /*0x37c3*/
(*(void (**)(void))(BootServices_0 + 72))(); /*0x37cc*/
Status = 0; /*0x37cf*/
VarSize = 3; /*0x37d2*/
MaxLen_1 = 0; /*0x37d9*/
Status_1 = 0; /*0x37dc*/
MaxLen = 0; /*0x37e1*/
}
for ( result = (*(__int64 (__fastcall **)(__int64, __int16 *, __int64, __int64 *, __int16 **))(HiiHandle + 32))( /*0x3804*/
HiiHandle,
ConfigStr,
Status,
&MaxLen,
OutPtr);
;
result = (*(__int64 (__fastcall **)(__int64, __int16 *, __int64, __int64 *, __int16 **))(HiiHandle + 32))(
HiiHandle,
ConfigStr,
Status_1,
&MaxLen,
OutPtr) )
{
if ( result == 0x8000000000000007uLL ) /*0x3823*/
goto LABEL_24; /*0x3823*/
if ( result != 0x8000000000000002uLL ) /*0x3828*/
break; /*0x3828*/
if ( Status_1 ) /*0x382d*/
return result; /*0x382d*/
LABEL_24:
if ( Status_1 ) /*0x3836*/
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(Status_1); /*0x383f*/
result = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(BootServices_0 + 64))(4, MaxLen, &Status_1); /*0x3857*/
if ( result < 0 ) /*0x385d*/
return result; /*0x385d*/
MaxLen_1 = MaxLen; /*0x3870*/
}
if ( result >= 0 ) /*0x3884*/
{
(*(void (__fastcall **)(_QWORD *, unsigned __int64 *, _QWORD, __int64, __int64))(RuntimeServices_0 + 88))( /*0x38a6*/
Store,
GUIDBuf,
VarSize,
MaxLen_1,
Status_1);
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(Status_1); /*0x38b5*/
return 0; /*0x38b8*/
}
return result; /*0x38ca*/
}
// Function: RegisterFormEntries @ 0x38e0 (0x1af bytes)
__int64 RegisterFormEntries(__int64 HiiProto, __int64 a2, __int64 Arg, ...)
{
__int64 Idx; // rdi
_BYTE **TablePtr; // rbx
_UNKNOWN **EntryPtr; // rdi
__int64 (__fastcall **FuncTable)(__int64, char *, char **, __int64); // rax
_QWORD *FuncTable2; // rax
_QWORD *FuncTable3; // rax
__int64 Status; // rax
char *StrPtr; // rcx
char *src; // rdx
char *StrPtr_2; // rax
__int128 XmmVal; // xmm0
char *Result; // rbx
__int64 result; // rax
__int64 OutSize; // [rsp+70h] [rbp+18h] BYREF
char *StrPtr_1; // [rsp+78h] [rbp+20h] BYREF
va_list va; // [rsp+78h] [rbp+20h]
_QWORD *DestPtr; // [rsp+80h] [rbp+28h]
_QWORD *CfgBuf; // [rsp+88h] [rbp+30h]
va_list va1; // [rsp+90h] [rbp+38h] BYREF
va_start(va1, Arg);
va_start(va, Arg);
StrPtr_1 = va_arg(va1, char *); /*0x38e0*/
DestPtr = va_arg(va1, _QWORD *); /*0x38e0*/
CfgBuf = va_arg(va1, _QWORD *); /*0x38e0*/
OutSize = 0; /*0x3909*/
Idx = 0; /*0x390d*/
TablePtr = (_BYTE **)&off_5820; /*0x3910*/
do /*0x3940*/
{
if ( *TablePtr && !StrPrefixWide(a2 + 2, *TablePtr, 0x10u) ) /*0x392b*/
break; /*0x3933*/
++Idx; /*0x3935*/
TablePtr += 4; /*0x3938*/
}
while ( !Idx ); /*0x3940*/
if ( Idx == 1 ) /*0x394d*/
{
EntryPtr = (_UNKNOWN **)&unk_59B8; /*0x394f*/
}
else
{
EntryPtr = &off_5820 + 4 * Idx; /*0x3958*/
FuncTable = (__int64 (__fastcall **)(__int64, char *, char **, __int64))EntryPtr[1]; /*0x395b*/
if ( FuncTable ) /*0x3962*/
{
if ( !*FuncTable ) /*0x3971*/
*FuncTable = ExtractConfig; /*0x397d*/
FuncTable2 = EntryPtr[1]; /*0x3980*/
if ( !FuncTable2[1] ) /*0x3984*/
FuncTable2[1] = RouteConfig; /*0x3991*/
FuncTable3 = EntryPtr[1]; /*0x3995*/
if ( !FuncTable3[2] ) /*0x3999*/
FuncTable3[2] = EmptyCallback; /*0x39a6*/
}
else
{
EntryPtr[1] = &off_58B8; /*0x396b*/
}
}
Status = (*(__int64 (__fastcall **)(_QWORD, void *, char **))(BootServices_0 + 152))( /*0x39c1*/
*(_QWORD *)(HiiProto + 24),
&unk_5888,
(char **)va);
StrPtr = StrPtr_1; /*0x39c7*/
src = *(char **)(HiiProto + 32); /*0x39cf*/
if ( Status < 0 ) /*0x39d3*/
StrPtr = 0; /*0x39d3*/
StrPtr_1 = StrPtr; /*0x39d7*/
StrPtr_2 = InitStringPrint(StrPtr, src); /*0x39dc*/
XmmVal = *(_OWORD *)(a2 + 2); /*0x39e1*/
StrPtr_1 = StrPtr_2; /*0x39ec*/
::XmmVal = XmmVal; /*0x39f4*/
Result = InitStringPrint(StrPtr_2, &src); /*0x3a08*/
(*(void (__fastcall **)(char *))(BootServices_0 + 72))(StrPtr_1); /*0x3a10*/
result = (*(__int64 (__fastcall **)(__int64 *, void *, char *, void *, void *, _QWORD))(BootServices_0 + 328))( /*0x3a3f*/
&OutSize,
&unk_5888,
Result,
&unk_5908,
EntryPtr[1],
0);
if ( result >= 0 ) /*0x3a48*/
{
if ( CfgBuf ) /*0x3a55*/
*CfgBuf = OutSize; /*0x3a5c*/
if ( DestPtr ) /*0x3a6a*/
{
if ( EntryPtr == (_UNKNOWN **)&unk_59B8 ) /*0x3a6f*/
EntryPtr = 0; /*0x3a6f*/
*DestPtr = EntryPtr; /*0x3a73*/
}
return 0; /*0x3a76*/
}
return result; /*0x3a82*/
}
// Function: MatchConfigString @ 0x3a90 (0x135 bytes)
char *__fastcall MatchConfigString(char *i, char *DevRec, char *en_US, char *Lang2_1)
{
char *DevRec_2; // rdx
char *MatchEnd; // rbx
char **p_DevRec; // r10
char *SearchPtr; // rcx
char *SearchPtr_2; // rsi
char Negate; // r11
char *SearchPtr_1; // rdi
char *DevRec_3; // r8
char PtnCh; // al
char *SearchPtr_3; // rax
unsigned __int64 Len; // rbx
char *Dst; // rax
char *Dst_1; // rdi
char *MatchEnd_1; // [rsp+20h] [rbp-38h]
char *DevRec_1; // [rsp+68h] [rbp+10h] BYREF
char *Lang1; // [rsp+70h] [rbp+18h]
char *Lang2; // [rsp+78h] [rbp+20h]
DevRec_1 = DevRec; /*0x3a97*/
Lang1 = en_US; /*0x3a9b*/
Lang2 = Lang2_1; /*0x3a9f*/
if ( !i ) /*0x3ab2*/
return 0; /*0x3ab2*/
DevRec_2 = DevRec_1; /*0x3abb*/
MatchEnd = MatchEnd_1; /*0x3ac0*/
if ( DevRec_1 ) /*0x3ac8*/
{
p_DevRec = &DevRec_1; /*0x3ace*/
while ( 1 ) /*0x3ad9*/
{
SearchPtr = i; /*0x3ad9*/
SearchPtr_2 = 0; /*0x3adc*/
do /*0x3b63*/
{
Negate = 0; /*0x3ade*/
SearchPtr_1 = SearchPtr; /*0x3ae1*/
DevRec_3 = DevRec_2; /*0x3ae4*/
if ( *DevRec_2 ) /*0x3ae7*/
{
PtnCh = *DevRec_2; /*0x3aec*/
do /*0x3b10*/
{
if ( PtnCh == 59 ) /*0x3af0*/
break; /*0x3af0*/
if ( PtnCh == 45 ) /*0x3af8*/
Negate = 1; /*0x3af8*/
if ( PtnCh != *SearchPtr ) /*0x3afe*/
break; /*0x3afe*/
if ( !*SearchPtr ) /*0x3b03*/
goto LABEL_19; /*0x3b03*/
if ( *SearchPtr == 59 ) /*0x3b08*/
break; /*0x3b08*/
++DevRec_3; /*0x3b0a*/
++SearchPtr; /*0x3b0d*/
PtnCh = *DevRec_3; /*0x3b10*/
}
while ( *DevRec_3 ); /*0x3b10*/
}
while ( *SearchPtr && *SearchPtr != 59 ) /*0x3b1b*/
++SearchPtr; /*0x3b1d*/
LABEL_19:
if ( (Negate || !*DevRec_3 || *DevRec_3 == 59) && DevRec_3 - DevRec_2 > 0 ) /*0x3b3f*/
{
SearchPtr_2 = SearchPtr_1; /*0x3b41*/
MatchEnd = SearchPtr; /*0x3b44*/
}
SearchPtr_3 = SearchPtr + 1; /*0x3b4a*/
if ( *SearchPtr != 59 ) /*0x3b4e*/
SearchPtr_3 = SearchPtr; /*0x3b4e*/
SearchPtr = SearchPtr_3; /*0x3b52*/
}
while ( *SearchPtr_3 && *DevRec_3 && *DevRec_3 != 59 ); /*0x3b63*/
if ( SearchPtr_2 ) /*0x3b6c*/
break; /*0x3b6c*/
DevRec_2 = *++p_DevRec; /*0x3b72*/
if ( !*p_DevRec ) /*0x3b72*/
goto LABEL_33; /*0x3b78*/
}
}
else
{
SearchPtr_2 = MatchEnd_1; /*0x3b80*/
LABEL_33:
if ( !SearchPtr_2 ) /*0x3b88*/
return 0; /*0x3b88*/
}
Len = MatchEnd - SearchPtr_2; /*0x3b8e*/
Dst = (char *)AllocCopyStr(Len + 1); /*0x3b95*/
Dst_1 = Dst; /*0x3b9a*/
if ( !Dst ) /*0x3ba0*/
return 0; /*0x3ab6*/
MemMove(Dst, SearchPtr_2, Len); /*0x3baf*/
Dst_1[Len] = 0; /*0x3bb7*/
return Dst_1; /*0x3bbb*/
}
// Function: GetHiiString @ 0x3bc8 (0xbf bytes)
__int64 __fastcall GetHiiString(__int64 FormCtx)
{
__int64 HiiHandle; // rax
__int64 StrId; // rbx
__int64 Lang; // [rsp+30h] [rbp+8h] BYREF
Lang = 0; /*0x3bd2*/
if ( !FormCtx ) /*0x3bde*/
return 0; /*0x3bde*/
HiiHandle = HiiHandle_0; /*0x3be7*/
if ( !HiiHandle_0 ) /*0x3bf1*/
{
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_58E8, 0, &HiiHandle_0) < 0 ) /*0x3c13*/
return 0; /*0x3be2*/
HiiHandle = HiiHandle_0; /*0x3c15*/
}
if ( (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64 *))(HiiHandle + 24))(HiiHandle, FormCtx, 0, &Lang) != 0x8000000000000005uLL ) /*0x3c3a*/
return 0; /*0x3c3a*/
StrId = AllocCopyStr(Lang); /*0x3c5b*/
if ( (*(__int64 (__fastcall **)(__int64, __int64, __int64, __int64 *))(HiiHandle_0 + 24))( /*0x3c65*/
HiiHandle_0,
FormCtx,
StrId,
&Lang) < 0 )
{
(*(void (__fastcall **)(__int64))(BootServices_0 + 72))(StrId); /*0x3c71*/
return 0; /*0x3c74*/
}
return StrId; /*0x3c81*/
}
// Function: GetBrowserData @ 0x3c88 (0xb6 bytes)
__int64 __fastcall GetBrowserData(
char *i,
__int64 Result,
__int64 FormCtx,
unsigned __int16 n8,
__int64 *p_n256,
__int64 *buf)
{
__int64 HiiHandle; // rsi
char *j; // rbx
char v10; // di
__int64 result; // rax
HiiHandle = HiiHandle_0; /*0x3caa*/
if ( !*i ) /*0x3ca3*/
return Result; /*0x3d20*/
do /*0x3d19*/
{
for ( j = i; *j != 59; ++j ) /*0x3ccc*/
{
if ( !*j ) /*0x3cce*/
break; /*0x3cd1*/
}
v10 = *j; /*0x3ce4*/
*j = 0; /*0x3cfb*/
result = (*(__int64 (__fastcall **)(__int64, char *, __int64, _QWORD, __int64 *, __int64 *, _QWORD))(HiiHandle + 8))( /*0x3cfe*/
HiiHandle,
i,
FormCtx,
n8,
buf,
p_n256,
0);
if ( result != 0x8000000000000020uLL ) /*0x3d0e*/
break; /*0x3d0e*/
if ( !v10 ) /*0x3d13*/
break; /*0x3d13*/
i = j + 1; /*0x3d15*/
}
while ( j[1] ); /*0x3d19*/
return result; /*0x3d32*/
}
// Function: SubmitFormString @ 0x3d40 (0x182 bytes)
__int64 __fastcall SubmitFormString(__int64 *p_n648, __int64 Result2, __int64 Key, __int64 Status)
{
__int64 HiiHandle; // rax
__int64 result; // rax
__int64 BufSize_1; // rbx
__int16 *StrBuf; // rsi
__int64 _GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_; // rax
__int64 Flag; // r9
__int64 Result; // rbx
__int64 Key_1; // [rsp+70h] [rbp+18h] BYREF
__int64 BufSize; // [rsp+78h] [rbp+20h] BYREF
Key_1 = Key; /*0x3d4b*/
BufSize = 0; /*0x3d5a*/
HiiHandle = HiiHandle; /*0x3d62*/
if ( !HiiHandle ) /*0x3d6f*/
{
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *, __int64))(BootServices_0 + 320))( /*0x3d91*/
&unk_5918,
0,
&HiiHandle,
Status) < 0 )
return 0x800000000000000EuLL; /*0x3d9d*/
HiiHandle = HiiHandle; /*0x3da2*/
}
if ( !qword_5F48 ) /*0x3db1*/
{
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *, __int64))(BootServices_0 + 320))( /*0x3dd3*/
&unk_58F8,
0,
&qword_5F48,
Status) < 0 )
return 0x800000000000000EuLL; /*0x3dd3*/
HiiHandle = HiiHandle; /*0x3dd5*/
}
LOBYTE(Status) = 1; /*0x3de3*/
result = (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD, __int64, void *, const __int16 *))(HiiHandle + 8))( /*0x3e02*/
HiiHandle,
&BufSize,
0,
Status,
&unk_5858,
L"FixedBoot");
if ( result == 0x8000000000000005uLL ) /*0x3e12*/
{
BufSize_1 = BufSize; /*0x3e18*/
StrBuf = (__int16 *)AllocCopyStr(BufSize + 112); /*0x3e37*/
_GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_ = FboSPrint( /*0x3e3e*/
StrBuf,
BufSize_1 + 112,
(char *)L"%s",
aGuid0000000000);// "GUID=00000000000000000000000000000000&NAME=0000&PATH=00&"
LOBYTE(Flag) = 1; /*0x3e4d*/
Result = (*(__int64 (__fastcall **)(__int64, __int64 *, __int16 *, __int64, void *, const __int16 *))(HiiHandle + 8))( /*0x3e66*/
HiiHandle,
&BufSize,
&StrBuf[_GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_],
Flag,
&unk_5858,
L"FixedBoot");
if ( Result >= 0 ) /*0x3e6c*/
{
BufSize = *p_n648; /*0x3e74*/
Result = (*(__int64 (__fastcall **)(__int64, __int16 *, __int64, __int64 *, __int64 *))(qword_5F48 + 32))( /*0x3e96*/
qword_5F48,
StrBuf,
Result2,
p_n648,
&Key_1);
*p_n648 = BufSize; /*0x3e9e*/
}
(*(void (__fastcall **)(__int16 *))(BootServices_0 + 72))(StrBuf); /*0x3eab*/
return Result; /*0x3eae*/
}
return result; /*0x3eb6*/
}
// Function: NewFormString @ 0x3ec4 (0x219 bytes)
__int64 __fastcall NewFormString(__int64 n648, __int64 Result2, _WORD *i, __int64 Status2)
{
__int64 HiiHandle; // rax
__int64 result; // rax
__int64 BufSize; // r14
__int16 *StrBuf; // rbx
__int64 _GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_; // rax
__int64 Flag; // r9
__int64 Result; // rdi
unsigned int Len; // ecx
_WORD *Ptr; // rax
char TmpBuf[72]; // [rsp+30h] [rbp-48h] BYREF
_WORD *OutStr; // [rsp+90h] [rbp+18h] BYREF
__int64 Len_1; // [rsp+98h] [rbp+20h] BYREF
OutStr = i; /*0x3ecf*/
Len_1 = 0; /*0x3ee8*/
HiiHandle = ::HiiHandle; /*0x3eef*/
if ( !::HiiHandle ) /*0x3ef9*/
{
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *, __int64))(BootServices_0 + 320))( /*0x3f1b*/
&unk_5918,
0,
&::HiiHandle,
Status2) < 0 )
return 0x800000000000000EuLL; /*0x3f27*/
HiiHandle = ::HiiHandle; /*0x3f2c*/
}
if ( !qword_5F48 ) /*0x3f3a*/
{
if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *, __int64))(BootServices_0 + 320))( /*0x3f5c*/
&unk_58F8,
0,
&qword_5F48,
Status2) < 0 )
return 0x800000000000000EuLL; /*0x3f5c*/
HiiHandle = ::HiiHandle; /*0x3f5e*/
}
LOBYTE(Status2) = 1; /*0x3f6c*/
result = (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD, __int64, void *, const __int16 *))(HiiHandle + 8))( /*0x3f8e*/
HiiHandle,
&Len_1,
0,
Status2,
&unk_5858,
L"FixedBoot");
if ( result == 0x8000000000000005uLL ) /*0x3f9e*/
{
BufSize = Len_1 + 112; /*0x3fac*/
StrBuf = (__int16 *)AllocCopyStr(Len_1 + 112); /*0x3fcc*/
_GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_ = FboSPrint( /*0x3fcf*/
StrBuf,
BufSize,
(char *)L"%s",
aGuid0000000000);// "GUID=00000000000000000000000000000000&NAME=0000&PATH=00&"
LOBYTE(Flag) = 1; /*0x3fe1*/
Result = (*(__int64 (__fastcall **)(__int64, __int64 *, __int16 *, __int64, void *, const __int16 *))(::HiiHandle + 8))( /*0x3ffa*/
::HiiHandle,
&Len_1,
&StrBuf[_GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_],
Flag,
&unk_5858,
L"FixedBoot");
if ( Result >= 0 ) /*0x4003*/
{
GetUnicodeString((char *)StrBuf, BufSize); /*0x4017*/
Result = (*(__int64 (__fastcall **)(__int64, __int16 *, __int64, __int64, _WORD **, char *))(qword_5F48 + 24))( /*0x4049*/
qword_5F48,
StrBuf,
Result2,
n648,
&OutStr,
TmpBuf);
if ( Result >= 0 ) /*0x404f*/
{
Len = 2; /*0x4059*/
for ( Ptr = OutStr; *Ptr; Len += 2 ) /*0x4061*/
++Ptr; /*0x4067*/
Len_1 = Len; /*0x407e*/
Result = (*(__int64 (__fastcall **)(__int64, __int64 *, _WORD *, _QWORD, void *, const __int16 *))(::HiiHandle + 8))( /*0x40a8*/
::HiiHandle,
&Len_1,
OutStr,
0,
&unk_5858,
L"FixedBoot");
(*(void (__fastcall **)(_WORD *))(BootServices_0 + 72))(OutStr); /*0x40b2*/
}
(*(void (__fastcall **)(__int16 *))(BootServices_0 + 72))(StrBuf); /*0x40bf*/
}
else
{
(*(void (__fastcall **)(__int16 *))(BootServices_0 + 72))(StrBuf); /*0x400c*/
}
return Result; /*0x40c2*/
}
return result; /*0x40cd*/
}
// Function: SetBrowserData @ 0x40e0 (0x71 bytes)
_BYTE *__fastcall SetBrowserData(__int64 a1, _BYTE *n, __int64 n10, char a4)
{
unsigned __int64 v4; // r11
_BYTE *n_1; // r10
unsigned __int64 v6; // rax
unsigned __int64 n0xA; // rdx
char v8; // dl
v4 = (unsigned int)a1; /*0x40e3*/
n_1 = n; /*0x40e9*/
if ( a4 ) /*0x40ef*/
v4 = a1; /*0x40ef*/
if ( (_DWORD)n10 == 10 ) /*0x40f7*/
v4 = -a1; /*0x40f7*/
if ( a1 >= 0 ) /*0x40fe*/
v4 = a1; /*0x40fe*/
if ( v4 ) /*0x4105*/
{
do /*0x412c*/
{
v6 = v4 / (int)n10; /*0x410f*/
n0xA = v4 % (int)n10; /*0x410f*/
v4 = v6; /*0x4112*/
if ( n0xA >= 0xA ) /*0x4119*/
v8 = n0xA + 87; /*0x4120*/
else
v8 = n0xA + 48; /*0x411b*/
*n_1++ = v8; /*0x4123*/
}
while ( v6 ); /*0x412c*/
}
else
{
*n = 48; /*0x4130*/
n_1 = n + 1; /*0x4133*/
}
if ( (_DWORD)n10 == 10 && a1 < 0 ) /*0x413f*/
*n_1++ = 45; /*0x4141*/
*n_1 = 0; /*0x4148*/
return n_1 - 1; /*0x4150*/
}
// Function: StringToUpper @ 0x4154 (0xd7 bytes)
__int64 __fastcall StringToUpper(char *FBO%03d, char **p_FBO%03d, int n32)
{
char Ch; // r10
char Tmp; // r9
unsigned int n0x7FFFFFFF; // r8d
char *FBO%03d_1; // rdx
char v9; // cl
char n10; // cl
Ch = 0; /*0x415e*/
Tmp = 1; /*0x4166*/
n0x7FFFFFFF = 0; /*0x4169*/
while ( *FBO%03d == 32 || *FBO%03d == 9 ) /*0x4177*/
FBO%03d += 2; /*0x4179*/
if ( *FBO%03d ) /*0x417f*/
{
if ( *FBO%03d == 45 ) /*0x4191*/
{
Tmp = -1; /*0x4193*/
FBO%03d += 2; /*0x4196*/
}
FBO%03d_1 = FBO%03d + 2; /*0x419d*/
if ( *FBO%03d != 43 ) /*0x41a1*/
FBO%03d_1 = FBO%03d; /*0x41a1*/
while ( 1 ) /*0x41a5*/
{
v9 = *FBO%03d_1; /*0x41a5*/
if ( (unsigned __int8)(*FBO%03d_1 - 48) > 9u ) /*0x41ac*/
{
if ( (unsigned __int8)((v9 & 0xDF) - 65) > 0x19u ) /*0x41bb*/
break; /*0x41bb*/
n10 = (v9 & 0xDF) - 55; /*0x41c0*/
}
else
{
n10 = v9 - 48; /*0x41ae*/
}
if ( n10 >= 10 ) /*0x41cb*/
break; /*0x41cb*/
n0x7FFFFFFF = n10 + 10 * n0x7FFFFFFF; /*0x41d1*/
if ( Tmp == 1 ) /*0x41d8*/
{
if ( n0x7FFFFFFF >= 0x80000000 ) /*0x41e1*/
Ch = 1; /*0x41e3*/
}
else if ( n0x7FFFFFFF > 0x80000000 ) /*0x41f3*/
{
Ch = 1; /*0x41f3*/
}
FBO%03d_1 += 2; /*0x41f7*/
}
*p_FBO%03d = FBO%03d_1; /*0x41fd*/
if ( Ch ) /*0x4203*/
{
n0x7FFFFFFF = 0x7FFFFFFF; /*0x420e*/
if ( Tmp == -1 ) /*0x4214*/
n0x7FFFFFFF = 0x80000000; /*0x4214*/
}
return n0x7FFFFFFF * Tmp; /*0x421c*/
}
else
{
*p_FBO%03d = FBO%03d; /*0x4185*/
return 0; /*0x4188*/
}
}
// Function: DevicePathToStr @ 0x422c (0xc7 bytes)
CHAR16 *__cdecl DevicePathToStr(EFI_DEVICE_PATH_PROTOCOL *DevPath)
{
__int64 v2; // rax
char *EFI_INTERRUPT_PENDING; // rcx
unsigned __int64 n3; // rdx
if ( !DevPath ) /*0x422f*/
return (CHAR16 *)"EFI_SUCCESS"; /*0x4238*/
if ( (__int64)DevPath < 0 ) /*0x4239*/
{
n3 = (unsigned __int64)DevPath & 0x1FFFFFFFFFFFFFFFLL; /*0x428d*/
if ( ((unsigned __int64)DevPath & 0xA000000000000000uLL) == 0xA000000000000000uLL ) /*0x4299*/
{
if ( n3 >= 3 ) /*0x429f*/
return 0; /*0x429f*/
v2 = 25 * n3; /*0x42a1*/
EFI_INTERRUPT_PENDING = aEfiInterruptPe; // "EFI_INTERRUPT_PENDING" /*0x42a5*/
return (CHAR16 *)&EFI_INTERRUPT_PENDING[v2]; /*0x42ac*/
}
if ( ((unsigned __int64)DevPath & 0xC000000000000000uLL) == 0xC000000000000000uLL ) /*0x42be*/
{
if ( n3 > 2 ) /*0x42c4*/
return 0; /*0x42c4*/
v2 = 25 * n3 + 23303; /*0x42ca*/
}
else
{
if ( n3 > 0x1E ) /*0x42d7*/
return 0; /*0x42d7*/
v2 = 25 * n3 + 23367; /*0x42e1*/
}
LABEL_18:
EFI_INTERRUPT_PENDING = (char *)&_ImageBase; /*0x42e8*/
return (CHAR16 *)&EFI_INTERRUPT_PENDING[v2]; /*0x42e8*/
}
if ( ((unsigned __int64)DevPath & 0x2000000000000000LL) == 0 ) /*0x4248*/
{
if ( (unsigned __int64)DevPath > 4 ) /*0x4267*/
return 0; /*0x4267*/
v2 = 26LL * (_QWORD)DevPath + 23014; /*0x426d*/
goto LABEL_18; /*0x4274*/
}
if ( (unsigned __int64)DevPath >= 2 ) /*0x424e*/
return 0; /*0x4252*/
v2 = 35LL * (_QWORD)DevPath; /*0x4253*/
EFI_INTERRUPT_PENDING = aEfiWarnInterru; // "EFI_WARN_INTERRUPT_SOURCE_PENDING" /*0x4257*/
return (CHAR16 *)&EFI_INTERRUPT_PENDING[v2]; /*0x4238*/
}
// Function: WideToUpper @ 0x42f4 (0x26 bytes)
__int64 WideToUpper(__int16 *m, char *FBO%03d, ...)
{
va_list va; // [rsp+40h] [rbp+18h] BYREF
va_start(va, FBO%03d);
return FormatBootString(m, 0, FBO%03d, va); /*0x4315*/
}
// Function: FormatBootString @ 0x431c (0x478 bytes)
__int64 __fastcall FormatBootString(__int16 *OutBuf, __int64 a2, char *FmtStr, va_list va)
{
char *FmtStr_1; // r12
__int64 v5; // r13
__int16 *OutBuf_1; // rdi
__int16 *OutBuf_2; // r15
va_list VaSrc; // rcx
__int16 n37; // ax
__int16 MaxLen; // si
va_list i_1; // rcx
unsigned int OutPtr_1; // edi
unsigned int OutPtr_2; // eax
__int16 *Scan; // rax
unsigned int *Flags; // r9
__int64 v16; // r8
__int16 *k; // rcx
CHAR16 *v18; // rax
__int64 v19; // r9
__int64 Ch; // rax
char Len; // al
__int16 Val; // dx
char Len_1; // r9
__int64 n10; // r8
__int64 *Pos; // rcx
_WORD *End_4; // rbx
_BYTE *m; // rcx
_BYTE *Scan2; // rcx
bool v29; // zf
__int16 v30; // dx
_WORD *End; // rcx
_WORD *End_2; // rcx
unsigned __int64 OutPtr; // rax
__int16 *End_3; // rcx
__int16 Size; // ax
_BYTE *j; // rdx
__int64 Byte; // r15
__int64 Result; // [rsp+20h] [rbp-E0h]
__int64 v40; // [rsp+28h] [rbp-D8h]
__int64 CbArg; // [rsp+30h] [rbp-D0h]
__int64 Context; // [rsp+38h] [rbp-C8h]
__int64 v43; // [rsp+40h] [rbp-C0h]
__int64 v44; // [rsp+48h] [rbp-B8h]
__int64 v45; // [rsp+50h] [rbp-B0h]
__int64 v46; // [rsp+58h] [rbp-A8h]
__int64 v47; // [rsp+60h] [rbp-A0h]
__int64 v48; // [rsp+68h] [rbp-98h]
char *FBO%03d; // [rsp+70h] [rbp-90h] BYREF
__int16 *OutBuf_3; // [rsp+78h] [rbp-88h]
_WORD End_1[32]; // [rsp+80h] [rbp-80h] BYREF
_BYTE NameBuf[256]; // [rsp+C0h] [rbp-40h] BYREF
_BYTE n[304]; // [rsp+1C0h] [rbp+C0h] BYREF
va_list i; // [rsp+310h] [rbp+210h]
FmtStr_1 = FmtStr; /*0x4343*/
v5 = a2; /*0x4346*/
OutBuf_1 = OutBuf; /*0x4349*/
OutBuf_2 = OutBuf; /*0x434c*/
if ( !OutBuf || !FmtStr ) /*0x435b*/
return -1; /*0x4775*/
if ( a2 == 1 ) /*0x4365*/
{
LABEL_83:
*OutBuf_2 = 0; /*0x476c*/
Byte = (char *)OutBuf_2 - (char *)OutBuf_1; /*0x4770*/
return Byte >> 1; /*0x4773*/
}
VaSrc = va - 1; /*0x436b*/
for ( i = va - 1; ; VaSrc = i ) /*0x436f*/
{
n37 = *(_WORD *)FmtStr_1; /*0x4376*/
if ( !*(_WORD *)FmtStr_1 ) /*0x438c*/
{
LABEL_82:
OutBuf_1 = OutBuf; /*0x4765*/
goto LABEL_83; /*0x4765*/
}
FmtStr_1 += 2; /*0x4392*/
if ( n37 != 37 ) /*0x4399*/
{
*OutBuf_2 = n37; /*0x439b*/
LABEL_8:
++OutBuf_2; /*0x439f*/
--v5; /*0x43a3*/
goto LABEL_78; /*0x43a6*/
}
if ( *(_WORD *)FmtStr_1 == 37 ) /*0x43b0*/
{
FmtStr_1 += 2; /*0x43b2*/
*OutBuf_2 = 37; /*0x43b6*/
goto LABEL_8; /*0x43ba*/
}
MaxLen = 32; /*0x43bc*/
if ( *(_WORD *)FmtStr_1 == 48 ) /*0x43c5*/
{
MaxLen = 48; /*0x43c7*/
FmtStr_1 += 2; /*0x43ca*/
}
switch ( *(_WORD *)FmtStr_1 ) /*0x43d4*/
{
case '*': /*0x43d4*/
FmtStr_1 += 2; /*0x43d6*/
i_1 = VaSrc + 1; /*0x43da*/
i = i_1; /*0x43de*/
OutPtr_1 = *(_DWORD *)i_1; /*0x43e5*/
break;
case 's': /*0x43d4*/
i = i_1 + 1; /*0x4410*/
for ( Scan = (__int16 *)i_1[1]; *Scan; ++Scan ) /*0x4417*/
{
if ( !--v5 ) /*0x4420*/
goto LABEL_80; /*0x4420*/
*OutBuf_2++ = *Scan; /*0x4426*/
}
goto LABEL_77; /*0x4438*/
case 'S': /*0x43d4*/
case 'a': /*0x43d4*/
i = i_1 + 1; /*0x4716*/
for ( j = i_1[1]; *j; ++j ) /*0x471d*/
{
if ( !--v5 ) /*0x4726*/
goto LABEL_80; /*0x4726*/
*OutBuf_2++ = (char)*j; /*0x472b*/
}
goto LABEL_77; /*0x473a*/
default:
OutPtr_2 = StringToUpper(FmtStr_1, &FBO%03d, 32); /*0x43f1*/
i_1 = i; /*0x43f6*/
OutPtr_1 = OutPtr_2; /*0x43fd*/
FmtStr_1 = FBO%03d; /*0x43ff*/
break;
}
if ( *(_WORD *)FmtStr_1 != 99 ) /*0x445d*/
break; /*0x445d*/
i = i_1 + 1; /*0x4463*/
*OutBuf_2++ = *((_WORD *)i_1 + 4); /*0x446d*/
LABEL_77:
FmtStr_1 += 2; /*0x473c*/
LABEL_78:
if ( v5 == 1 ) /*0x4744*/
goto LABEL_82; /*0x4744*/
}
if ( (*FmtStr_1 & 0xDF) == 0x47 ) /*0x4482*/
{
OutBuf_3 = OutBuf_2; /*0x448c*/
i = i_1 + 1; /*0x4491*/
Flags = (unsigned int *)i_1[1]; /*0x4498*/
LODWORD(v48) = *((unsigned __int8 *)Flags + 15); /*0x44d0*/
LODWORD(v47) = *((unsigned __int8 *)Flags + 14); /*0x44d4*/
LODWORD(v46) = *((unsigned __int8 *)Flags + 13); /*0x44db*/
LODWORD(v45) = *((unsigned __int8 *)Flags + 12); /*0x44e2*/
LODWORD(v44) = *((unsigned __int8 *)Flags + 11); /*0x44ee*/
LODWORD(v43) = *((unsigned __int8 *)Flags + 10); /*0x44f3*/
LODWORD(Context) = *((unsigned __int8 *)Flags + 9); /*0x44f8*/
LODWORD(CbArg) = *((unsigned __int8 *)Flags + 8); /*0x44fc*/
LODWORD(v40) = *((unsigned __int16 *)Flags + 3); /*0x4500*/
LODWORD(Result) = *((unsigned __int16 *)Flags + 2); /*0x4504*/
v16 = FboSPrint( /*0x4511*/
OutBuf_2,
v5,
(char *)L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
*Flags,
Result,
v40,
CbArg,
Context,
v43,
v44,
v45,
v46,
v47,
v48);
OutBuf_2 += v16; /*0x451a*/
if ( *(_WORD *)FmtStr_1 == 71 ) /*0x451e*/
{
for ( k = OutBuf_3; *k; ++k ) /*0x4525*/
{
if ( (unsigned __int16)(*k - 97) <= 0x19u ) /*0x4539*/
*k -= 32; /*0x453f*/
}
}
v5 -= v16; /*0x454c*/
goto LABEL_77; /*0x454f*/
}
if ( *(_WORD *)FmtStr_1 == 114 ) /*0x455a*/
{
i = i_1 + 1; /*0x4560*/
v18 = DevicePathToStr((EFI_DEVICE_PATH_PROTOCOL *)i_1[1]); /*0x456d*/
if ( v18 ) /*0x457b*/
Ch = FboSPrint(OutBuf_2, v5, (char *)L"%S", v18); /*0x45a1*/
else
Ch = FboSPrint( /*0x4590*/
OutBuf_2,
v5,
(char *)L"%S(%X)",
aStatusCode, // "Status Code"
v19);
OutBuf_2 += Ch; /*0x45a6*/
v5 -= Ch; /*0x45aa*/
goto LABEL_77; /*0x45ad*/
}
if ( *(_WORD *)FmtStr_1 == 108 ) /*0x45b8*/
{
FmtStr_1 += 2; /*0x45ba*/
Len = 1; /*0x45be*/
}
else
{
Len = 0; /*0x45c2*/
}
Val = *(_WORD *)FmtStr_1; /*0x45c5*/
Len_1 = 1; /*0x45ca*/
if ( *(_WORD *)FmtStr_1 != 112 ) /*0x45d7*/
Len_1 = Len; /*0x45d7*/
if ( Val == 100 || Val == 105 ) /*0x45e5*/
{
n10 = 10; /*0x45fb*/
}
else
{
if ( (Val & 0xDF) != 0x58 ) /*0x45ed*/
goto LABEL_78; /*0x45ed*/
n10 = 16; /*0x45f3*/
}
Pos = (__int64 *)(i_1 + 1); /*0x4601*/
End_4 = End_1; /*0x4605*/
i = (va_list)Pos; /*0x4609*/
if ( Len_1 ) /*0x4613*/
{
for ( m = SetBrowserData(*Pos, NameBuf, n10, 1); m >= NameBuf; --m ) /*0x4624*/
*End_4++ = (char)*m; /*0x462c*/
}
else
{
for ( Scan2 = SetBrowserData(*(int *)Pos, n, n10, 0); Scan2 >= n; --Scan2 ) /*0x4653*/
*End_4++ = (char)*Scan2; /*0x465b*/
}
v29 = *(_WORD *)FmtStr_1 == 88; /*0x4671*/
*End_4 = 0; /*0x4677*/
if ( v29 || *(_WORD *)FmtStr_1 == 112 ) /*0x4683*/
{
v30 = End_1[0]; /*0x4685*/
End = End_1; /*0x4689*/
if ( End_1[0] ) /*0x4690*/
{
do /*0x46af*/
{
if ( (unsigned __int16)(*End - 97) <= 0x19u ) /*0x46a2*/
*End -= 32; /*0x46a8*/
++End; /*0x46ab*/
}
while ( *End ); /*0x46af*/
goto LABEL_62; /*0x46b3*/
}
}
else
{
LABEL_62:
v30 = End_1[0]; /*0x46b5*/
}
End_2 = End_1; /*0x46b9*/
OutPtr = 0; /*0x46bd*/
if ( v30 ) /*0x46c3*/
{
do /*0x46cc*/
{
++End_2; /*0x46c5*/
++OutPtr; /*0x46c9*/
}
while ( *End_2 ); /*0x46cc*/
}
while ( OutPtr < OutPtr_1 ) /*0x46ea*/
{
++OutPtr; /*0x46d6*/
if ( !--v5 ) /*0x46dd*/
goto LABEL_80; /*0x46dd*/
*OutBuf_2++ = MaxLen; /*0x46df*/
}
End_3 = End_1; /*0x46ec*/
if ( !v30 ) /*0x46f3*/
goto LABEL_77; /*0x46f3*/
while ( --v5 ) /*0x46f5*/
{
Size = *End_3++; /*0x46fb*/
*OutBuf_2++ = Size; /*0x4702*/
if ( !*End_3 ) /*0x470a*/
goto LABEL_77; /*0x470e*/
}
LABEL_80:
*OutBuf_2 = 0; /*0x4752*/
Byte = (char *)OutBuf_2 - (char *)OutBuf; /*0x4756*/
return Byte >> 1; /*0x4781*/
}
// Function: FboSPrint @ 0x4794 (0x1d bytes)
__int64 __fastcall FboSPrint(__int16 *m, __int64 a2, char *FBO%03d, ...)
{
va_list va; // [rsp+48h] [rbp+20h] BYREF
va_start(va, FBO%03d);
return FormatBootString(m, a2, FBO%03d, va); /*0x47ac*/
}
// Function: GetDebugLevelMask @ 0x47b4 (0x4e bytes)
__int64 GetDebugLevelMask()
{
unsigned __int8 v0; // al
char n3_1; // al
char n3; // cl
__int64 result; // rax
v0 = __inbyte(0x70u); /*0x47b9*/
__outbyte(0x70u, v0 & 0x80 | 0x4B); /*0x47be*/
n3_1 = __inbyte(0x71u); /*0x47c4*/
n3 = n3_1; /*0x47c5*/
if ( (unsigned __int8)n3_1 > 3u ) /*0x47cc*/
{
n3 = n3; /*0x47ce*/
if ( !n3 ) /*0x47d6*/
n3 = MEMORY[0xFDAF0490] & 2 | 1; /*0x47e2*/
}
if ( (unsigned __int8)(n3 - 1) > 0xFDu ) /*0x47ec*/
return 0; /*0x47ff*/
result = 2147483718LL; /*0x47f1*/
if ( n3 == 1 ) /*0x47fb*/
return 2147483652LL; /*0x47fb*/
return result; /*0x47fe*/
}
// Function: Assert_0 @ 0x4804 (0x93 bytes)
unsigned __int64 __fastcall Assert_0(_WORD *a1)
{
_WORD *v1; // rbx
unsigned __int64 n0xF4240; // rdi
v1 = a1; /*0x4815*/
if ( !a1 ) /*0x481b*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 172, (__int64)"String != ((void *) 0)"); /*0x4830*/
if ( ((unsigned __int8)v1 & 1) != 0 ) /*0x4838*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 173, (__int64)"((UINTN) String & 0x00000001) == 0"); /*0x484d*/
n0xF4240 = 0; /*0x4852*/
while ( *v1 ) /*0x4882*/
{
if ( n0xF4240 >= 0xF4240 ) /*0x485e*/
AssertMsg( /*0x4873*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
181,
(__int64)"Length < _gPcd_FixedAtBuild_PcdMaximumUnicodeStringLength");
++v1; /*0x4878*/
++n0xF4240; /*0x487c*/
}
return n0xF4240; /*0x4891*/
}
// Function: StrCatWide @ 0x4898 (0x11c bytes)
_WORD *__fastcall StrCatWide(_WORD *Status, char *m)
{
char *v4; // rbx
__int16 v5; // ax
char *v6; // rdi
v4 = (char *)&Status[Assert_0(Status)]; /*0x48c6*/
if ( !v4 ) /*0x48cd*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 56, (__int64)"Destination != ((void *) 0)"); /*0x48dc*/
if ( ((unsigned __int8)v4 & 1) != 0 ) /*0x48e4*/
AssertMsg( /*0x48f5*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
57,
(__int64)"((UINTN) Destination & 0x00000001) == 0");
if ( (v4 - m) >> 1 <= Assert_0(m) ) /*0x490e*/
AssertMsg( /*0x491f*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
62,
(__int64)"(UINTN)(Destination - Source) > StrLen (Source)");
if ( (m - v4) >> 1 <= Assert_0(m) ) /*0x4938*/
AssertMsg( /*0x4949*/
(__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
63,
(__int64)"(UINTN)(Source - Destination) > StrLen (Source)");
v5 = *(_WORD *)m; /*0x494e*/
if ( *(_WORD *)m ) /*0x494e*/
{
v6 = (char *)(m - v4); /*0x4956*/
do /*0x4967*/
{
*(_WORD *)v4 = v5; /*0x4959*/
v4 += 2; /*0x495c*/
v5 = *(_WORD *)&v4[(_QWORD)v6]; /*0x4960*/
}
while ( v5 ); /*0x4967*/
}
*(_WORD *)v4 = 0; /*0x496c*/
if ( 2 * Assert_0(Status) == -2 ) /*0x4980*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 378, (__int64)"StrSize (Destination) != 0"); /*0x4991*/
return Status; /*0x49ad*/
}
// Function: ReadQWord @ 0x49b4 (0x2f bytes)
__int64 __fastcall ReadQWord(__int64 a1)
{
if ( !a1 ) /*0x49c0*/
AssertMsg((__int64)"e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, (__int64)"Buffer != ((void *) 0)"); /*0x49d5*/
return *(_QWORD *)a1; /*0x49dd*/
}
// Function: IsEqualGuid @ 0x49e4 (0x6e bytes)
bool __fastcall IsEqualGuid(UINTN ErrorLevel, __int64 a2)
{
__int64 v3; // rdi
__int64 v4; // rbx
__int64 v5; // rbp
__int64 v6; // rax
v3 = ReadQWord((__int64)&unk_5800); /*0x4a0a*/
v4 = ReadQWord(a2); /*0x4a19*/
v5 = ReadQWord((__int64)&unk_5808); /*0x4a25*/
v6 = ReadQWord(a2 + 8); /*0x4a28*/
return v3 == v4 && v5 == v6; /*0x4a4c*/
}
// Function: MemSet @ 0x4ab0 (0x5d bytes)
int *__fastcall MemSet(int *buf, int value, unsigned __int64 n512)
{
int *buf_1; // rdi
int value_1; // eax
unsigned __int64 n512_1; // rcx
__int16 value_2; // bx
int v7; // eax
__int64 v8; // rdx
char n512_2; // dl
unsigned __int64 i; // rcx
buf_1 = buf; /*0x4ab3*/
value_1 = value; /*0x4ab6*/
n512_1 = n512; /*0x4ab9*/
BYTE1(value_1) = value; /*0x4aca*/
value_2 = value_1; /*0x4acc*/
v7 = value_1 << 16; /*0x4acf*/
LOWORD(v7) = value_2; /*0x4ad3*/
if ( n512 >= 4 ) /*0x4ada*/
{
v8 = (unsigned __int8)buf_1 & 3; /*0x4adf*/
if ( ((unsigned __int8)buf_1 & 3) != 0 ) /*0x4ae3*/
{
memset(buf_1, value_2, 4 - v8); /*0x4af2*/
buf_1 = (int *)((char *)buf_1 + 4 - v8); /*0x4af2*/
n512_1 = n512 - (4 - v8); /*0x4af4*/
}
n512_2 = n512_1; /*0x4af7*/
for ( i = n512_1 >> 2; i; --i ) /*0x4afa*/
*buf_1++ = v7; /*0x4afe*/
n512_1 = n512_2 & 3; /*0x4b04*/
}
memset(buf_1, value_2, n512_1); /*0x4b07*/
return buf; /*0x4b0a*/
}
// Function: MemMove @ 0x4b10 (0xb0 bytes)
char *__fastcall MemMove(char *dst, char *src, unsigned __int64 n8)
{
unsigned __int64 dst_1; // rdi
unsigned __int64 n8_1; // rcx
char v10; // dl
char *n8_2; // rax
unsigned __int64 count; // rax
unsigned __int64 count_1; // rbx
char n8_3; // al
unsigned __int64 v15; // rcx
unsigned __int64 n8_4; // rax
__asm { pushf } /*0x4b13*/
dst_1 = (unsigned __int64)dst; /*0x4b19*/
n8_1 = n8; /*0x4b1c*/
v10 = 0; /*0x4b1f*/
n8_2 = &src[-dst_1]; /*0x4b24*/
if ( (unsigned __int64)src < dst_1 ) /*0x4b27*/
{
n8_2 = (char *)(dst_1 - (_QWORD)src); /*0x4b2d*/
if ( (unsigned __int64)&src[n8] >= dst_1 ) /*0x4b33*/
{
src += n8; /*0x4b35*/
dst_1 += n8; /*0x4b38*/
v10 = 1; /*0x4b3c*/
}
}
if ( n8 < 8 || (unsigned __int64)n8_2 < 8 ) /*0x4b49*/
goto LABEL_19; /*0x4b49*/
count = (unsigned __int8)src & 7; /*0x4b51*/
count_1 = dst_1 & 7; /*0x4b55*/
if ( v10 ) /*0x4b5b*/
{
--src; /*0x4b5d*/
--dst_1; /*0x4b60*/
}
if ( count == count_1 && count ) /*0x4b6b*/
{
if ( !v10 ) /*0x4b6f*/
count = 8 - count; /*0x4b74*/
qmemcpy((void *)dst_1, src, count); /*0x4b7d*/
src += count; /*0x4b7d*/
dst_1 += count; /*0x4b7d*/
n8_1 = n8 - count; /*0x4b7f*/
}
if ( v10 ) /*0x4b84*/
{
src -= 7; /*0x4b86*/
dst_1 -= 7LL; /*0x4b8a*/
}
n8_3 = n8_1; /*0x4b8e*/
v15 = n8_1 >> 3; /*0x4b91*/
qmemcpy((void *)dst_1, src, 8 * v15); /*0x4b95*/
src += 8 * v15; /*0x4b95*/
dst_1 += 8 * v15; /*0x4b95*/
n8_4 = n8_3 & 7; /*0x4b98*/
if ( n8_4 ) /*0x4b9c*/
{
if ( v10 ) /*0x4ba0*/
{
src += 8; /*0x4ba2*/
dst_1 += 8LL; /*0x4ba6*/
}
n8_1 = n8_4; /*0x4baa*/
LABEL_19:
if ( v10 ) /*0x4baf*/
{
--src; /*0x4bb1*/
--dst_1; /*0x4bb4*/
}
qmemcpy((void *)dst_1, src, n8_1); /*0x4bb7*/
}
__asm { popf } /*0x4bb9*/
return dst; /*0x4bbc*/
}