Newer
Older
AMI-Aptio-BIOS-Reversed / AmiModulePkg / ACPI / FboGroupForm / FboGroupForm.c
@Ajax Dong Ajax Dong 2 days ago 109 KB Restructure the repo
#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*/
}