Newer
Older
AMI-Aptio-BIOS-Reversed / ReFlash / ReFlash.c
@Ajax Dong Ajax Dong 2 days ago 230 KB Init
#include "ReFlash.h"

//
// ReFlash - UEFI Module
// Total functions: 191
//

// Function: InternalCopyMem @ 0x2e0 (0x42 bytes)

char *__fastcall InternalCopyMem(char *DestinationBuffer, char *SourceBuffer, UINTN Length)
{
  char *DestinationBuffer_1; // rax
  UINTN Length_1; // rcx
  char *dst; // rdi
  char *src; // rsi

  DestinationBuffer_1 = DestinationBuffer; /*0x2f0*/
  if ( SourceBuffer < DestinationBuffer && &SourceBuffer[Length - 1] >= DestinationBuffer ) /*0x2f8*/
  {
    src = &SourceBuffer[Length - 1]; /*0x310*/
    dst = &DestinationBuffer[Length - 1]; /*0x313*/
  }
  else
  {
    Length_1 = Length; /*0x2fa*/
    Length &= 7u; /*0x2fd*/
    Length_1 >>= 3; /*0x304*/
    qmemcpy(DestinationBuffer, SourceBuffer, 8 * Length_1); /*0x308*/
    src = &SourceBuffer[8 * Length_1]; /*0x308*/
    dst = &DestinationBuffer[8 * Length_1]; /*0x308*/
  }
  qmemcpy(dst, src, Length); /*0x31c*/
  return DestinationBuffer_1; /*0x31f*/
}


// Function: InternalSetMem @ 0x330 (0x11 bytes)

void *__fastcall InternalSetMem(void *buf, unsigned __int64 count, char value)
{
  memset(buf, value, count); /*0x33a*/
  return buf; /*0x33f*/
}


// Function: InternalCompareMem @ 0x350 (0x1d bytes)

unsigned __int64 __fastcall InternalCompareMem(char *DestinationBuffer, char *SourceBuffer, __int64 n40)
{
  bool v6; // zf

  do /*0x35b*/
  {
    if ( !n40 ) /*0x35b*/
      break; /*0x35b*/
    v6 = *DestinationBuffer++ == *SourceBuffer++; /*0x35b*/
    --n40; /*0x35b*/
  }
  while ( v6 ); /*0x35b*/
  return (unsigned __int8)*(DestinationBuffer - 1) - (unsigned __int64)(unsigned __int8)*(SourceBuffer - 1); /*0x36a*/
}


// Function: InternalIsZeroBuffer @ 0x3b0 (0x20 bytes)

char *__fastcall InternalIsZeroBuffer(char *Buffer, UINTN Length, UINT8 Value)
{
  memset(Buffer, 0, 8 * (Length >> 3)); /*0x3c6*/
  memset(&Buffer[8 * (Length >> 3)], 0, Length & 7); /*0x3cb*/
  return Buffer; /*0x3ce*/
}


// Function: _ModuleEntryPoint @ 0x420 (0x2b bytes)

EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  ReFlashDriverEntryPoint((__int64)ImageHandle, (__int64)SystemTable); /*0x430*/
  return ReFlashEntry((__int64)ImageHandle, SystemTable); /*0x445*/
}


// Function: ReFlashDriverEntryPoint @ 0x44c (0x4d7 bytes)

char *__fastcall ReFlashDriverEntryPoint(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  __int64 DxeStatus; // rax
  __int64 DxeStatus_1; // rbx
  __int64 LocateStatus; // rax
  __int64 PciHandle; // rax
  EFI_SYSTEM_TABLE *SystemTable_1; // rdx
  __int64 ImageHandle_1; // rcx
  _WORD *PcdVal; // rax
  _BYTE *PcdDest; // rax
  __int16 callerseflags_w; // bx
  bool IfEnabled; // bl
  unsigned __int32 StartTick; // edi
  __int64 HiiDbStatus; // rax
  __int64 HiiPkgStatus; // rax
  __int64 StrPkgStatus; // rax
  __int64 SegBusTable; // rax
  const void *SourceBuffer; // rbx
  __int64 SegBusPtr; // rax
  __int64 SegBusSize; // rax
  UINTN Length; // rax
  char *p_DestinationBuffer_2; // rax
  EFI_SYSTEM_TABLE *SystemTable_2; // rdx
  char *p_DestinationBuffer_5; // rbp
  char *p_DestinationBuffer_1; // rdi
  unsigned __int64 RegionCount; // rcx
  int EntrySize; // ebx
  unsigned int RegionStride; // edx
  char *p_DestinationBuffer_3; // rsi
  unsigned __int64 p_DestinationBuffer_4;... [9298 chars total]


// Function: ReFlashReadHiiString @ 0x924 (0x9b bytes)

__int64 __fastcall ReFlashReadHiiString(__int64 a1, __int64 n48, __int64 *p_n29, __int64 *p_DmiVar%02x%04x%02x%02x)
{
  unsigned __int16 n48_1; // si
  __int64 result; // rax

  n48_1 = n48; /*0x942*/
  if ( !*p_DmiVar%02x%04x%02x%02x ) /*0x938*/
    *p_n29 = 0; /*0x94a*/
  result = ReFlashInternalGetHiiString(a1, (unsigned __int16)n48, p_n29, *p_DmiVar%02x%04x%02x%02x); /*0x954*/
  if ( result == 0x8000000000000005uLL ) /*0x95c*/
  {
    if ( *p_DmiVar%02x%04x%02x%02x ) /*0x96d*/
      (*(void (**)(void))(BootServices + 72))(); /*0x97c*/
    result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64 *))(BootServices + 64))( /*0x991*/
               4,
               *p_n29,
               p_DmiVar%02x%04x%02x%02x);
    if ( result >= 0 ) /*0x997*/
      return ReFlashInternalGetHiiString(a1, n48_1, p_n29, *p_DmiVar%02x%04x%02x%02x); /*0x9a5*/
  }
  return result; /*0x9b9*/
}


// Function: ReFlashParseVarStore @ 0x9c0 (0xb2 bytes)

char __fastcall ReFlashParseVarStore(char a1, __int64 FuncIdx, __int64 n100, __int64 TotalBlocks)
{
  __int64 RegionIdx; // rbx
  __int64 VarStoreStatus; // rax
  __int64 RegionBase; // rdx
  __int64 EntryOffset; // rcx
  char SetFlag; // al
  __int64 v10; // [rsp+48h] [rbp+10h] BYREF
  __int64 p_n7; // [rsp+50h] [rbp+18h] BYREF

  LODWORD(RegionIdx) = 0; /*0x9c6*/
  p_n7 = 7; /*0x9c8*/
  if ( a1 ) /*0x9d3*/
    VarStoreStatus = ReFlashReadHiiConfig(&p_n7, (__int64)&v10, n100, TotalBlocks); /*0x9df*/
  else
    VarStoreStatus = (*(__int64 (__fastcall **)(const wchar_t *, void *, _QWORD, __int64 *, __int64 *))(RuntimeServices + 72))( /*0xa0d*/
                       L"Setup",
                       &unk_C8F0,
                       0,
                       &p_n7,
                       &v10);
  if ( VarStoreStatus >= 0 && BYTE6(v10) ) /*0xa19*/
  {
    RegionBase = RegionBase; /*0xa1b*/
    if ( *(_DWORD *)(RegionBase + 36) != 5 ) /*0xa26*/
    {
      EntryOffset = 0; /*0xa28*/
      while ( *(_DWORD *)(EntryOffset + RegionBase + 36) != 1 ) /*0xa34*/
      {
        if ( *(_DWORD *)(EntryOffset + RegionBase + 36) == 2 ) /*0xa3a*/
        {
          SetFlag = BYTE3(v10); /*0xa3c*/
LABEL_12:
          *(_BYTE *)(EntryOffset + RegionBase + 40) = SetFlag; /*0xa46*/
          RegionBase = RegionBase; /*0xa4a*/
        }
        RegionIdx = (unsigned int)(RegionIdx + 1); /*0xa51*/
        EntryOffset = 72 * RegionIdx; /*0xa57*/
        if ( *(_DWORD *)(72 * RegionIdx + RegionBase + 36) == 5 ) /*0xa60*/
          goto LABEL_14; /*0xa60*/
      }
      SetFlag = BYTE4(v10); /*0xa42*/
      goto LABEL_12; /*0xa42*/
    }
LABEL_14:
    ::SetFlag = BYTE3(v10); /*0xa62*/
    LOBYTE(VarStoreStatus) = BYTE3(v10); /*0xa62*/
  }
  return VarStoreStatus; /*0xa6c*/
}


// Function: ReFlashUpdateBootSettings @ 0xa74 (0x12f bytes)

__int64 __fastcall ReFlashUpdateBootSettings(__int64 a1, int *p_n0x1000000)
{
  __int64 v2; // rbx
  __int64 v4; // rcx
  __int64 n23; // rdx
  __int64 n17; // rdx
  __int64 result; // rax
  wchar_t ________________[112]; // [rsp+20h] [rbp-89h] BYREF
  wchar_t *DmiVar%02x%04x%02x%02x; // [rsp+110h] [rbp+67h] BYREF
  __int64 DmiVar%02x%04x%02x%02x_1; // [rsp+118h] [rbp+6Fh] BYREF
  __int64 n29; // [rsp+120h] [rbp+77h] BYREF

  v2 = qword_D158; /*0xa88*/
  DmiVar%02x%04x%02x%02x = 0; /*0xa93*/
  DmiVar%02x%04x%02x%02x_1 = 0; /*0xa9c*/
  ReFlashReadHiiString(qword_D158, 20, &n29, (__int64 *)&DmiVar%02x%04x%02x%02x); /*0xaac*/
  switch ( *((_BYTE *)p_n0x1000000 + 2) ) /*0xab8*/
  {
    case 1: /*0xab8*/
      n23 = 23; /*0xaf0*/
      goto LABEL_10; /*0xaf0*/
    case 2: /*0xab8*/
      n23 = 24; /*0xae9*/
      goto LABEL_10; /*0xaee*/
    case 3: /*0xab8*/
      n23 = 25; /*0xae2*/
LABEL_10:
      v4 = v2; /*0xaf5*/
      goto LABEL_11; /*0xaf9*/
  }
  v4 = v2; /*0xacb*/
  if ( *((_BYTE *)p_n0x1000000 + 2) == 4 ) /*0xad2*/
    n23 = 26; /*0xadb*/
  else
    n23 = 27; /*0xad4*/
LABEL_11:
  ReFlashReadHiiString(v4, n23, &n29, &DmiVar%02x%04x%02x%02x_1); /*0xb00*/
  if ( DmiVar%02x%04x%02x%02x && DmiVar%02x%04x%02x%02x_1 ) /*0xb15*/
  {
    HiiConstructConfigAltString(________________, (const CHAR8 *)DmiVar%02x%04x%02x%02x); /*0xb1c*/
    ReFlashSetProgress(v2, 0x12u, ________________); /*0xb2e*/
    (*(void (__fastcall **)(wchar_t *))(BootServices + 72))(DmiVar%02x%04x%02x%02x); /*0xb3e*/
    (*(void (__fastcall **)(__int64))(BootServices + 72))(DmiVar%02x%04x%02x%02x_1); /*0xb4c*/
    DmiVar%02x%04x%02x%02x = 0; /*0xb4f*/
  }
  n17 = 17; /*0xb63*/
  if ( *((_BYTE *)p_n0x1000000 + 1) ) /*0xb54*/
    n17 = 16; /*0xb6a*/
  result = ReFlashReadHiiString(v2, n17, &n29, (__int64 *)&DmiVar%02x%04x%02x%02x); /*0xb6f*/
  if ( DmiVar%02x%04x%02x%02x ) /*0xb7b*/
  {
    ReFlashSetProgress(v2, 0x13u, DmiVar%02x%04x%02x%02x); /*0xb85*/
    return (*(__int64 (__fastcall **)(wchar_t *))(BootServices + 72))(DmiVar%02x%04x%02x%02x); /*0xb95*/
  }
  return result; /*0xb98*/
}


// Function: ReFlashGetBootDevice @ 0xba4 (0x117 bytes)

__int64 ReFlashGetBootDevice()
{
  __int64 ImageHandle; // rbx
  __int64 v1; // r8
  unsigned __int64 i; // rdx
  __int64 (__fastcall **v4)(_QWORD, __int64, _QWORD, __int64 *); // [rsp+30h] [rbp-18h] BYREF
  __int64 v5; // [rsp+38h] [rbp-10h] BYREF
  __int64 v6; // [rsp+68h] [rbp+20h] BYREF
  __int64 v7; // [rsp+70h] [rbp+28h]
  __int64 v8; // [rsp+78h] [rbp+30h] BYREF

  ImageHandle = ImageHandle; /*0xbae*/
  if ( (*(__int64 (__fastcall **)(__int64, void *, __int64 *))(BootServices + 152))(ImageHandle, &unk_CAB0, &v8) >= 0 /*0xc2b*/
    && (*(__int64 (__fastcall **)(__int64, void *, __int64 *, __int64, _QWORD, int))(BootServices + 280))(
         ImageHandle,
         &unk_CB68,
         &v6,
         ImageHandle,
         0,
         2) >= 0
    && (*(__int64 (__fastcall **)(void *, _QWORD, __int64 (__fastcall ***)(_QWORD, __int64, _QWORD, __int64 *)))(BootServices + 320))(
         &unk_CA20,
         0,
         &v4) >= 0 )
  {
    v7 = 0; /*0xc36*/
    for ( i = v6 + 20; /*0xc3e*/
          i < v6 + (unsigned __int64)*(unsigned int *)(v6 + 16) && *(_BYTE *)(i + 3) != 2;
          i += *(_DWORD *)i & 0xFFFFFF )
    {
      ; /*0xc54*/
    }
    ReFlashInstallProtocol(v8, i + 4, v1); /*0xc76*/
    if ( (*v4)(v4, v6, 0, &v5) >= 0 && v7 ) /*0xc9c*/
      *(_QWORD *)(v7 + 24) = v5; /*0xca2*/
  }
  qword_D158 = qword_C8E8; /*0xcad*/
  return qword_C8E8; /*0xcb4*/
}


// Function: ReFlashEntry @ 0xcbc (0x2fe bytes)

__int64 __fastcall ReFlashEntry(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable, double a3)
{
  int n18; // ebx
  __int64 v4; // rdx
  __int64 v5; // rcx
  EFI_SYSTEM_TABLE *SystemTable_1; // rdx
  __int64 v7; // rax
  _WORD *FlashDescriptor; // rax
  EFI_SYSTEM_TABLE *SystemTable_2; // rdx
  int v10; // ecx
  __int64 v11; // rax
  __int64 ImageHandle_1; // rcx
  EFI_SYSTEM_TABLE *SystemTable_3; // rdx
  __int64 result; // rax
  __int64 v15; // rcx
  __int64 n48; // rdx
  int n0x1000000; // [rsp+30h] [rbp-40h] BYREF
  __int16 n257; // [rsp+34h] [rbp-3Ch]
  bool v19; // [rsp+36h] [rbp-3Ah]
  __int64 n29; // [rsp+38h] [rbp-38h] BYREF
  wchar_t *________________; // [rsp+40h] [rbp-30h] BYREF
  char v22; // [rsp+48h] [rbp-28h] BYREF
  int v23; // [rsp+49h] [rbp-27h]
  char v24; // [rsp+90h] [rbp+20h] BYREF
  int n2; // [rsp+A0h] [rbp+30h] BYREF
  int v26; // [rsp+A8h] [rbp+38h] BYREF

  ________________ = 0; /*0xcc7*/
  n2 = 2; /*0xcd9*/
  n0x1000000 = 0x1000000; /*0xce0*/
  n257 = 257; /*0xce7*/
  v19 = 0; /*0xced*/
  v24 = 0; /*0xcf1*/
  ::ImageHandle = ImageHandle; /*0xcf5*/
  if ( !::SystemTable ) /*0xcfc*/
  {
    ::SystemTable = (__int64)SystemTable; /*0xcfe*/
    BootServices = (__int64)SystemTable->BootServices; /*0xd09*/
    RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0xd14*/
  }
  n18 = *(_DWORD *)(HobLibGetHobList(ImageHandle, SystemTable) + 12); /*0xd2c*/
  (*(void (__fastcall **)(__int64, __int64, __int64 *))(BootServices + 64))(6, 72, &qword_D150); /*0xd39*/
  if ( n18 != 32 ) /*0xd3f*/
  {
    if ( n18 != 18 ) /*0xd44*/
    {
      ReFlashBootFlow(v5, v4, a3); /*0xd46*/
      return 0; /*0xfb0*/
    }
    n29 = 29; /*0xd54*/
    if ( (*(__int64 (__fastcall **)(const wchar_t *, void *, _QWORD, __int64 *, char *))(RuntimeServices + 72))( /*0xd83*/
           L"AmiFlashUpd",
           &unk_C900,
           0,
           &n29,
           &v22) >= 0 )
    {
      HIBYTE(n0x1000000) = (v23 & 4) != 0; /*0xd90*/
      LOBYTE(n257) = v23 & 1; /*0xd9d*/
      HIBYTE(n257) = (v23 & 2) != 0; /*0xda0*/
    }
  }
  if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_C870, 0, &qword_F698) < 0 ) /*0xdc3*/
  {
    v7 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_C870, 0, &qword_F698); /*0xddc*/
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v7); /*0xdf1*/
    DebugAssert( /*0xe09*/
      "e:\\hs\\AmiModulePkg\\Recovery\\ReFlash\\ReFlash.c",
      0x136u,
      "!EFI_ERROR (pBS->LocateProtocol(&gAmiFlashProtocolGuid, ((void *) 0), &Flash))");
  }
  FlashDescriptor = ReFlashFindFlashDescriptor(&ImageHandle__0, SystemTable_1); /*0xe15*/
  ::FlashDescriptor = (__int64)FlashDescriptor; /*0xe1a*/
  if ( !FlashDescriptor ) /*0xe24*/
  {
    LOBYTE(v10) = 0; /*0xe5c*/
    v11 = 0x8000000000000015uLL; /*0xe5e*/
    goto LABEL_14; /*0xe5e*/
  }
  Guid2_0 = (GUID *)*((_QWORD *)FlashDescriptor + 3); /*0xe2a*/
  dword_D140 = *(_DWORD *)((char *)FlashDescriptor + 37); /*0xe34*/
  v10 = *(_DWORD *)((char *)FlashDescriptor + 33); /*0xe3a*/
  v11 = *((unsigned __int8 *)FlashDescriptor + 32); /*0xe3d*/
  qword_D160 = v11; /*0xe41*/
  if ( v11 ) /*0xe4b*/
  {
    SystemTable_2 = (EFI_SYSTEM_TABLE *)0x8000000000000000LL; /*0xe4d*/
    v11 |= 0x8000000000000000uLL; /*0xe57*/
LABEL_14:
    qword_D160 = v11; /*0xe68*/
  }
  BYTE1(n0x1000000) = v11; /*0xe6f*/
  BYTE2(n0x1000000) = v10; /*0xe72*/
  if ( (_BYTE)v10 || (LOBYTE(n0x1000000) = 0, (_BYTE)v11) ) /*0xe7e*/
    LOBYTE(n0x1000000) = 1; /*0xe80*/
  v19 = v11 >= 0 && ReFlashCheckFlashState(&v26, SystemTable_2); /*0xe97*/
  n29 = 7; /*0xec1*/
  (*(void (__fastcall **)(const wchar_t *, void *, __int64, __int64, int *))(RuntimeServices + 88))( /*0xec8*/
    L"Setup",
    &unk_C8F0,
    7,
    7,
    &n0x1000000);
  n29 = 1; /*0xecf*/
  (*(void (__fastcall **)(const wchar_t *, void *, __int64, __int64, char *))(RuntimeServices + 88))( /*0xef3*/
    L"Setup2",
    &unk_C8F0,
    7,
    1,
    &v24);
  LOBYTE(ImageHandle_1) = qword_D160 < 0; /*0xefe*/
  result = ReFlashCheckAndDispatch(ImageHandle_1, SystemTable_3, a3); /*0xf01*/
  if ( result && result != 0xA000000000000001uLL ) /*0xf1c*/
  {
    ReFlashGetBootDevice(); /*0xf22*/
    (*(void (__fastcall **)(const wchar_t *, void *, __int64, __int64, int *))(RuntimeServices + 88))( /*0xf4d*/
      L"BootFlow",
      &unk_C8B0,
      2,
      4,
      &n2);
    if ( (_BYTE)n0x1000000 == 1 ) /*0xf54*/
      ReFlashUpdateBootSettings(v15, &n0x1000000); /*0xf5a*/
    if ( v26 ) /*0xf64*/
    {
      n48 = 48; /*0xf75*/
      if ( v26 != 1 ) /*0xf7c*/
        n48 = 49; /*0xf7e*/
      ReFlashReadHiiString(qword_D158, n48, &n29, (__int64 *)&________________); /*0xf83*/
      if ( ________________ ) /*0xf8f*/
      {
        ReFlashSetProgress(qword_D158, 0x2Fu, ________________); /*0xf9d*/
        (*(void (__fastcall **)(wchar_t *))(BootServices + 72))(________________); /*0xfad*/
      }
    }
    return 0; /*0xfad*/
  }
  return result; /*0xfb2*/
}


// Function: ReFlashShowErrorDialog @ 0xfbc (0x77 bytes)

__int64 __fastcall ReFlashShowErrorDialog(
        wchar_t *Flash_update,
        wchar_t *Flash_update_completed._Press_any_key_to_reset_the_system)
{
  __int64 result; // rax
  __int64 PopupResult; // [rsp+40h] [rbp+18h] BYREF

  PopupResult = 0; /*0xfc6*/
  if ( byte_D188 ) /*0xfd9*/
  {
    (*(void (__fastcall **)(__int64, void *))(qword_D198 + 16))(qword_D198, &unk_A640); /*0xfec*/
    result = (**(__int64 (__fastcall ***)(_QWORD, _QWORD))(SystemTable + 48))(*(_QWORD *)(SystemTable + 48), 0); /*0xfff*/
  }
  if ( byte_C948 ) /*0x1009*/
  {
    result = qword_D1A8; /*0x100b*/
    if ( qword_D1A8 ) /*0x1015*/
      return (*(__int64 (__fastcall **)(wchar_t *, wchar_t *, _QWORD, __int64 *))(qword_D1A8 + 88))( /*0x1025*/
               Flash_update,
               Flash_update_completed._Press_any_key_to_reset_the_system,
               0,
               &PopupResult);
  }
  return result; /*0x102d*/
}


// Function: ReFlashShowHiiPopup @ 0x1034 (0x57 bytes)

__int64 __fastcall ReFlashShowHiiPopup(wchar_t *ERROR____, const wchar_t *Image_is_not_selected)
{
  __int64 result; // rax
  __int64 PopupResult; // [rsp+40h] [rbp+18h] BYREF
  __int64 HiiHandle; // [rsp+48h] [rbp+20h] BYREF

  PopupResult = 0; /*0x104a*/
  result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_C928, 0, &HiiHandle); /*0x105f*/
  if ( !result ) /*0x1068*/
    return (*(__int64 (__fastcall **)(wchar_t *, const wchar_t *, _QWORD, __int64 *))(HiiHandle + 88))( /*0x107d*/
             ERROR____,
             Image_is_not_selected,
             0,
             &PopupResult);
  return result; /*0x1085*/
}


// Function: ReFlashInitCallback @ 0x108c (0x18b bytes)

__int64 __fastcall ReFlashInitCallback(char a1, char a2)
{
  __int64 result; // rax
  __int64 FuncIdx; // rdx
  __int64 n100; // r8
  __int64 TotalBlocks; // r9
  int FuncIndex; // ebx
  void (__fastcall *i)(); // rax
  int RegionEndPtr; // r10d
  __int64 v10; // r8
  __int64 RegionBase; // rax
  __int64 v12; // rax

  if ( byte_D1A4 ) /*0x109b*/
    return qword_D190; /*0x120a*/
  byte_D1A4 = 1; /*0x10a9*/
  if ( !Guid2_0 ) /*0x10b0*/
    return 0x8000000000000015uLL; /*0x10bc*/
  if ( !a2 ) /*0x10c3*/
    qword_D190 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_C928, 0, &qword_D1A8); /*0x10e2*/
  result = ReFlashEnumerateRegions(); /*0x10e9*/
  qword_D190 = result; /*0x10ee*/
  if ( result >= 0 ) /*0x10f8*/
  {
    ReFlashParseVarStore(a1, FuncIdx, n100, TotalBlocks); /*0x1100*/
    qword_D190 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_C750, 0, &qword_D198); /*0x1122*/
    if ( qword_D190 >= 0 ) /*0x112c*/
    {
      (*(void (__fastcall **)(__int64, void *))(qword_D198 + 16))(qword_D198, &unk_A640); /*0x113f*/
      byte_D188 = 1; /*0x1142*/
    }
    if ( !a1 ) /*0x114b*/
    {
      if ( qword_D160 < 0 ) /*0x1155*/
      {
        (*(void (__fastcall **)(__int64))(BootServices + 248))(5000000); /*0x1163*/
        return 0x8000000000000015uLL; /*0x1169*/
      }
      byte_C948 = 0; /*0x116e*/
    }
    FuncIndex = 0; /*0x1175*/
    for ( i = (void (__fastcall *)())ReFlashCheckSmbiosPreserve; i; i = (void (__fastcall *)())funcs_1180[FuncIndex] ) /*0x1177*/
    {
      i(); /*0x1180*/
      ++FuncIndex; /*0x1182*/
    }
    RegionEndPtr = 0; /*0x119b*/
    v10 = 0; /*0x119e*/
    if ( *(_DWORD *)(RegionBase + 36) == 1 ) /*0x11a6*/
    {
      RegionBase = RegionBase; /*0x11a8*/
      do /*0x11cf*/
      {
        if ( *(_BYTE *)(RegionBase + 40) ) /*0x11ab*/
          RegionEndPtr += *(_QWORD *)(RegionBase + 24) / (unsigned __int64)*(unsigned int *)(RegionBase + 32); /*0x11bd*/
        v10 = (unsigned int)(v10 + 1); /*0x11c0*/
        RegionBase = RegionBase + 72 * v10; /*0x11c7*/
      }
      while ( *(_DWORD *)(RegionBase + 36) == 1 ); /*0x11cf*/
    }
    while ( 1 ) /*0x11ef*/
    {
      v12 = RegionBase + 72 * v10; /*0x11ef*/
      if ( *(_DWORD *)(v12 + 36) == 5 ) /*0x11f7*/
        break; /*0x11f7*/
      if ( *(_BYTE *)(v12 + 40) ) /*0x11d3*/
        RegionEndPtr += *(_QWORD *)(v12 + 24) / (unsigned __int64)*(unsigned int *)(v12 + 32); /*0x11e5*/
      v10 = (unsigned int)(v10 + 1); /*0x11e8*/
    }
    ::RegionEndPtr = RegionEndPtr; /*0x1200*/
    (*(void (**)(void))(qword_F698 + 32))(); /*0x1207*/
    return qword_D190; /*0x1207*/
  }
  return result; /*0x1211*/
}


// Function: ReFlashBootCompleteReset @ 0x1218 (0x66 bytes)

unsigned __int64 ReFlashBootCompleteReset()
{
  int FuncIdx; // ebx
  void (__fastcall *i)(); // rax

  (*(void (**)(void))(qword_F698 + 40))(); /*0x1225*/
  FuncIdx = 0; /*0x1228*/
  for ( i = (void (__fastcall *)())ReFlashSaveSmbiosIfNeeded; i; i = (void (__fastcall *)())funcs_1233[FuncIdx] ) /*0x122a*/
  {
    i(); /*0x1233*/
    ++FuncIdx; /*0x1235*/
  }
  ReFlashShowErrorDialog( /*0x1255*/
    (wchar_t *)L"Flash update",
    (wchar_t *)L"Flash update completed. Press any key to reset the system");
  (*(void (__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(RuntimeServices + 104))(0, 0, 0, 0); /*0x126b*/
  return 0x8000000000000007uLL; /*0x1278*/
}


// Function: ReFlashIterateRegions @ 0x1280 (0x121 bytes)

__int64 __fastcall ReFlashIterateRegions(__int64 CtxPtr, __int64 a2)
{
  __int64 RegionBase; // r8
  __int64 RegionIdx; // rsi
  __int64 BlockOffset; // rdi
  __int64 BlockIdx; // rbp
  unsigned __int64 BlockCount; // r15
  __int64 result; // rax
  unsigned int ProgressPct; // r14d
  __int64 FlashOp; // rcx

  if ( !RegionEndPtr_0 ) /*0x12a2*/
    (*(void (__fastcall **)(__int64))a2)(a2); /*0x12a7*/
  RegionBase = ::RegionBase; /*0x12a9*/
  RegionIdx = 0; /*0x12b0*/
  if ( *(_DWORD *)(::RegionBase + 36) == 5 ) /*0x12b7*/
  {
LABEL_12:
    if ( byte_DA00 ) /*0x1356*/
    {
      FlashOp = 2; /*0x1358*/
    }
    else
    {
      if ( !SetFlag ) /*0x1366*/
      {
LABEL_17:
        if ( RegionEndPtr_0 == RegionEndPtr ) /*0x137e*/
          (*(void (__fastcall **)(__int64))(a2 + 16))(a2); /*0x1383*/
        return 0; /*0x1386*/
      }
      FlashOp = 1; /*0x1368*/
    }
    ReFlashSetBootFlag(FlashOp); /*0x136d*/
    goto LABEL_17; /*0x136d*/
  }
  BlockOffset = 0; /*0x12bd*/
  while ( 1 ) /*0x12bf*/
  {
    if ( *(_BYTE *)(BlockOffset + RegionBase + 40) ) /*0x12bf*/
    {
      BlockIdx = 0; /*0x12d3*/
      BlockCount = *(_QWORD *)(BlockOffset + RegionBase + 24) /*0x12d8*/
                 / (unsigned __int64)*(unsigned int *)(BlockOffset + RegionBase + 32);
      if ( BlockCount ) /*0x12de*/
        break; /*0x12de*/
    }
LABEL_11:
    ++RegionIdx; /*0x1338*/
    BlockOffset = 72 * RegionIdx; /*0x133f*/
    if ( *(_DWORD *)(72 * RegionIdx + RegionBase + 36) == 5 ) /*0x1349*/
      goto LABEL_12; /*0x1349*/
  }
  while ( 1 ) /*0x12e7*/
  {
    result = (*(__int64 (__fastcall **)(__int64, __int64))(BlockOffset + RegionBase + 56))( /*0x12e7*/
               BlockOffset + RegionBase,
               BlockIdx);
    if ( result < 0 ) /*0x12ef*/
      return result; /*0x1397*/
    ++RegionEndPtr_0; /*0x12ff*/
    ProgressPct = 100 * RegionEndPtr_0 / (unsigned int)RegionEndPtr; /*0x1314*/
    if ( ProgressPct > ::ProgressPct ) /*0x1317*/
    {
      (*(void (__fastcall **)(__int64, _QWORD))(a2 + 8))(a2, ProgressPct); /*0x131f*/
      ::ProgressPct = ProgressPct; /*0x1322*/
    }
    RegionBase = ::RegionBase; /*0x1329*/
    if ( ++BlockIdx >= BlockCount ) /*0x1336*/
      goto LABEL_11; /*0x1336*/
  }
}


// Function: ReFlashCallbackDispatcher @ 0x13a4 (0x1bb bytes)

unsigned __int64 __fastcall ReFlashCallbackDispatcher(
        __int64 CtxPtr,
        __int64 a2,
        __int64 n100,
        __int64 TotalBlocks,
        int a5,
        _QWORD *a6)
{
  __int64 InitStatus; // rax
  _WORD *i; // r8
  __int64 v9; // r9
  const char *FilePath; // rax
  __int64 FlashResult; // rax
  const wchar_t *Image_is_not_selected; // rdx
  __int64 VarStoreId; // [rsp+38h] [rbp+10h] BYREF

  if ( a6 ) /*0x13b0*/
    *a6 = 0; /*0x13b2*/
  if ( a2 ) /*0x13b9*/
    return 0x8000000000000003uLL; /*0x13c9*/
  switch ( (_WORD)n100 ) /*0x13cf*/
  {
    case 'e': /*0x13cf*/
      InitStatus = ReFlashInitCallback(1, 0); /*0x13d5*/
      if ( qword_D160 >= 0 && InitStatus >= 0 ) /*0x13e7*/
        return 0; /*0x13e7*/
      ReFlashShowErrorDialog( /*0x13f7*/
        (wchar_t *)L"ERROR!!!!",
        (wchar_t *)L"Flash update failed to initialize. Press any key to reset system");
      goto LABEL_9; /*0x13f7*/
    case 'f': /*0x13cf*/
      VarStoreId = 7; /*0x1423*/
      if ( ReFlashReadHiiConfig(&VarStoreId, (__int64)&a6, n100, TotalBlocks) >= 0 ) /*0x1439*/
      {
        LOBYTE(a6) = 0; /*0x1445*/
        ReFlashWriteHiiConfig(VarStoreId, (__int64)&a6, i, v9); /*0x144a*/
      }
      return 0; /*0x144f*/
    case 'g': /*0x13cf*/
      if ( !Assert_0(CtxPtr, 0, n100, TotalBlocks) ) /*0x1458*/
      {
        FilePath = (const char *)ReFlashGetImageFilePath(); /*0x1462*/
        ReFlashLogImageInfo(FilePath); /*0x146a*/
      }
      return 0; /*0x146f*/
    case 'i': /*0x13cf*/
      FlashResult = ReFlashLoadFirmwareImage(0); /*0x147e*/
      if ( FlashResult ) /*0x1486*/
      {
        switch ( FlashResult ) /*0x1495*/
        {
          case 0x8000000000000002LL: /*0x1495*/
            Image_is_not_selected = L"Image is not selected"; /*0x14f2*/
            break;
          case 0x8000000000000003LL: /*0x1495*/
            Image_is_not_selected = L"Platform doesn't support firmware update"; /*0x14da*/
            break;
          case 0x800000000000000ELL: /*0x1495*/
            Image_is_not_selected = L"Image is not compatible with platform"; /*0x14d1*/
            break;
          case 0x800000000000001ALL: /*0x1495*/
            Image_is_not_selected = L"Image validation failed"; /*0x14c8*/
            break;
          default:
            return 0; /*0x14c2*/
        }
        ReFlashShowHiiPopup((wchar_t *)L"ERROR!!!!", Image_is_not_selected); /*0x14e8*/
        return 0; /*0x14ed*/
      }
      ReFlashShowHiiPopup((wchar_t *)L"Flash update", L"Flash update completed. Press any key to reset the system"); /*0x1509*/
LABEL_9:
      (*(void (__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(RuntimeServices + 104))(0, 0, 0, 0); /*0x13fc*/
      return 0; /*0x1416*/
  }
  if ( (_WORD)n100 != 100 ) /*0x1518*/
    return 0; /*0x1518*/
  if ( ReFlashIterateRegions(CtxPtr, (__int64)&off_C9D0) < 0 ) /*0x152d*/
  {
    ReFlashShowErrorDialog((wchar_t *)L"ERROR!!!!", (wchar_t *)L"Flash update failed. Press any key to reset system"); /*0x153d*/
    (*(void (__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(RuntimeServices + 104))(0, 0, 0, 0); /*0x1553*/
  }
  return ReFlashBootCompleteReset(); /*0x13c5*/
}


// Function: ReFlashRegionRead @ 0x1560 (0x104 bytes)

__int64 __fastcall ReFlashRegionRead(__int64 a1, __int64 a2)
{
  __int64 result; // rax
  __int64 ByteOffset; // rcx
  __int64 FlashSrcPtr; // rbx
  __int64 FlashDstPtr; // rsi
  __int64 EraseWriteStatus; // rbx
  __int64 TimerEvent; // rbx
  __int64 ReadStatus; // rdi
  __int64 DmaHandle; // [rsp+30h] [rbp+8h] BYREF

  result = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64 *))(BootServices + 64))( /*0x1589*/
             4,
             *(unsigned int *)(a1 + 32),
             &DmaHandle);
  if ( result >= 0 ) /*0x158f*/
  {
    ByteOffset = a2 * *(unsigned int *)(a1 + 32); /*0x159c*/
    FlashSrcPtr = ByteOffset + *(_QWORD *)a1; /*0x15a3*/
    FlashDstPtr = ByteOffset + *(_QWORD *)(a1 + 8); /*0x15a6*/
    if ( *(_DWORD *)(a1 + 36) == 1 && byte_C960 ) /*0x15b6*/
    {
      byte_C960 = 0; /*0x15cb*/
      (*(void (__fastcall **)(__int64, __int64, void *))(qword_F698 + 16))(4279304232LL, 4, &unk_D1B0); /*0x15d7*/
    }
    EraseWriteStatus = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64))qword_F698)( /*0x15ee*/
                         FlashSrcPtr,
                         *(unsigned int *)(a1 + 32),
                         DmaHandle);
    if ( EraseWriteStatus >= 0 ) /*0x15f4*/
    {
      TimerEvent = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(31); /*0x1626*/
      ReadStatus = (*(__int64 (__fastcall **)(__int64, _QWORD, __int64))(qword_F698 + 24))( /*0x163c*/
                     FlashDstPtr,
                     *(unsigned int *)(a1 + 32),
                     DmaHandle);
      (*(void (__fastcall **)(__int64))(BootServices + 32))(TimerEvent); /*0x163f*/
      (*(void (__fastcall **)(__int64))(BootServices + 72))(DmaHandle); /*0x164e*/
      return ReadStatus; /*0x1651*/
    }
    else
    {
      (*(void (__fastcall **)(__int64))(BootServices + 72))(DmaHandle); /*0x1602*/
      return EraseWriteStatus; /*0x1605*/
    }
  }
  return result; /*0x165e*/
}


// Function: ReFlashRegionWrite @ 0x1664 (0x83 bytes)

__int64 __fastcall ReFlashRegionWrite(__int64 a1, __int64 a2)
{
  __int64 ByteOffset; // r9
  __int64 SrcPtr; // rbx
  char *DstPtr; // rsi
  __int64 TimerEvent; // rdi
  __int64 WriteStatus; // rbx

  ByteOffset = a2 * *(unsigned int *)(a1 + 32); /*0x1692*/
  SrcPtr = ByteOffset + *(_QWORD *)a1; /*0x1699*/
  DstPtr = (char *)Guid2_0 + ByteOffset + *(unsigned int *)(a1 + 16); /*0x169c*/
  TimerEvent = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(31); /*0x16b7*/
  WriteStatus = (*(__int64 (__fastcall **)(__int64, _QWORD, char *))(qword_F698 + 24))( /*0x16c8*/
                  SrcPtr,
                  *(unsigned int *)(a1 + 32),
                  DstPtr);
  (*(void (__fastcall **)(__int64))(BootServices + 32))(TimerEvent); /*0x16cb*/
  return WriteStatus; /*0x16e0*/
}


// Function: ReFlashRegionEraseWrite @ 0x16e8 (0xa4 bytes)

__int64 __fastcall ReFlashRegionEraseWrite(__int64 a1, __int64 a2)
{
  __int64 ByteOffset; // r9
  __int64 FlashAddr; // r14
  char *VerifyAddr; // rsi
  __int64 TimerEvent; // rbp
  __int64 OpStatus; // rbx

  ByteOffset = a2 * *(unsigned int *)(a1 + 32); /*0x171a*/
  FlashAddr = ByteOffset + *(_QWORD *)a1; /*0x1721*/
  VerifyAddr = (char *)Guid2_0 + ByteOffset + *(unsigned int *)(a1 + 16); /*0x1724*/
  TimerEvent = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(31); /*0x173b*/
  OpStatus = (*(__int64 (__fastcall **)(__int64, _QWORD))(qword_F698 + 8))(FlashAddr, *(unsigned int *)(a1 + 32)); /*0x1742*/
  if ( OpStatus >= 0 ) /*0x1748*/
    OpStatus = (*(__int64 (__fastcall **)(__int64, _QWORD, char *))(qword_F698 + 16))( /*0x175e*/
                 FlashAddr,
                 *(unsigned int *)(a1 + 32),
                 VerifyAddr);
  (*(void (__fastcall **)(__int64))(BootServices + 32))(TimerEvent); /*0x176b*/
  return OpStatus; /*0x1785*/
}


// Function: ReFlashInitFlashRegion @ 0x178c (0x18e bytes)

__int64 __fastcall ReFlashInitFlashRegion(GUID *Guid1, unsigned int EnabledCount, int n3)
{
  __int64 RegionSlot; // rbx
  __int64 RegionBase; // rax
  __int64 SlotIdx; // rdx
  __int64 (__fastcall *ReFlashRegionEraseWrite_1)(__int64, __int64); // rcx
  __int16 FlashDevId; // cx
  __int64 TotalSize; // r8
  __int64 ImageBase; // rcx
  __int64 AdjustedBase; // rcx

  if ( n3 == 5 ) /*0x179b*/
  {
    RegionSlot = 9LL * EnabledCount; /*0x179d*/
    InternalSetMem16((int *)(RegionBase + 72LL * EnabledCount), 0x48u, 0); /*0x17b3*/
    RegionBase = RegionBase; /*0x17b8*/
    *(_DWORD *)(RegionBase + 8 * RegionSlot + 36) = 5; /*0x17bf*/
  }
  else
  {
    SlotIdx = 9LL * EnabledCount; /*0x17d0*/
    *(_QWORD *)(RegionBase + 8 * SlotIdx) = *(_QWORD *)&Guid1[1].Data1; /*0x17e8*/
    *(_DWORD *)(RegionBase + 8 * SlotIdx + 16) = *(_DWORD *)Guid1[1].Data4; /*0x17f7*/
    *(_QWORD *)(RegionBase + 8 * SlotIdx + 24) = *(unsigned int *)&Guid1[1].Data4[4]; /*0x1806*/
    *(_DWORD *)(RegionBase + 8 * SlotIdx + 32) = 4096; /*0x1812*/
    *(_DWORD *)(RegionBase + 8 * SlotIdx + 36) = n3; /*0x1821*/
    *(_BYTE *)(RegionBase + 8 * SlotIdx + 40) = 1; /*0x182d*/
    *(_BYTE *)(RegionBase + 8 * SlotIdx + 41) = 0; /*0x1839*/
    if ( *(_QWORD *)&Guid1[1].Data1 + *(unsigned int *)&Guid1[1].Data4[4] == 0x100000000LL /*0x1856*/
      || (ReFlashRegionEraseWrite_1 = ReFlashRegionWrite, n3 == 3) )
    {
      ReFlashRegionEraseWrite_1 = ReFlashRegionEraseWrite; /*0x1858*/
    }
    *(_QWORD *)(RegionBase + 8 * SlotIdx + 56) = ReFlashRegionEraseWrite_1; /*0x186a*/
    FlashDevId = 22; /*0x186f*/
    if ( n3 == 2 ) /*0x1877*/
      FlashDevId = 43; /*0x1877*/
    if ( !n3 ) /*0x1883*/
      FlashDevId = 42; /*0x1883*/
    if ( n3 == 1 ) /*0x1890*/
      FlashDevId = 41; /*0x1890*/
    *(_WORD *)(RegionBase + 8 * SlotIdx + 66) = FlashDevId; /*0x189b*/
    if ( n3 == 1 ) /*0x18a0*/
    {
      TotalSize = *(unsigned int *)&Guid1[1].Data4[4]; /*0x18a2*/
      ImageBase = *(_QWORD *)&Guid1[1].Data1; /*0x18a6*/
      if ( TotalSize + ImageBase == 0x100000000LL ) /*0x18b1*/
        AdjustedBase = ImageBase - TotalSize; /*0x18b3*/
      else
        AdjustedBase = 4279369728LL; /*0x18b8*/
      *(_QWORD *)(RegionBase + 8 * SlotIdx + 8) = AdjustedBase; /*0x18c4*/
      *(_WORD *)(RegionBase + 8 * SlotIdx + 64) = 40; /*0x18d5*/
      RegionBase = RegionBase; /*0x18e1*/
      *(_QWORD *)(RegionBase + 8 * SlotIdx + 48) = ReFlashRegionRead; /*0x18e8*/
    }
    else
    {
      *(_QWORD *)(RegionBase + 8 * SlotIdx + 8) = 0; /*0x18f6*/
      *(_WORD *)(RegionBase + 8 * SlotIdx + 64) = 0; /*0x1902*/
      RegionBase = RegionBase; /*0x1908*/
      *(_QWORD *)(RegionBase + 8 * SlotIdx + 48) = 0; /*0x190f*/
    }
  }
  return RegionBase; /*0x1914*/
}


// Function: ReFlashEnumerateRegions @ 0x191c (0x1b7 bytes)

__int64 ReFlashEnumerateRegions()
{
  unsigned int EnabledCount; // r14d
  unsigned int RegionIdx; // r15d
  char FirstRegion; // r12
  GUID *Guid1; // rbx
  __int64 result; // rax
  __int64 RegionSize; // rbp
  GUID *Guid1_1; // rcx
  __int64 TotalRegionCount; // rsi
  __int64 TotalRegionCount_1; // rax
  unsigned int ActiveIdx; // edi
  GUID *Guid1_2; // rcx
  int n2; // r8d
  BOOLEAN IsBootRegion; // al
  BOOLEAN IsFlashRegion; // al

  EnabledCount = 0; /*0x1939*/
  RegionIdx = 0; /*0x193c*/
  FirstRegion = 1; /*0x193f*/
  byte_DA00 = ReFlashCheckBootRegion(); /*0x1947*/
  ReFlashCopyGuidData(); /*0x194d*/
  Guid1 = Guid1; /*0x1952*/
  result = 0; /*0x1959*/
  if ( !Guid1 ) /*0x195e*/
  {
    if ( Guid2_0 ) /*0x196a*/
    {
      result = ReFlashReadRomLayout(Guid2_0, &Guid1); /*0x1973*/
      Guid1 = Guid1; /*0x1978*/
    }
    else
    {
      result = 0x8000000000000002uLL; /*0x1981*/
    }
  }
  RegionSize = (unsigned int)::RegionSize; /*0x198b*/
  if ( result >= 0 ) /*0x1994*/
  {
    Guid1_1 = Guid1; /*0x19a4*/
    TotalRegionCount = (unsigned int)n40 / ::RegionSize; /*0x19a7*/
    if ( (unsigned int)n40 / ::RegionSize ) /*0x19a2*/
    {
      TotalRegionCount_1 = (unsigned int)TotalRegionCount; /*0x19ad*/
      do /*0x19c8*/
      {
        if ( !Guid1_1[2].Data1 || (*(_DWORD *)&Guid1_1[2].Data2 & 0x200) != 0 ) /*0x19bc*/
          ++EnabledCount; /*0x19be*/
        Guid1_1 = (GUID *)((char *)Guid1_1 + (unsigned int)::RegionSize); /*0x19c1*/
        --TotalRegionCount_1; /*0x19c4*/
      }
      while ( TotalRegionCount_1 ); /*0x19c8*/
    }
    result = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(BootServices + 64))( /*0x19e9*/
               4,
               72LL * (EnabledCount + 1),
               &RegionBase);
    if ( result >= 0 ) /*0x19ef*/
    {
      ActiveIdx = EnabledCount - 2; /*0x19fb*/
      ReFlashInitFlashRegion(0, EnabledCount, 5); /*0x1a04*/
      if ( (_DWORD)TotalRegionCount ) /*0x1a0b*/
      {
        while ( 1 ) /*0x1a11*/
        {
          if ( Guid1[2].Data1 && (*(_DWORD *)&Guid1[2].Data2 & 0x200) == 0 ) /*0x1a1e*/
            goto LABEL_26; /*0x1a1e*/
          Guid1_2 = Guid1; /*0x1a2b*/
          if ( (*(_DWORD *)&Guid1[2].Data2 & 0x83E) == 0 ) /*0x1a2e*/
            break; /*0x1a2e*/
          if ( (*(_DWORD *)&Guid1[2].Data2 & 0x400) != 0 ) /*0x1a37*/
          {
            ReFlashInitFlashRegion(Guid1, RegionIdx++, 1); /*0x1a42*/
          }
          else
          {
            n2 = 0; /*0x1a4c*/
            if ( !FirstRegion ) /*0x1a52*/
              goto LABEL_25; /*0x1a52*/
            ReFlashInitFlashRegion(Guid1, EnabledCount - 1, 0); /*0x1a58*/
            FirstRegion = 0; /*0x1a5d*/
          }
LABEL_26:
          Guid1 = (GUID *)((char *)Guid1 + RegionSize); /*0x1aa5*/
          if ( !--TotalRegionCount ) /*0x1aac*/
            return 0; /*0x1aac*/
        }
        IsBootRegion = CompareGuid(Guid1, &Guid2); /*0x1a69*/
        Guid1_2 = Guid1; /*0x1a6e*/
        if ( IsBootRegion ) /*0x1a73*/
        {
          n2 = 2; /*0x1a75*/
        }
        else
        {
          IsFlashRegion = CompareGuid(Guid1, &Guid2__1); /*0x1a84*/
          Guid1_2 = Guid1; /*0x1a89*/
          n2 = 3; /*0x1a8c*/
          if ( !IsFlashRegion ) /*0x1a94*/
            n2 = 4; /*0x1a96*/
        }
LABEL_25:
        ReFlashInitFlashRegion(Guid1_2, ActiveIdx--, n2); /*0x1a9c*/
        goto LABEL_26; /*0x1aa3*/
      }
      return 0; /*0x1ab2*/
    }
  }
  return result; /*0x1ac8*/
}


// Function: ReFlashGetImageFilePath @ 0x1ad4 (0x54 bytes)

__int64 ReFlashGetImageFilePath()
{
  __int64 CurrentNode; // rbx
  __int64 NodeIter; // rcx

  CurrentNode = i_0; /*0x1ada*/
  if ( i_0 ) /*0x1ae4*/
  {
    for ( NodeIter = i_0; !Assert_29(NodeIter); NodeIter = CurrentNode ) /*0x1ae6*/
    {
      if ( Assert_38(CurrentNode) == 4 && Assert_35(CurrentNode) == 4 ) /*0x1b08*/
        return CurrentNode + 4; /*0x1b1e*/
      CurrentNode = Assert_31(CurrentNode); /*0x1b12*/
    }
  }
  return 0; /*0x1b22*/
}


// Function: ReFlashLogImageInfo @ 0x1b28 (0x71 bytes)

__int64 __fastcall ReFlashLogImageInfo(const char *FilePath)
{
  const char *FilePath_1; // rcx
  CHAR16 StartOfBuffer[260]; // [rsp+20h] [rbp-208h] BYREF

  if ( byte_C961 ) /*0x1b3b*/
  {
    Assert_5(FilePath, 3u, (wchar_t *)L"Firmware Update"); /*0x1b49*/
    byte_C961 = 0; /*0x1b4e*/
  }
  if ( FilePath )
    UnicodeSPrint(StartOfBuffer, 0x100u, "Image file: %s", FilePath);
  else
    UnicodeSPrint(StartOfBuffer, 0x100u, "Image file: Not defined");
  return Assert_5(FilePath_1, 0x36u, StartOfBuffer); /*0x1b90*/
}


// Function: ReFlashGetFlashInfo @ 0x1b9c (0xa3 bytes)

__int64 ReFlashGetFlashInfo()
{
  __int64 result; // rax
  __int64 FlashHdrPtr; // rdx
  __int64 ProtocolHandle; // [rsp+30h] [rbp+8h] BYREF

  result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C7F0, 0, &ProtocolHandle); /*0x1bb5*/
  if ( !result ) /*0x1bbe*/
  {
    FlashHdrPtr = FwInfoPtr; /*0x1bc5*/
    *(_QWORD *)FwInfoPtr = *(_QWORD *)(*(_QWORD *)(ProtocolHandle + 24) + 24LL); /*0x1bd4*/
    *(_DWORD *)(FlashHdrPtr + 8) = *(_DWORD *)(*(_QWORD *)(ProtocolHandle + 24) + 32LL); /*0x1be3*/
    *(_WORD *)(FlashHdrPtr + 12) = *(_WORD *)(*(_QWORD *)(*(_QWORD *)(ProtocolHandle + 24) + 8LL) + 4LL); /*0x1bf7*/
    *(_WORD *)(FlashHdrPtr + 14) = *(_WORD *)(*(_QWORD *)(*(_QWORD *)(ProtocolHandle + 24) + 8LL) + 8LL); /*0x1c0c*/
    *(_WORD *)(FlashHdrPtr + 16) = *(_WORD *)(*(_QWORD *)(*(_QWORD *)(ProtocolHandle + 24) + 8LL) + 32LL); /*0x1c21*/
    result = *(_QWORD *)(*(_QWORD *)(ProtocolHandle + 24) + 8LL); /*0x1c2e*/
    *(_WORD *)(FlashHdrPtr + 18) = *(_WORD *)(result + 12); /*0x1c36*/
  }
  return result; /*0x1c3a*/
}


// Function: ReFlashLoadFirmwareImage @ 0x1c40 (0x12d bytes)

__int64 __fastcall ReFlashLoadFirmwareImage(void *FwImage)
{
  void *FwImage_1; // rbx
  UINTN n0x1000000; // rdi
  __int64 FwInfoPtr; // rcx
  __int64 UpdateStatus; // rbx
  int p_ImageType; // [rsp+30h] [rbp+8h] BYREF
  UINTN p_n0x1000000; // [rsp+38h] [rbp+10h] BYREF

  FwImage_1 = FwImage; /*0x1c4a*/
  if ( FwImage ) /*0x1c50*/
  {
    n0x1000000 = 0x1000000; /*0x1c52*/
  }
  else
  {
    if ( !i_0 ) /*0x1c63*/
      return 0x8000000000000002uLL; /*0x1c6f*/
    FwImage_1 = ReFlashParseFirmwareImage(i_0, &p_n0x1000000, &p_ImageType); /*0x1c83*/
    if ( !FwImage_1 || (n0x1000000 = p_n0x1000000, p_n0x1000000 != 0x1000000) ) /*0x1c9b*/
    {
      DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "can't find file or file is of wrong size\n"); /*0x1d53*/
      return 0x800000000000000EuLL; /*0x1d58*/
    }
  }
  ReFlashGetFlashInfo(); /*0x1ca1*/
  FwInfoPtr = ::FwInfoPtr; /*0x1cad*/
  *(_QWORD *)(qword_D150 + 40) = FwImage_1; /*0x1cb4*/
  *(_QWORD *)(qword_D150 + 48) = n0x1000000; /*0x1cbf*/
  *(_QWORD *)(qword_D150 + 56) = FwInfoPtr; /*0x1cca*/
  if ( *(_QWORD *)FwInfoPtr ) /*0x1cce*/
  {
    SourceBuffer = AllocatePool(*(unsigned int *)(FwInfoPtr + 8)); /*0x1ce6*/
    CopyMem(SourceBuffer, *(const void **)::FwInfoPtr, *(unsigned int *)(::FwInfoPtr + 8)); /*0x1cf4*/
    ZeroMem(*(_QWORD *)::FwInfoPtr, *(unsigned int *)(::FwInfoPtr + 8)); /*0x1d06*/
  }
  UpdateStatus = ReFlashSubProcessor(4u); /*0x1d1c*/
  if ( *(_QWORD *)::FwInfoPtr ) /*0x1d1f*/
  {
    CopyMem(*(void **)::FwInfoPtr, SourceBuffer, *(unsigned int *)(::FwInfoPtr + 8)); /*0x1d32*/
    AllocatePoolWithAssert(); /*0x1d3e*/
  }
  return UpdateStatus; /*0x1d67*/
}


// Function: ReFlashGetDefaultFwVersion @ 0x1d70 (0x11e bytes)

__int64 __fastcall ReFlashGetDefaultFwVersion(void *DestinationBuffer, __int64 a2, double a3)
{
  __int64 result; // rax
  __int64 v5; // rbx
  __int64 v6; // r8
  __int64 v7; // [rsp+40h] [rbp-20h] BYREF
  __int64 v8; // [rsp+48h] [rbp-18h] BYREF
  __int64 v9; // [rsp+50h] [rbp-10h] BYREF
  char v10; // [rsp+88h] [rbp+28h] BYREF
  char *SourceBuffer; // [rsp+90h] [rbp+30h] BYREF
  unsigned __int64 v12; // [rsp+98h] [rbp+38h] BYREF

  result = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(BootServices_0 + 312))( /*0x1da0*/
             2,
             &unk_C790,
             0,
             &v12,
             &v7);
  if ( result >= 0 ) /*0x1da9*/
  {
    v5 = 0; /*0x1daf*/
    if ( v12 ) /*0x1db5*/
    {
      while ( 1 ) /*0x1dd1*/
      {
        if ( (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices_0 + 152))( /*0x1dda*/
               *(_QWORD *)(v7 + 8 * v5),
               &unk_C790,
               &v9) >= 0 )
        {
          SourceBuffer = 0; /*0x1ddc*/
          v8 = 0; /*0x1de5*/
          LOBYTE(v6) = 24; /*0x1dfd*/
          if ( (*(__int64 (__fastcall **)(__int64, void *, __int64, _QWORD, char **, __int64 *, char *))(v9 + 24))( /*0x1e1b*/
                 v9,
                 &unk_C9B8,
                 v6,
                 0,
                 &SourceBuffer,
                 &v8,
                 &v10) >= 0 )
            break; /*0x1e1b*/
        }
        if ( ++v5 >= v12 ) /*0x1e24*/
          goto LABEL_6; /*0x1e24*/
      }
      DebugPrintErrorLevel(-1, "extracted section with guid %g\n", a3); /*0x1e55*/
      SourceBuffer += 16; /*0x1e6b*/
      CopyMem(DestinationBuffer, SourceBuffer, 0x78u); /*0x1e6f*/
      SourceBuffer -= 16; /*0x1e83*/
      (*(void (**)(void))(BootServices_0 + 72))(); /*0x1e87*/
      return 0; /*0x1e8a*/
    }
    else
    {
LABEL_6:
      (*(void (__fastcall **)(__int64))(BootServices_0 + 72))(v7); /*0x1e26*/
      return 0x800000000000000EuLL; /*0x1e34*/
    }
  }
  return result; /*0x1e3e*/
}


// Function: ReFlashGetFwVersion @ 0x1e90 (0xd3 bytes)

__int64 __fastcall ReFlashGetFwVersion(const GUID *Guid2, __int64 a2, double a3)
{
  __int64 DefaultFwVersion; // rax
  unsigned int Data1; // esi
  const GUID *Guid2_2; // rbx
  unsigned __int64 Guid2_1; // rax
  unsigned __int8 FormatString[2]; // [rsp+20h] [rbp-49h] BYREF
  __int16 v10; // [rsp+22h] [rbp-47h]
  __int16 v11; // [rsp+24h] [rbp-45h]
  __int16 v12; // [rsp+26h] [rbp-43h]
  __int16 v13; // [rsp+28h] [rbp-41h]
  _BYTE DestinationBuffer[128]; // [rsp+30h] [rbp-39h] BYREF
  unsigned __int64 v15; // [rsp+D0h] [rbp+67h] BYREF

  if ( Guid2 ) /*0x1eb3*/
  {
    Data1 = Guid1_.Data1; /*0x1ec0*/
    Guid2_2 = Guid2 + 0xFFFFF; /*0x1ec6*/
    while ( Guid2_2->Data1 != Data1 || !CompareGuid(&Guid1_, Guid2_2) ) /*0x1ee2*/
    {
      Guid2_1 = (unsigned __int64)Guid2_2; /*0x1ee4*/
      Guid2_2 = (const GUID *)((char *)Guid2_2 - 4); /*0x1ee7*/
      if ( Guid2_1 < (unsigned __int64)Guid2 ) /*0x1eee*/
      {
        DefaultFwVersion = 0x800000000000000EuLL; /*0x1ef0*/
        goto LABEL_8; /*0x1ef0*/
      }
    }
    CopyMem(DestinationBuffer, &Guid2_2[1], 0x78u); /*0x1f11*/
  }
  else
  {
    DefaultFwVersion = ReFlashGetDefaultFwVersion(DestinationBuffer, a2, a3); /*0x1eb9*/
LABEL_8:
    if ( DefaultFwVersion < 0 ) /*0x1efd*/
      return 0; /*0x1f01*/
  }
  *(_WORD *)FormatString = DestinationBuffer[38]; /*0x1f1e*/
  v10 = DestinationBuffer[39]; /*0x1f2a*/
  v11 = DestinationBuffer[41]; /*0x1f32*/
  v12 = DestinationBuffer[42]; /*0x1f3a*/
  v13 = 0; /*0x1f3e*/
  ReFlashParseVersionString(FormatString, a2, &v15); /*0x1f43*/
  return (unsigned int)v15; /*0x1f5b*/
}


// Function: ReFlashBootFlow @ 0x1f64 (0x173 bytes)

__int64 __fastcall ReFlashBootFlow(__int64 a1, __int64 a2, double a3)
{
  __int64 result; // rax
  __int64 v4; // rdx
  __int64 v5; // rbx
  GUID SourceBuffer; // [rsp+30h] [rbp-50h] BYREF
  int v8; // [rsp+40h] [rbp-40h]
  int FwVersion; // [rsp+44h] [rbp-3Ch]
  int FwVersion_1; // [rsp+48h] [rbp-38h]
  int n327680; // [rsp+4Ch] [rbp-34h]
  int FwVersion_2; // [rsp+50h] [rbp-30h]
  int n4; // [rsp+54h] [rbp-2Ch]
  _BYTE DestinationBuffer[40]; // [rsp+58h] [rbp-28h] BYREF
  __int64 v15; // [rsp+90h] [rbp+10h] BYREF
  int FwVersion_3; // [rsp+98h] [rbp+18h] BYREF
  int v17; // [rsp+9Ch] [rbp+1Ch]
  __int64 n8; // [rsp+A0h] [rbp+20h] BYREF

  n8 = 8; /*0x1f7b*/
  if ( CompareGuid(&Guid1__0, &Guid2_) ) /*0x1f8a*/
    return 0x8000000000000003uLL; /*0x1f9d*/
  result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C7D0, 0, &v15); /*0x1fb6*/
  if ( result >= 0 ) /*0x1fbf*/
  {
    v8 = 1; /*0x1fd3*/
    SourceBuffer = Guid2_; /*0x1fd6*/
    FwVersion = ReFlashGetFwVersion(0, v4, a3); /*0x1fe0*/
    FwVersion_1 = FwVersion; /*0x1fe7*/
    n327680 = 327680; /*0x1ff5*/
    if ( (*(__int64 (__fastcall **)(const wchar_t *, void *, _QWORD, __int64 *, int *))(RuntimeServices_0 + 72))( /*0x2018*/
           L"AmiFwVersion",
           &unk_C880,
           0,
           &n8,
           &FwVersion_3) < 0 )
    {
      n4 = 0; /*0x2070*/
      FwVersion_2 = FwVersion; /*0x2074*/
    }
    else
    {
      FwVersion_2 = FwVersion_3; /*0x201d*/
      switch ( v17 ) /*0x2025*/
      {
        case 1: /*0x2025*/
          n4 = 4; /*0x2064*/
          break;
        case 2: /*0x2025*/
        case 3: /*0x2025*/
          n4 = 5; /*0x205b*/
          break;
        case 4: /*0x2025*/
          n4 = 3; /*0x2052*/
          break;
        case 5: /*0x2025*/
          n4 = 6; /*0x2049*/
          break;
        case 6: /*0x2025*/
          n4 = 7; /*0x2040*/
          break;
        default:
          n4 = 1; /*0x203b*/
          break;
      }
    }
    v5 = (*(__int64 (__fastcall **)(GUID *, _BYTE *))v15)(&Guid2_, DestinationBuffer); /*0x2088*/
    if ( v5 < 0 ) /*0x208e*/
      return (*(__int64 (__fastcall **)(GUID *))(v15 + 16))(&SourceBuffer); /*0x2098*/
    if ( !CompareMem(DestinationBuffer, &SourceBuffer, 0x28u) ) /*0x20b3*/
      return v5; /*0x20c3*/
    return (*(__int64 (__fastcall **)(GUID *))(v15 + 8))(&SourceBuffer); /*0x20c0*/
  }
  return result; /*0x20ce*/
}


// Function: ReFlashCheckAndDispatch @ 0x20d8 (0x13f bytes)

__int64 __fastcall ReFlashCheckAndDispatch(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable, double a3)
{
  char ImageHandle_1; // si
  _WORD *HobList; // rbx
  bool i; // zf
  _WORD *NextHob; // rax
  const GUID *Guid1; // rdi
  __int64 v8; // rdx
  __int64 v9; // rdx
  __int64 v10; // rcx
  __int64 v11; // rbx
  int v13; // [rsp+64h] [rbp+1Ch]
  __int64 v14; // [rsp+68h] [rbp+20h] BYREF

  v14 = 0; /*0x20e0*/
  ImageHandle_1 = ImageHandle; /*0x20e6*/
  HobList = (_WORD *)HobLibGetHobList(ImageHandle, SystemTable); /*0x20f6*/
  for ( i = HobList == 0; ; i = HobList == 0 ) /*0x20f9*/
  {
    if ( i ) /*0x20fc*/
      return 0x800000000000000EuLL; /*0x2205*/
    NextHob = HobLibGetNextHob(11, HobList); /*0x210a*/
    HobList = NextHob; /*0x210f*/
    if ( NextHob ) /*0x2115*/
      break; /*0x2115*/
LABEL_6:
    ; /*0x2135*/
  }
  Guid1 = (const GUID *)*((_QWORD *)NextHob + 1); /*0x2117*/
  if ( !CompareGuid(Guid1, &Guid2__0) ) /*0x2125*/
  {
    HobList = (_WORD *)((char *)HobList + (unsigned __int16)HobList[1]); /*0x2132*/
    goto LABEL_6; /*0x2132*/
  }
  ReFlashGetFwVersion(Guid2_0, v8, a3); /*0x2141*/
  v13 = *(_DWORD *)(FlashDescriptor + 33); /*0x216a*/
  (*(void (__fastcall **)(const wchar_t *, void *, __int64))(RuntimeServices_0 + 88))(L"AmiFwVersion", &unk_C880, 3); /*0x2181*/
  if ( ImageHandle_1 || v13 ) /*0x218e*/
  {
    ReFlashBootFlow(v10, v9, a3); /*0x21f4*/
    return 0xA000000000000001uLL; /*0x21f9*/
  }
  else
  {
    Guid1_0 = (__int64)Guid1; /*0x21a1*/
    v11 = (*(__int64 (__fastcall **)(__int64 *, void *, __int64 (__fastcall **)(), _QWORD))(BootServices_0 + 328))( /*0x21ba*/
            &v14,
            &unk_C7B0,
            off_C978,
            0);
    if ( v11 >= 0 ) /*0x21c0*/
      (*(void (__fastcall **)(const wchar_t *, void *, __int64))(RuntimeServices_0 + 88))(L"BootFlow", &unk_C998, 2); /*0x21eb*/
    return v11; /*0x21ef*/
  }
}


// Function: ReFlashSubInit @ 0x2218 (0x37 bytes)

unsigned __int64 __fastcall ReFlashSubInit(__int64 a1, _QWORD *a2, _QWORD *a3, _QWORD *a4)
{
  __int64 GuidPtr; // rcx

  if ( !a2 || !a3 || !a4 ) /*0x2225*/
    return 0x8000000000000002uLL; /*0x2244*/
  GuidPtr = Guid1_0; /*0x2227*/
  *a2 = *(unsigned int *)(Guid1_0 + 36); /*0x2231*/
  *a3 = *(unsigned int *)(GuidPtr + 40); /*0x2237*/
  *a4 = GuidPtr + 44; /*0x223e*/
  return 0; /*0x2243*/
}


// Function: ReFlashSubDispatch @ 0x2250 (0x56 bytes)

unsigned __int64 ReFlashSubDispatch()
{
  __int64 InitStatus; // rax
  __int64 CtxPtr; // rcx
  __int64 IterStatus; // rax

  InitStatus = ReFlashInitCallback(0, 1); /*0x2258*/
  if ( InitStatus < 0 ) /*0x2260*/
    (*(void (__fastcall **)(_QWORD, __int64, _QWORD, _QWORD))(RuntimeServices_0 + 104))(0, InitStatus, 0, 0); /*0x2274*/
  IterStatus = ReFlashIterateRegions(CtxPtr, (__int64)off_C9F0); /*0x227e*/
  if ( IterStatus < 0 ) /*0x2286*/
    (*(void (__fastcall **)(_QWORD, __int64, _QWORD, _QWORD))(RuntimeServices_0 + 104))(0, IterStatus, 0, 0); /*0x229a*/
  return ReFlashBootCompleteReset(); /*0x229d*/
}


// Function: ReFlashFindGuidInLayout @ 0x22a8 (0xa3 bytes)

const GUID *__fastcall ReFlashFindGuidInLayout(GUID *Guid2)
{
  const GUID *Guid1; // rbx
  __int64 LayoutStatus; // rax
  unsigned int EntryIdx; // edi
  unsigned int EntryIdx_1; // esi

  Guid1 = Guid1; /*0x22bc*/
  if ( !Guid1 ) /*0x22c9*/
  {
    if ( Guid2_0 ) /*0x22d5*/
    {
      LayoutStatus = ReFlashReadRomLayout(Guid2_0, &Guid1); /*0x22de*/
      Guid1 = Guid1; /*0x22e3*/
    }
    else
    {
      LayoutStatus = 0x8000000000000002uLL; /*0x22ec*/
    }
    if ( LayoutStatus < 0 ) /*0x22f9*/
      return 0; /*0x22f9*/
  }
  EntryIdx = 0; /*0x2309*/
  EntryIdx_1 = (unsigned int)n40 / RegionSize; /*0x230b*/
  if ( !((unsigned int)n40 / RegionSize) ) /*0x230b*/
    return 0; /*0x232f*/
  while ( !CompareGuid(Guid1, Guid2) ) /*0x231e*/
  {
    ++EntryIdx; /*0x2326*/
    Guid1 = (const GUID *)((char *)Guid1 + (unsigned int)RegionSize); /*0x2328*/
    if ( EntryIdx >= EntryIdx_1 ) /*0x232d*/
      return 0; /*0x232d*/
  }
  return Guid1; /*0x2340*/
}


// Function: ReFlashGuidLookup @ 0x234c (0x73 bytes)

const GUID *__fastcall ReFlashGuidLookup(GUID *Guid2)
{
  const GUID *DestinationBuffer; // rbx
  unsigned int EntryIdx; // edi
  unsigned int EntryIdx_1; // esi

  DestinationBuffer = DestinationBuffer; /*0x2360*/
  if ( !DestinationBuffer ) /*0x236d*/
    return 0; /*0x236d*/
  EntryIdx = 0; /*0x237d*/
  EntryIdx_1 = n40_0 / (unsigned int)RegionSize_0; /*0x237f*/
  if ( !(n40_0 / (unsigned int)RegionSize_0) ) /*0x237f*/
    return 0; /*0x23a3*/
  while ( !CompareGuid(DestinationBuffer, Guid2) ) /*0x2392*/
  {
    ++EntryIdx; /*0x239a*/
    DestinationBuffer = (const GUID *)((char *)DestinationBuffer + (unsigned int)RegionSize_0); /*0x239c*/
    if ( EntryIdx >= EntryIdx_1 ) /*0x23a1*/
      return 0; /*0x23a1*/
  }
  return DestinationBuffer; /*0x23b4*/
}


// Function: ReFlashSubProcessor @ 0x23c0 (0x8d bytes)

__int64 __fastcall ReFlashSubProcessor(unsigned int n4)
{
  __int64 result; // rax
  __int64 DescSize; // [rsp+38h] [rbp+10h] BYREF
  void (__fastcall **ProtocolPtr)(_QWORD, __int64, __int64 *); // [rsp+40h] [rbp+18h] BYREF

  DescSize = 72; /*0x23d7*/
  *(_OWORD *)qword_D150 = xmmword_A9C0; /*0x23e4*/
  *(_QWORD *)(qword_D150 + 16) = 48; /*0x23ef*/
  *(_QWORD *)(qword_D150 + 24) = n4; /*0x23fe*/
  *(_QWORD *)(qword_D150 + 32) = 0; /*0x2410*/
  result = (*(__int64 (__fastcall **)(void *, _QWORD, _QWORD))(BootServices_0 + 320))(&unk_C6D0, 0, &ProtocolPtr); /*0x241c*/
  if ( result >= 0 ) /*0x2425*/
  {
    (*ProtocolPtr)(ProtocolPtr, qword_D150, &DescSize); /*0x243b*/
    return *(_QWORD *)(qword_D150 + 32); /*0x2444*/
  }
  return result; /*0x2448*/
}


// Function: ReFlashSetBootFlag @ 0x2450 (0x82 bytes)

const GUID *__fastcall ReFlashSetBootFlag(__int64 n2)
{
  unsigned int BootMode; // ebx
  const GUID *result; // rax
  __int64 DestPtr; // rcx

  BootMode = n2; /*0x2456*/
  result = ReFlashFindGuidInLayout(&Guid2__2); /*0x245f*/
  if ( result ) /*0x246a*/
  {
    if ( BootMode >= 2 ) /*0x246f*/
    {
      *(_QWORD *)(qword_D150 + 40) = *(_QWORD *)&result[1].Data1; /*0x2497*/
      *(_QWORD *)(qword_D150 + 56) = *(unsigned int *)&result[1].Data4[4]; /*0x24a6*/
      DestPtr = *(_QWORD *)&ReFlashFindGuidInLayout(&Guid2__3)[1].Data1; /*0x24b6*/
    }
    else
    {
      *(_QWORD *)(qword_D150 + 40) = (char *)Guid2_0 + *(unsigned int *)result[1].Data4; /*0x2483*/
      DestPtr = *(unsigned int *)&result[1].Data4[4]; /*0x2487*/
    }
    *(_QWORD *)(qword_D150 + 48) = DestPtr; /*0x24c1*/
    return (const GUID *)ReFlashSubProcessor(BootMode); /*0x24c7*/
  }
  return result; /*0x24cc*/
}


// Function: ReFlashCheckBootRegion @ 0x24d4 (0xa8 bytes)

char ReFlashCheckBootRegion()
{
  const GUID *GuidEntry1; // rbp
  const GUID *GuidEntry2; // rsi
  const GUID *RomEntry1; // rdi
  const GUID *RomEntry2; // rax
  char NeedsUpdate; // bl

  GuidEntry1 = ReFlashGuidLookup(&Guid2__2); /*0x24fb*/
  GuidEntry2 = ReFlashGuidLookup(&Guid2__3); /*0x250a*/
  RomEntry1 = ReFlashFindGuidInLayout(&Guid2__2); /*0x2519*/
  RomEntry2 = ReFlashFindGuidInLayout(&Guid2__3); /*0x251c*/
  NeedsUpdate = 0; /*0x2521*/
  if ( GuidEntry1 /*0x253f*/
    && GuidEntry2
    && *(_QWORD *)&GuidEntry1[1].Data1 == *(_QWORD *)&RomEntry1[1].Data1
    && *(_QWORD *)&GuidEntry2[1].Data1 == *(_QWORD *)&RomEntry2[1].Data1 )
  {
    RomEntry1[2].Data1 = 1; /*0x2546*/
    *(_DWORD *)&RomEntry1[2].Data2 &= ~0x200u; /*0x254d*/
    *(_DWORD *)&RomEntry2[2].Data2 &= ~0x200u; /*0x2550*/
    RomEntry2[2].Data1 = 1; /*0x2553*/
  }
  else
  {
    NeedsUpdate = 1; /*0x255e*/
    ReFlashSetBootFlag(0); /*0x2560*/
  }
  return NeedsUpdate; /*0x2576*/
}


// Function: ReFlashCheckFlashState @ 0x257c (0xd2 bytes)

bool __fastcall ReFlashCheckFlashState(_DWORD *a1, EFI_SYSTEM_TABLE *SystemTable)
{
  INTN v3; // rax
  bool result; // al
  void *SourceBuffer; // [rsp+30h] [rbp+8h] BYREF

  if ( *(_DWORD *)(ReFlashFindFlashDescriptor((__int64)&ImageHandle_, SystemTable) + 36) ) /*0x2591*/
  {
    LODWORD(v3) = 1; /*0x2597*/
  }
  else
  {
    if ( DestinationBuffer_0 ) /*0x25ab*/
    {
      DestinationBuffer = (GUID *)DestinationBuffer_0; /*0x25ad*/
      RegionSize_0 = EntrySize; /*0x25ba*/
      n40_0 = n40_1; /*0x25c6*/
    }
    if ( Guid2_0 ) /*0x25d6*/
      ReFlashReadRomLayout((_DWORD *)Guid2_0, &SourceBuffer); /*0x25dd*/
    Guid1 = (GUID *)AllocatePool((unsigned int)n40); /*0x25fc*/
    CopyMem(Guid1, SourceBuffer, (unsigned int)n40); /*0x2603*/
    if ( n40_0 != (_DWORD)n40 || (v3 = CompareMem(DestinationBuffer, Guid1, (unsigned int)n40)) != 0 ) /*0x262f*/
      LODWORD(v3) = 2; /*0x2631*/
  }
  if ( a1 ) /*0x2639*/
    *a1 = v3; /*0x263b*/
  result = (_DWORD)v3 == 0; /*0x263f*/
  byte_D1F0 = result; /*0x2642*/
  return result; /*0x2648*/
}


// Function: ReFlashParseFlashRegions @ 0x2650 (0x1ec bytes)

char *__fastcall ReFlashParseFlashRegions(char IsSecondary)
{
  char IsSecondary_1; // r13
  GUID *DestinationBuffer; // rsi
  _QWORD *RegionTable; // r14
  unsigned int RegionSize; // edi
  unsigned int n40; // eax
  unsigned int RegionCount; // eax
  __int64 RegionCount_1; // r12
  unsigned int RegionCount_2; // ebx
  char *result; // rax
  unsigned __int8 *Data4; // rbp
  __int64 ListIdx; // r15
  char *EntryPtr; // rcx
  unsigned int SubRegCount; // esi
  __int64 FfsPtr; // rbx
  unsigned __int16 ExtHdrLen; // dx
  unsigned int SectionOffset; // ecx
  unsigned int SectionOffset_1; // edi
  unsigned __int64 SectionOffset_2; // r13
  int SectionLen; // edx
  _QWORD *Pool; // rdx
  __int64 CompressInfo; // rax
  int SectionType; // ecx
  __int64 CurrentPtr; // [rsp+68h] [rbp+10h]
  __int64 RegionSize_1; // [rsp+70h] [rbp+18h]

  IsSecondary_1 = IsSecondary; /*0x266a*/
  if ( IsSecondary ) /*0x266f*/
  {
    DestinationBuffer = DestinationBuffer; /*0x2671*/
    RegionTable = &unk_DA30; /*0x2678*/
    RegionSize = RegionSize_0; /*0x267f*/
    n40 = n40_0; /*0x2685*/
  }
  else
  {
    DestinationBuffer = Guid1; /*0x268d*/
    RegionTable = &unk_DA10; /*0x2694*/
    RegionSize = RegionSize; /*0x269b*/
    n40 = n40; /*0x26a1*/
  }
  RegionCount = n40 / RegionSize; /*0x26a7*/
  RegionCount_1 = RegionCount; /*0x26a9*/
  RegionCount_2 = RegionCount; /*0x26ac*/
  *(_DWORD *)RegionTable = RegionCount; /*0x26ae*/
  result = (char *)AllocatePool(24LL * RegionCount); /*0x26b9*/
  RegionTable[1] = result; /*0x26c1*/
  if ( RegionCount_2 )
  {
    Data4 = DestinationBuffer[1].Data4; /*0x26cf*/
    RegionSize_1 = RegionSize; /*0x26d3*/
    ListIdx = 0; /*0x26d8*/
    do
    {
      if ( IsSecondary_1 ) /*0x26de*/
        EntryPtr = (char *)*((_QWORD *)Data4 - 1); /*0x26e0*/
      else
        EntryPtr = (char *)Guid2_0 + *(unsigned int *)Data4; /*0x26e9*/
      SubRegCount = 0; /*0x26f4*/
      *(_QWORD *)(ListIdx + RegionTable[1]) = EntryPtr; /*0x26f7*/
      CurrentPtr = RegionTable[1]; /*0x26ff*/
      FfsPtr = *(_QWORD *)(ListIdx + CurrentPtr); /*0x2704*/
      if ( *(_DWORD *)(FfsPtr + 40) == 1213613663 )
      {
        ExtHdrLen = *(_WORD *)(FfsPtr + 52); /*0x2715*/
        SectionOffset = *(unsigned __int16 *)(FfsPtr + 48); /*0x2719*/
        if ( ExtHdrLen ) /*0x2720*/
          SectionOffset = *(_DWORD *)(ExtHdrLen + FfsPtr + 16) + ExtHdrLen; /*0x2728*/
        if ( (SectionOffset & 7) != 0 ) /*0x2731*/
          SectionOffset += 8 - (SectionOffset & 7); /*0x273a*/
        SectionOffset_1 = SectionOffset; /*0x273c*/
        SectionOffset_2 = SectionOffset; /*0x273e*/
        while ( (unsigned __int64)SectionOffset < *(_QWORD *)(FfsPtr + 32) /*0x2758*/
             && (*(_QWORD *)(SectionOffset + FfsPtr) != -1
              || *(_QWORD *)(SectionOffset + FfsPtr + 8) != -1
              || *(_QWORD *)(SectionOffset + FfsPtr + 16) != -1) )
        {
          ++SubRegCount; /*0x275a*/
          if ( (*(_BYTE *)(SectionOffset + FfsPtr + 19) & 1) != 0 ) /*0x2761*/
            SectionLen = *(_DWORD *)(SectionOffset + FfsPtr + 24); /*0x2763*/
          else
            SectionLen = *(_DWORD *)(SectionOffset + FfsPtr + 20) & 0xFFFFFF; /*0x276d*/
          SectionOffset += SectionLen; /*0x2773*/
          if ( (SectionOffset & 7) != 0 ) /*0x277a*/
            SectionOffset += 8 - (SectionOffset & 7); /*0x2783*/
        }
        Pool = AllocatePool(8LL * SubRegCount); /*0x279b*/
        if ( Pool )
        {
          *(_QWORD *)(ListIdx + CurrentPtr + 16) = Pool; /*0x27ad*/
          if ( SectionOffset_2 < *(_QWORD *)(FfsPtr + 32) )
          {
            do
            {
              CompressInfo = FfsPtr + SectionOffset_1; /*0x27ba*/
              if ( *(_QWORD *)CompressInfo == -1 /*0x27cf*/
                && *(_QWORD *)(CompressInfo + 8) == -1
                && *(_QWORD *)(CompressInfo + 16) == -1 )
              {
                break; /*0x27cf*/
              }
              *Pool++ = CompressInfo; /*0x27d1*/
              SectionType = (*(_BYTE *)(CompressInfo + 19) & 1) != 0
                          ? *(_DWORD *)(CompressInfo + 24)
                          : *(_DWORD *)(CompressInfo + 20) & 0xFFFFFF;
              SectionOffset_1 += SectionType; /*0x27ec*/
              if ( (SectionOffset_1 & 7) != 0 ) /*0x27f3*/
                SectionOffset_1 += 8 - (SectionOffset_1 & 7); /*0x27fc*/
            }
            while ( (unsigned __int64)SectionOffset_1 < *(_QWORD *)(FfsPtr + 32) );
          }
        }
        else
        {
          SubRegCount = 0; /*0x27a3*/
        }
        IsSecondary_1 = IsSecondary; /*0x2806*/
      }
      result = (char *)RegionTable[1]; /*0x280b*/
      Data4 += RegionSize_1; /*0x280f*/
      *(_DWORD *)&result[ListIdx + 8] = SubRegCount; /*0x2814*/
      ListIdx += 24; /*0x2819*/
      --RegionCount_1; /*0x281d*/
    }
    while ( RegionCount_1 );
  }
  return result; /*0x282c*/
}


// Function: ReFlashFindGuidInTable @ 0x283c (0xc1 bytes)

const GUID *__fastcall ReFlashFindGuidInTable(GUID *Guid1, char a2)
{
  _QWORD *TablePtr; // rbx
  __int64 EntryIdx; // rdi
  __int64 TableEntry; // rax
  unsigned int GuidCount; // esi
  const GUID **p_Guid2; // r14
  const GUID *Guid2; // rbp

  if ( byte_C9C8 ) /*0x2866*/
  {
    ReFlashParseFlashRegions(1); /*0x286a*/
    ReFlashParseFlashRegions(0); /*0x2871*/
    byte_C9C8 = 0; /*0x2876*/
  }
  TablePtr = &unk_DA10; /*0x2887*/
  if ( a2 ) /*0x288e*/
    TablePtr = &unk_DA30; /*0x288e*/
  EntryIdx = 0; /*0x2892*/
  if ( !*(_DWORD *)TablePtr ) /*0x2894*/
    return 0; /*0x28d7*/
  while ( 1 ) /*0x2898*/
  {
    TableEntry = TablePtr[1]; /*0x2898*/
    GuidCount = 0; /*0x28a0*/
    p_Guid2 = *(const GUID ***)(TableEntry + 24 * EntryIdx + 16); /*0x28a2*/
    if ( *(_DWORD *)(TableEntry + 24 * EntryIdx + 8) ) /*0x28a7*/
      break; /*0x28a7*/
LABEL_9:
    EntryIdx = (unsigned int)(EntryIdx + 1); /*0x28d1*/
    if ( (unsigned int)EntryIdx >= *(_DWORD *)TablePtr ) /*0x28d5*/
      return 0; /*0x28d5*/
  }
  while ( 1 ) /*0x28ae*/
  {
    Guid2 = *p_Guid2; /*0x28ae*/
    if ( CompareGuid(Guid1, *p_Guid2) ) /*0x28b7*/
      return Guid2; /*0x28ed*/
    ++GuidCount; /*0x28c4*/
    ++p_Guid2; /*0x28c6*/
    if ( GuidCount >= *(_DWORD *)(TablePtr[1] + 24 * EntryIdx + 8) ) /*0x28cf*/
      goto LABEL_9; /*0x28cf*/
  }
}


// Function: ReFlashCopyGuidData @ 0x2900 (0xe1 bytes)

unsigned __int64 ReFlashCopyGuidData()
{
  unsigned __int64 i; // rax
  unsigned int RegionIdx; // edi
  const GUID *GuidEntry; // rsi
  __int64 FfsHeaderSize; // rdx
  unsigned int Length; // ecx
  const void *SourceBuffer; // r9
  __int64 FfsHdrSize; // rdx

  i = (unsigned int)i_1; /*0x290f*/
  if ( i_1 ) /*0x2917*/
  {
    if ( byte_D1F0 ) /*0x2924*/
    {
      for ( RegionIdx = 0; RegionIdx < i_1; ++RegionIdx ) /*0x292e*/
      {
        GuidEntry = ReFlashFindGuidInTable((GUID *)&unk_D170 + RegionIdx, 0); /*0x2953*/
        i = (unsigned __int64)ReFlashFindGuidInTable((GUID *)&unk_D170 + RegionIdx, 1); /*0x2956*/
        if ( i && GuidEntry ) /*0x2963*/
        {
          if ( (*(_BYTE *)(i + 19) & 1) != 0 ) /*0x2969*/
          {
            FfsHeaderSize = 32; /*0x296e*/
            Length = *(_DWORD *)(i + 24) - 32; /*0x2973*/
          }
          else
          {
            FfsHeaderSize = 24; /*0x297b*/
            Length = (*(_DWORD *)(i + 20) & 0xFFFFFF) - 24; /*0x2986*/
          }
          SourceBuffer = (const void *)(FfsHeaderSize + i); /*0x298d*/
          if ( (GuidEntry[1].Data1 & 0x1000000) != 0 ) /*0x2991*/
          {
            FfsHdrSize = 32; /*0x2996*/
            i = (unsigned int)(*(_DWORD *)GuidEntry[1].Data4 - 32); /*0x299b*/
          }
          else
          {
            FfsHdrSize = 24; /*0x29a3*/
            i = (*(_DWORD *)&GuidEntry[1].Data2 & 0xFFFFFFu) - 24; /*0x29ad*/
          }
          if ( Length <= (unsigned int)i ) /*0x29b2*/
            i = (unsigned __int64)CopyMem((char *)GuidEntry + FfsHdrSize, SourceBuffer, Length); /*0x29be*/
        }
      }
    }
  }
  return i; /*0x29db*/
}


// Function: ReFlashShowProgress @ 0x29e8 (0x12a bytes)

__int64 __fastcall ReFlashShowProgress(__int64 a1, unsigned __int64 n3)
{
  __int64 ProgressProto; // rax
  __int64 ProgressStatus; // rax
  __int64 Remaining; // rdi

  DebugPrint(0xFFFFFFFFFFFFFFFFuLL, "AmiShowProgress: %d% \n", n3);
  ProgressProto = ::ProgressProto; /*0x2a0d*/
  if ( !::ProgressProto ) /*0x2a17*/
  {
    ProgressStatus = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))( /*0x2a30*/
                       &unk_C830,
                       0,
                       &::ProgressProto);
    if ( ProgressStatus < 0 ) /*0x2a39*/
      return ProgressStatus; /*0x2a39*/
    ProgressProto = ::ProgressProto; /*0x2a3f*/
  }
  ProgressStatus = (*(__int64 (**)(void))(ProgressProto + 80))(); /*0x2a46*/
  if ( (int)ProgressStatus <= 3 ) /*0x2a4c*/
  {
    if ( !n3 ) /*0x2a55*/
    {
      (*(void (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C7F0, 0, &qword_DA50); /*0x2a72*/
      if ( qword_DA50 ) /*0x2a82*/
        (*(void (__fastcall **)(unsigned __int64, __int64, unsigned __int64))(::ProgressProto + 64))( /*0x2ad9*/
          *(unsigned int *)(*(_QWORD *)(*(_QWORD *)(qword_DA50 + 24) + 8LL) + 4LL) / 5uLL,
          *(unsigned int *)(*(_QWORD *)(*(_QWORD *)(qword_DA50 + 24) + 8LL) + 8LL) - 10LL,
          3 * (unsigned __int64)*(unsigned int *)(*(_QWORD *)(*(_QWORD *)(qword_DA50 + 24) + 8LL) + 4LL) / 5);
    }
    ProgressStatus = n3_0; /*0x2adc*/
    if ( n3_0 < n3 ) /*0x2ae6*/
    {
      Remaining = n3 - n3_0; /*0x2ae8*/
      do /*0x2b00*/
      {
        ProgressStatus = (*(__int64 (**)(void))(::ProgressProto + 72))(); /*0x2af2*/
        ++n3_0; /*0x2af5*/
        --Remaining; /*0x2afc*/
      }
      while ( Remaining ); /*0x2b00*/
    }
  }
  return ProgressStatus; /*0x2b0c*/
}


// Function: ReFlashSubCleanup @ 0x2b14 (0x70 bytes)

__int64 __fastcall ReFlashSubCleanup(__int64 a1)
{
  __int64 BdsProto; // r10
  __int64 result; // rax
  char *CallData; // rcx
  char LocalFlag; // [rsp+58h] [rbp+10h] BYREF

  BdsProto = ::BdsProto; /*0x2b1a*/
  if ( ::BdsProto /*0x2b50*/
    || (result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(
                   &unk_CA10,
                   0,
                   &::BdsProto),
        (BdsProto = ::BdsProto) != 0) )
  {
    CallData = &LocalFlag; /*0x2b52*/
    LOBYTE(CallData) = 1; /*0x2b78*/
    return (*(__int64 (__fastcall **)(char *, const wchar_t *, _QWORD, _QWORD, _QWORD, __int64, char *))(BdsProto + 120))( /*0x2b7a*/
             CallData,
             L"Flash Update",
             0,
             0,
             0,
             a1 + 24,
             &LocalFlag);
  }
  return result; /*0x2b7e*/
}


// Function: ReFlashSubTeardown @ 0x2b84 (0x43 bytes)

__int64 __fastcall ReFlashSubTeardown(__int64 a1, __int64 a2)
{
  __int64 DataOffset; // rax
  __int64 *ResultPtr; // rcx
  __int64 result; // rax
  __int64 LocalResult; // [rsp+60h] [rbp+18h] BYREF

  if ( BdsProto ) /*0x2b95*/
  {
    DataOffset = a1 + 24; /*0x2b97*/
    ResultPtr = &LocalResult; /*0x2b9e*/
    LOBYTE(ResultPtr) = 2; /*0x2bb1*/
    return (*(__int64 (__fastcall **)(__int64 *, const wchar_t *, const wchar_t *, _QWORD, __int64, __int64, __int64 *))(BdsProto + 120))( /*0x2bbe*/
             ResultPtr,
             L"Flash Update",
             L"Updating main firmware",
             0,
             a2,
             DataOffset,
             &LocalResult);
  }
  return result; /*0x2bc2*/
}


// Function: ReFlashUpdateProgress @ 0x2bc8 (0x40 bytes)

__int64 __fastcall ReFlashUpdateProgress(__int64 a1)
{
  __int64 v1; // rax
  __int64 *v2; // rcx
  __int64 result; // rax
  __int64 v4; // [rsp+58h] [rbp+10h] BYREF

  if ( BdsProto ) /*0x2bd9*/
  {
    v1 = a1 + 24; /*0x2bdb*/
    v2 = &v4; /*0x2be2*/
    LOBYTE(v2) = 3; /*0x2bf8*/
    return (*(__int64 (__fastcall **)(__int64 *, const wchar_t *, _QWORD, _QWORD, _QWORD, __int64, __int64 *))(BdsProto + 120))( /*0x2bff*/
             v2,
             L"Flash Update",
             0,
             0,
             0,
             v1,
             &v4);
  }
  return result; /*0x2c03*/
}


// Function: DriverEntryPoint @ 0x2c08 (0x273 bytes)

__int64 DriverEntryPoint()
{
  __int64 result; // rax
  unsigned __int8 v1; // [rsp+20h] [rbp-158h]
  unsigned int v2; // [rsp+24h] [rbp-154h]
  int v3; // [rsp+30h] [rbp-148h] BYREF
  __int16 n8853; // [rsp+34h] [rbp-144h]
  __int16 n16686; // [rsp+36h] [rbp-142h]
  char v6; // [rsp+38h] [rbp-140h]
  char n109; // [rsp+39h] [rbp-13Fh]
  char v8; // [rsp+3Ah] [rbp-13Eh]
  char v9; // [rsp+3Bh] [rbp-13Dh]
  char v10; // [rsp+3Ch] [rbp-13Ch]
  char n32; // [rsp+3Dh] [rbp-13Bh]
  char v12; // [rsp+3Eh] [rbp-13Ah]
  char n49; // [rsp+3Fh] [rbp-139h]
  int v14; // [rsp+40h] [rbp-138h] BYREF
  __int16 n22215; // [rsp+44h] [rbp-134h]
  __int16 n19164; // [rsp+46h] [rbp-132h]
  char v17; // [rsp+48h] [rbp-130h]
  char v18; // [rsp+49h] [rbp-12Fh]
  char n28; // [rsp+4Ah] [rbp-12Eh]
  char n44; // [rsp+4Bh] [rbp-12Dh]
  char v21; // [rsp+4Ch] [rbp-12Ch]
  char n114; // [rsp+4Dh] [rbp-12Bh]
  char v23; // [rsp+4Eh] [rbp-12Ah]
  char v24; // [rsp+4Fh] [rbp-129h]
  _WORD *v25; // [rsp+50h] [rbp-128h] BYREF
  _QWORD v26[2]; // [rsp+58h] [rbp-120h] BYREF
  _BYTE v27[8]; // [rsp+68h] [rbp-110h] BYREF
  char dst[128]; // [rsp+70h] [rbp-108h] BYREF
  char dst_1[136]; // [rsp+F0h] [rbp-88h] BYREF

  v26[0] = 0; /*0x2c11*/
  memset(dst, 0, 120); /*0x2c1a*/
  v3 = -624702568; /*0x2c30*/
  n8853 = 8853; /*0x2c3d*/
  n16686 = 16686; /*0x2c47*/
  v6 = -126; /*0x2c4c*/
  n109 = 109; /*0x2c51*/
  v8 = -3; /*0x2c56*/
  v9 = -18; /*0x2c5b*/
  v10 = -93; /*0x2c60*/
  n32 = 32; /*0x2c65*/
  v12 = -49; /*0x2c6a*/
  n49 = 49; /*0x2c6f*/
  v14 = -1970163231; /*0x2c74*/
  n22215 = 22215; /*0x2c81*/
  n19164 = 19164; /*0x2c8b*/
  v17 = -85; /*0x2c90*/
  v18 = -21; /*0x2c95*/
  n28 = 28; /*0x2c9a*/
  n44 = 44; /*0x2c9f*/
  v21 = -95; /*0x2ca4*/
  n114 = 114; /*0x2ca9*/
  v23 = -98; /*0x2cae*/
  v24 = -1; /*0x2cb3*/
  v25 = (_WORD *)DriverEntryPoint_0(SystemTable, &ImageHandle__2); /*0x2ccb*/
  if ( v25 && DevicePathFindAcpiNode(&v3, &v25) >= 0 ) /*0x2cea*/
    ReFlashScanFlashSignature(dst, *((_QWORD *)v25 + 3)); /*0x2cfa*/
  ReFlashReadFlashLayoutFromBlockIo(dst_1); /*0x2d07*/
  v2 = 10 * (dst_1[41] - 48) + dst_1[42] - 48; /*0x2d73*/
  result = v2; /*0x2de2*/
  if ( 10 * (dst[41] - 48) + dst[42] - 48 < v2 )
  {
    v1 = ReFlashExecuteUpdate(); /*0x2df5*/
    result = v1; /*0x2df9*/
    if ( v1 == 1 )
    {
      result = (*(__int64 (__fastcall **)(int *, _QWORD, _QWORD *))(BootServices + 320))(&v14, 0, v26); /*0x2e16*/
      v26[1] = result; /*0x2e1c*/
      if ( result >= 0 )
      {
        if ( v26[0] )
        {
          (*(void (__fastcall **)(const wchar_t *, const wchar_t *, __int64, _BYTE *, unsigned __int8))(v26[0] + 88LL))(
            L"TPM CLEAR",
            L"Caution: A Reset is required to Clear the TPM for Flash Update. Enable Recovery after reset",
            20,
            v27,
            v1);
          Assert_49(1000000); /*0x2e59*/
        }
        return (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, _QWORD))(RuntimeServices + 104))(0, 0, 0, 0); /*0x2e6f*/
      }
    }
  }
  return result; /*0x2e72*/
}


// Function: DebugLibIsDebugEnabled @ 0x2e7c (0x7f bytes)

__int64 DebugLibIsDebugEnabled()
{
  __int64 result; // rax
  unsigned __int64 n0x10; // rbx
  __int64 v2; // rax
  __int64 v3; // rcx

  result = qword_D228; /*0x2e86*/
  if ( !qword_D228 ) /*0x2e92*/
  {
    n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices_0 + 24))(31); /*0x2eab*/
    (*(void (__fastcall **)(unsigned __int64))(BootServices_0 + 32))(n0x10); /*0x2eae*/
    if ( n0x10 <= 0x10 ) /*0x2eb5*/
    {
      v2 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C6C0, 0, &qword_D228); /*0x2ed2*/
      v3 = qword_D228; /*0x2ed8*/
      if ( v2 < 0 ) /*0x2ee2*/
        v3 = 0; /*0x2ee2*/
      qword_D228 = v3; /*0x2ee6*/
      return v3; /*0x2eed*/
    }
    else
    {
      return 0; /*0x2eb7*/
    }
  }
  return result; /*0x2ef5*/
}


// Function: DebugPrint @ 0x2efc (0x47 bytes)

void DebugPrint(UINTN ErrorLevel, const CHAR8 *Format, ...)
{
  void (__fastcall **v3)(UINTN, const CHAR8 *, __int64 *); // r10
  va_list va; // [rsp+40h] [rbp+18h] BYREF

  va_start(va, Format);
  if ( DebugLibIsDebugEnabled() ) /*0x2f13*/
  {
    if ( ((unsigned int)DebugLibGetDebugMask() & (unsigned int)ErrorLevel) != 0 ) /*0x2f2b*/
      (*v3)(ErrorLevel, Format, (__int64 *)va); /*0x2f3a*/
  }
}


// Function: DebugAssert @ 0x2f44 (0x3e bytes)

void __cdecl DebugAssert(const CHAR8 *FileName, UINTN LineNumber, const CHAR8 *Description)
{
  __int64 IsDebugEnabled; // rax

  IsDebugEnabled = DebugLibIsDebugEnabled(); /*0x2f5c*/
  if ( IsDebugEnabled ) /*0x2f64*/
    (*(void (__fastcall **)(const CHAR8 *, UINTN, const CHAR8 *))(IsDebugEnabled + 8))( /*0x2f6f*/
      FileName,
      LineNumber,
      Description);
}


// Function: Assert_46 @ 0x2f84 (0x46 bytes)

char *__fastcall Assert_46(char *ZeroPool, __int64 a2)
{
  __int64 v4; // rax
  __int64 v5; // rax

  v4 = Assert_34(a2); /*0x2f97*/
  Assert_26(ZeroPool, v4); /*0x2fa2*/
  v5 = Assert_34(a2 + 8); /*0x2fab*/
  Assert_26((_QWORD *)ZeroPool + 1, v5); /*0x2fb7*/
  return ZeroPool; /*0x2fc4*/
}


// Function: CompareGuid @ 0x2fcc (0x67 bytes)

BOOLEAN __cdecl CompareGuid(const GUID *Guid1, const GUID *Guid2)
{
  __int128 v4; // rdi
  __int64 v5; // rbx

  *((_QWORD *)&v4 + 1) = Assert_34((__int64)Guid1); /*0x2fee*/
  v5 = Assert_34((__int64)Guid2); /*0x2ffa*/
  *(_QWORD *)&v4 = Assert_34((__int64)Guid1->Data4); /*0x3006*/
  return v4 == __PAIR128__(v5, Assert_34((__int64)Guid2->Data4)); /*0x302d*/
}


// Function: CopyMem @ 0x3034 (0x99 bytes)

void *__cdecl CopyMem(void *DestinationBuffer, const void *SourceBuffer, UINTN Length)
{
  void *DestinationBuffer_1; // rax
  unsigned __int64 v7; // rbp

  DestinationBuffer_1 = DestinationBuffer; /*0x3051*/
  if ( Length ) /*0x3057*/
  {
    v7 = Length - 1; /*0x3059*/
    if ( Length - 1 > ~(unsigned __int64)DestinationBuffer ) /*0x3063*/
      DebugAssert( /*0x3078*/
        "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
        0x38u,
        "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
    if ( v7 > ~(unsigned __int64)SourceBuffer ) /*0x3086*/
      DebugAssert( /*0x309b*/
        "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
        0x39u,
        "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
    if ( DestinationBuffer == SourceBuffer ) /*0x30a3*/
      return DestinationBuffer; /*0x30a5*/
    else
      return InternalCopyMem((char *)DestinationBuffer, (char *)SourceBuffer, Length); /*0x30b3*/
  }
  return DestinationBuffer_1; /*0x30c7*/
}


// Function: ZeroMem @ 0x30d0 (0x55 bytes)

void *__fastcall ZeroMem(unsigned __int64 buf, unsigned __int64 count)
{
  void *buf_1; // rax

  buf_1 = (void *)buf; /*0x30e0*/
  if ( count ) /*0x30e6*/
  {
    if ( count - 1 > ~buf ) /*0x30f2*/
      DebugAssert( /*0x3107*/
        "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMemWrapper.c",
        0x36u,
        "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)");
    return InternalSetMem((void *)buf, count, 0); /*0x3115*/
  }
  return buf_1; /*0x311f*/
}


// Function: CompareMem @ 0x3128 (0xd6 bytes)

INTN __cdecl CompareMem(const void *DestinationBuffer, const void *SourceBuffer, UINTN Length)
{
  if ( !Length || DestinationBuffer == SourceBuffer ) /*0x3151*/
    return 0; /*0x31e7*/
  if ( !DestinationBuffer ) /*0x315a*/
    DebugAssert( /*0x316d*/
      "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      0x3Cu,
      "DestinationBuffer != ((void *) 0)");
  if ( !SourceBuffer ) /*0x3175*/
    DebugAssert( /*0x3188*/
      "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      0x3Du,
      "SourceBuffer != ((void *) 0)");
  if ( Length - 1 > ~(unsigned __int64)DestinationBuffer ) /*0x319a*/
    DebugAssert( /*0x31af*/
      "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      0x3Eu,
      "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
  if ( Length - 1 > ~(unsigned __int64)SourceBuffer ) /*0x31bd*/
    DebugAssert( /*0x31d2*/
      "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      0x3Fu,
      "(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
  return InternalCompareMem((char *)DestinationBuffer, (char *)SourceBuffer, Length); /*0x31f8*/
}


// Function: StrLen @ 0x3200 (0x93 bytes)

UINTN __cdecl StrLen(const CHAR16 *String)
{
  const CHAR16 *v1; // rbx
  UINTN n0xF4240; // rdi

  v1 = String; /*0x3211*/
  if ( !String ) /*0x3217*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0xACu, "String != ((void *) 0)"); /*0x322c*/
  if ( ((unsigned __int8)v1 & 1) != 0 ) /*0x3234*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0xADu, "((UINTN) String & 0x00000001) == 0"); /*0x3249*/
  n0xF4240 = 0; /*0x324e*/
  while ( *v1 ) /*0x327e*/
  {
    if ( n0xF4240 >= 0xF4240 ) /*0x325a*/
      DebugAssert( /*0x326f*/
        "e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
        0xB5u,
        "Length < _gPcd_FixedAtBuild_PcdMaximumUnicodeStringLength");
    ++v1; /*0x3274*/
    ++n0xF4240; /*0x3278*/
  }
  return n0xF4240; /*0x328d*/
}


// Function: StrCpyS @ 0x3294 (0x11c bytes)

RETURN_STATUS __cdecl StrCpyS(CHAR16 *Destination, UINTN DestMax, const CHAR16 *Source)
{
  CHAR16 *v5; // rbx
  CHAR16 v6; // ax
  UINTN v7; // rdi

  v5 = &Destination[StrLen(Destination)]; /*0x32c2*/
  if ( !v5 ) /*0x32c9*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x38u, "Destination != ((void *) 0)"); /*0x32d8*/
  if ( ((unsigned __int8)v5 & 1) != 0 ) /*0x32e0*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x39u, "((UINTN) Destination & 0x00000001) == 0"); /*0x32f1*/
  if ( (__int64)((__int64)v5 - DestMax) >> 1 <= StrLen((const CHAR16 *)DestMax) ) /*0x330a*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x3Eu, "(UINTN)(Destination - Source) > StrLen (Source)"); /*0x331b*/
  if ( (__int64)(DestMax - (_QWORD)v5) >> 1 <= StrLen((const CHAR16 *)DestMax) ) /*0x3334*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x3Fu, "(UINTN)(Source - Destination) > StrLen (Source)"); /*0x3345*/
  v6 = *(_WORD *)DestMax; /*0x334a*/
  if ( *(_WORD *)DestMax ) /*0x334a*/
  {
    v7 = DestMax - (_QWORD)v5; /*0x3352*/
    do /*0x3363*/
    {
      *v5++ = v6; /*0x3355*/
      v6 = *(CHAR16 *)((char *)v5 + v7); /*0x335c*/
    }
    while ( v6 ); /*0x3363*/
  }
  *v5 = 0; /*0x3368*/
  if ( 2 * StrLen(Destination) == -2 ) /*0x337c*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x17Au, "StrSize (Destination) != 0"); /*0x338d*/
  return (RETURN_STATUS)Destination; /*0x33a9*/
}


// Function: Assert_10 @ 0x33b0 (0xcc bytes)

CHAR16 *__fastcall Assert_10(__int64 a1, const CHAR16 *Pool)
{
  CHAR16 *String; // rbx
  const CHAR16 *Pool_1; // rcx
  CHAR16 *v6; // rdx
  CHAR16 v7; // ax

  String = String; /*0x33bf*/
  if ( 2 * StrLen(String) == -2 ) /*0x33de*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x1E5u, "StrSize (String) != 0"); /*0x33f3*/
  if ( 2 * StrLen(Pool) == -2 ) /*0x340b*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x1E6u, "StrSize (SearchString) != 0"); /*0x3420*/
  if ( !*Pool ) /*0x3425*/
    return String; /*0x342a*/
  while ( 1 ) /*0x345d*/
  {
    v7 = *String; /*0x345d*/
    if ( !*String ) /*0x345d*/
      return 0; /*0x3465*/
    Pool_1 = Pool; /*0x342f*/
    v6 = String; /*0x3432*/
    if ( v7 == *Pool ) /*0x3438*/
    {
      do /*0x344d*/
      {
        if ( !v7 ) /*0x343d*/
          break; /*0x343d*/
        ++String; /*0x343f*/
        ++Pool_1; /*0x3443*/
        v7 = *String; /*0x3447*/
      }
      while ( *String == *Pool_1 ); /*0x344d*/
    }
    if ( !*Pool_1 ) /*0x344f*/
      break; /*0x344f*/
    if ( !*String ) /*0x3457*/
      return 0; /*0x3457*/
    String = v6 + 1; /*0x3459*/
  }
  return v6; /*0x3471*/
}


// Function: Assert_21 @ 0x347c (0x6b bytes)

unsigned __int64 __fastcall Assert_21(_BYTE *x_UEFI)
{
  _BYTE *x_UEFI_1; // rbx
  unsigned __int64 i; // rdi

  x_UEFI_1 = x_UEFI; /*0x3486*/
  if ( !x_UEFI ) /*0x348c*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x43Au, "String != ((void *) 0)"); /*0x34a1*/
  for ( i = 0; *x_UEFI_1; ++i ) /*0x34a8*/
  {
    if ( i >= 0xF4240 ) /*0x34b4*/
      DebugAssert( /*0x34c9*/
        "e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
        0x442u,
        "Length < _gPcd_FixedAtBuild_PcdMaximumAsciiStringLength");
    ++x_UEFI_1; /*0x34ce*/
  }
  return i; /*0x34e1*/
}


// Function: Assert_8 @ 0x34e8 (0xcd bytes)

__int64 __fastcall Assert_8(_BYTE *x_UEFI, __int64 a2, unsigned __int64 n0xF4240)
{
  _BYTE *x_UEFI_1; // rsi
  unsigned __int64 n0xF4240_1; // rdi
  _BYTE *x_UEFI_2; // rbx

  x_UEFI_1 = "x-UEFI"; /*0x34f7*/
  n0xF4240_1 = n0xF4240; /*0x34fe*/
  x_UEFI_2 = x_UEFI; /*0x3501*/
  if ( !n0xF4240 ) /*0x3507*/
    return 0; /*0x3509*/
  if ( Assert_21(x_UEFI) == -1 ) /*0x3519*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x528u, "AsciiStrSize (FirstString)"); /*0x352e*/
  if ( Assert_21("x-UEFI") == -1 ) /*0x353f*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\String.c", 0x529u, "AsciiStrSize (SecondString)"); /*0x3554*/
  if ( n0xF4240_1 > 0xF4240 ) /*0x3560*/
    DebugAssert( /*0x3575*/
      "e:\\hs\\MdePkg\\Library\\BaseLib\\String.c",
      0x52Cu,
      "Length <= _gPcd_FixedAtBuild_PcdMaximumAsciiStringLength");
  while ( *x_UEFI_2 && *x_UEFI_1 && *x_UEFI_2 == *x_UEFI_1 && n0xF4240_1 > 1 ) /*0x3589*/
  {
    ++x_UEFI_2; /*0x358b*/
    ++x_UEFI_1; /*0x358e*/
    --n0xF4240_1; /*0x3591*/
  }
  return (char)*x_UEFI_2 - (char)*x_UEFI_1; /*0x35af*/
}


// Function: Assert_37 @ 0x35b8 (0x2d bytes)

__int64 __fastcall Assert_37(unsigned __int16 *a1)
{
  if ( !a1 ) /*0x35c4*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0x26u, "Buffer != ((void *) 0)"); /*0x35d7*/
  return *a1; /*0x35df*/
}


// Function: Assert_28 @ 0x35e8 (0x3c bytes)

__int64 __fastcall Assert_28(unsigned __int16 *a1, unsigned __int16 AllocationSize)
{
  if ( !a1 ) /*0x35fb*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0x41u, "Buffer != ((void *) 0)"); /*0x360e*/
  *a1 = AllocationSize; /*0x3613*/
  return AllocationSize; /*0x361e*/
}


// Function: Assert_36 @ 0x3624 (0x2e bytes)

__int64 __fastcall Assert_36(unsigned int *FormatString, unsigned __int8 *a2, unsigned __int8 *a3)
{
  if ( !FormatString ) /*0x3630*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0x8Du, "Buffer != ((void *) 0)"); /*0x3645*/
  return *FormatString; /*0x364c*/
}


// Function: Assert_34 @ 0x3654 (0x2f bytes)

__int64 __fastcall Assert_34(__int64 a1)
{
  if ( !a1 ) /*0x3660*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0xC0u, "Buffer != ((void *) 0)"); /*0x3675*/
  return *(_QWORD *)a1; /*0x367d*/
}


// Function: Assert_26 @ 0x3684 (0x3e bytes)

__int64 __fastcall Assert_26(_QWORD *ZeroPool, __int64 a2)
{
  if ( !ZeroPool ) /*0x3697*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 0xDBu, "Buffer != ((void *) 0)"); /*0x36ac*/
  *ZeroPool = a2; /*0x36b1*/
  return a2; /*0x36bc*/
}


// Function: Assert_23 @ 0x36c4 (0x56 bytes)

unsigned __int64 __fastcall Assert_23(unsigned __int8 *FormatString)
{
  unsigned __int64 n0xF4240; // rax

  if ( ((unsigned __int8)FormatString & 1) != 0 ) /*0x36d0*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", 0x80u, "((UINTN) String & 0x00000001) == 0"); /*0x36e5*/
  if ( !FormatString ) /*0x36ef*/
    return 0; /*0x3712*/
  n0xF4240 = 0; /*0x36f1*/
  if ( *(_WORD *)FormatString ) /*0x36f3*/
  {
    while ( n0xF4240 < 0xF4240 ) /*0x36fe*/
    {
      ++n0xF4240; /*0x3700*/
      if ( !*(_WORD *)&FormatString[2 * n0xF4240] ) /*0x3703*/
        return n0xF4240; /*0x3707*/
    }
    return 1000001; /*0x370b*/
  }
  return n0xF4240; /*0x3714*/
}


// Function: ReFlashParseVersionString @ 0x371c (0x12f bytes)

unsigned __int64 __fastcall ReFlashParseVersionString(unsigned __int8 *FormatString, __int64 a2, unsigned __int64 *a3)
{
  unsigned __int8 *FormatString_1; // rbx
  const CHAR8 *(String____((void__)_0)); // r8
  UINTN n645; // rdx
  __int64 v8; // r9

  FormatString_1 = FormatString; /*0x3729*/
  if ( ((unsigned __int8)FormatString & 1) != 0 ) /*0x372f*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", 0x280u, "((UINTN) String & 0x00000001) == 0"); /*0x3744*/
  if ( !FormatString_1 ) /*0x374c*/
  {
    (String____((void__)_0)) = "(String != ((void *) 0))"; /*0x374e*/
    n645 = 645; /*0x3755*/
LABEL_5:
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c", n645, (String____((void__)_0))); /*0x375a*/
    return 0x8000000000000002uLL; /*0x3770*/
  }
  if ( !a3 ) /*0x3778*/
  {
    (String____((void__)_0)) = "(Data != ((void *) 0))"; /*0x377a*/
    n645 = 646; /*0x3781*/
    goto LABEL_5; /*0x3786*/
  }
  if ( Assert_23(FormatString_1) > 0xF4240 ) /*0x3796*/
    DebugAssert( /*0x37ab*/
      "e:\\hs\\MdePkg\\Library\\BaseLib\\SafeString.c",
      0x28Cu,
      "(StrnLenS (String, (_gPcd_FixedAtBuild_PcdMaximumUnicodeStringLength) + 1) <= (_gPcd_FixedAtBuild_PcdMaximumUnicodeStringLength))");
  if ( Assert_23(FormatString_1) > 0xF4240 ) /*0x37be*/
    return 0x8000000000000002uLL; /*0x37be*/
  while ( *(_WORD *)FormatString_1 == 32 || *(_WORD *)FormatString_1 == 9 ) /*0x37ca*/
    FormatString_1 += 2; /*0x37cc*/
  while ( *(_WORD *)FormatString_1 == 48 ) /*0x37e2*/
    FormatString_1 += 2; /*0x37da*/
  *a3 = 0; /*0x37e4*/
  while ( (unsigned __int16)(*(_WORD *)FormatString_1 - 48) <= 9u ) /*0x37f3*/
  {
    v8 = *(unsigned __int16 *)FormatString_1 - 48; /*0x37fe*/
    if ( *a3 > ~v8 / 0xAuLL ) /*0x381b*/
    {
      *a3 = -1; /*0x382e*/
      return 0x8000000000000003uLL; /*0x383c*/
    }
    FormatString_1 += 2; /*0x3821*/
    *a3 = v8 + 10 * *a3; /*0x3829*/
  }
  return 0; /*0x3845*/
}


// Function: AsciiStrLen @ 0x384c (0x23 bytes)

unsigned __int64 __fastcall AsciiStrLen(unsigned __int8 *FormatString)
{
  unsigned __int64 n0xF4240; // rax

  n0xF4240 = 0; /*0x384c*/
  if ( FormatString && *FormatString ) /*0x3853*/
  {
    while ( n0xF4240 < 0xF4240 ) /*0x385d*/
    {
      if ( !FormatString[++n0xF4240] ) /*0x3862*/
        return n0xF4240; /*0x3866*/
    }
    return 1000001; /*0x3869*/
  }
  return n0xF4240; /*0x3868*/
}


// Function: Assert_27 @ 0x3870 (0x3e bytes)

unsigned __int64 __fastcall Assert_27(unsigned __int64 RegionCount, unsigned int RegionStride)
{
  unsigned __int64 RegionStride_1; // rbx

  RegionStride_1 = RegionStride; /*0x387a*/
  if ( !RegionStride ) /*0x3881*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32.c", 0x2Bu, "Divisor != 0"); /*0x3896*/
  return RegionCount / RegionStride_1; /*0x38a8*/
}


// Function: AllocatePool @ 0x38b0 (0x31 bytes)

void *__cdecl AllocatePool(UINTN AllocationSize)
{
  __int64 v1; // rax
  void *v2; // rcx
  void *v4; // [rsp+38h] [rbp+10h] BYREF

  v1 = (*(__int64 (__fastcall **)(__int64, UINTN, void **))(BootServices_0 + 64))(4, AllocationSize, &v4); /*0x38c8*/
  v2 = v4; /*0x38cb*/
  if ( v1 < 0 ) /*0x38d5*/
    return 0; /*0x38d5*/
  return v2; /*0x38dc*/
}


// Function: AllocateZeroPool @ 0x38e4 (0x44 bytes)

void *__cdecl AllocateZeroPool(UINTN AllocationSize)
{
  UINTN Length_1; // rdx
  UINTN Length; // rbx
  __int64 v3; // rax
  UINT8 Value; // r8
  void *Buffer; // rcx
  void *Buffer_1; // [rsp+40h] [rbp+18h] BYREF

  Length = Length_1; /*0x38f6*/
  v3 = (*(__int64 (__fastcall **)(UINTN, UINTN, void **))(BootServices_0 + 64))(AllocationSize, Length_1, &Buffer_1); /*0x38f9*/
  Buffer = Buffer_1; /*0x38fc*/
  if ( v3 < 0 ) /*0x3906*/
    Buffer = 0; /*0x3906*/
  Buffer_1 = Buffer; /*0x390a*/
  if ( Buffer ) /*0x3912*/
    return SetMem(Buffer, Length, Value); /*0x391c*/
  return Buffer; /*0x3922*/
}


// Function: AllocateCopyPool @ 0x3928 (0xa5 bytes)

void *__fastcall AllocateCopyPool(__int64 a1, UINTN Length, __int64 SourceBuffer)
{
  __int64 v5; // rax
  void *DestinationBuffer; // rcx
  void *DestinationBuffer_1; // [rsp+48h] [rbp+20h] BYREF

  if ( !SourceBuffer ) /*0x3942*/
    DebugAssert( /*0x3957*/
      "e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
      0x239u,
      "Buffer != ((void *) 0)");
  if ( Length > -SourceBuffer ) /*0x3965*/
    DebugAssert( /*0x397a*/
      "e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
      0x23Au,
      "AllocationSize <= (0xFFFFFFFFFFFFFFFFULL - (UINTN) Buffer + 1)");
  v5 = (*(__int64 (__fastcall **)(__int64, UINTN, void **))(BootServices_0 + 64))(4, Length, &DestinationBuffer_1); /*0x3993*/
  DestinationBuffer = DestinationBuffer_1; /*0x3996*/
  if ( v5 < 0 ) /*0x399e*/
    DestinationBuffer = 0; /*0x399e*/
  DestinationBuffer_1 = DestinationBuffer; /*0x39a2*/
  if ( DestinationBuffer ) /*0x39aa*/
    return CopyMem(DestinationBuffer, (const void *)SourceBuffer, Length); /*0x39b7*/
  return DestinationBuffer; /*0x39c7*/
}


// Function: AllocatePoolWithAssert @ 0x39d0 (0x44 bytes)

void AllocatePoolWithAssert()
{
  __int64 v0; // rax

  v0 = (*(__int64 (**)(void))(BootServices_0 + 72))(); /*0x39db*/
  if ( v0 < 0 ) /*0x39e1*/
  {
    DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v0); /*0x39f2*/
    DebugAssert( /*0x3a0a*/
      "e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
      0x333u,
      "!EFI_ERROR (Status)");
  }
}


// Function: UnicodeSPrint @ 0x3a14 (0x60 bytes)

UINTN UnicodeSPrint(CHAR16 *StartOfBuffer, UINTN BufferSize, const CHAR16 *FormatString, ...)
{
  va_list va; // [rsp+68h] [rbp+20h] BYREF

  va_start(va, FormatString);
  if ( ((unsigned __int8)StartOfBuffer & 1) != 0 ) /*0x3a31*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BasePrintLib\\PrintLib.c", 0xF0u, "(((UINTN) (StartOfBuffer)) & 0x01) == 0"); /*0x3a46*/
  return BasePrintLibSPrintMarker( /*0x3a6c*/
           (unsigned __int64)StartOfBuffer,
           BufferSize >> 1,
           64,
           (unsigned __int8 *)FormatString,
           va);
}


// Function: StrPad @ 0x3a74 (0x33 bytes)

_BYTE *__fastcall StrPad(_BYTE *StartOfBuffer, _BYTE *StartOfBuffer_1, __int64 i, __int16 n32, __int64 n2)
{
  __int64 j; // r10

  for ( j = 0; j < i; ++j ) /*0x3a7a*/
  {
    if ( StartOfBuffer >= StartOfBuffer_1 ) /*0x3a7f*/
      break; /*0x3a7f*/
    *StartOfBuffer = n32; /*0x3a87*/
    if ( n2 != 1 ) /*0x3a8a*/
      StartOfBuffer[1] = HIBYTE(n32); /*0x3a93*/
    StartOfBuffer += n2; /*0x3a96*/
  }
  return StartOfBuffer; /*0x3aa6*/
}


// Function: Assert_19 @ 0x3aa8 (0x76 bytes)

_BYTE *__fastcall Assert_19(_BYTE *_r_n, unsigned __int64 a2, __int64 n16)
{
  int n16_1; // edi
  unsigned __int64 n16_2; // rbp
  _BYTE *_r_n_1; // rbx
  unsigned __int64 v7; // rtt

  n16_1 = n16; /*0x3abc*/
  *_r_n = 0; /*0x3abf*/
  n16_2 = (unsigned int)n16; /*0x3ac5*/
  _r_n_1 = _r_n; /*0x3ac8*/
  do /*0x3b04*/
  {
    if ( !n16_1 ) /*0x3acd*/
      DebugAssert("e:\\hs\\MdePkg\\Library\\BaseLib\\DivU64x32Remainder.c", 0x2Fu, "Divisor != 0"); /*0x3ae0*/
    ++_r_n_1; /*0x3af1*/
    v7 = a2; /*0x3af4*/
    a2 /= n16_2; /*0x3af7*/
    *_r_n_1 = a0123456789abcd[(unsigned int)(v7 % n16_2)]; /*0x3aff*/
  }
  while ( a2 ); /*0x3b04*/
  return _r_n_1; /*0x3b18*/
}


// Function: BasePrintLibSPrintMarker @ 0x3b20 (0xe0f bytes)

unsigned __int64 __fastcall BasePrintLibSPrintMarker(
        unsigned __int64 StartOfBuffer,
        unsigned __int64 n0xF4240,
        __int16 n64,
        unsigned __int8 *FormatString,
        va_list va)
{
  unsigned __int8 *FormatString_2; // r14
  __int64 v6; // r12
  unsigned __int64 StartOfBuffer_1; // r13
  __int64 v9; // rdi
  const CHAR8 *(Buffer____((void__)_0)); // r8
  UINTN n578; // rdx
  __int64 n0xFFFF; // rdx
  _BYTE *StartOfBuffera_1; // rbx
  unsigned __int64 v15; // r10
  __int64 n2_3; // rsi
  int v17; // eax
  bool v18; // zf
  unsigned __int64 n10; // rcx
  unsigned __int8 *FormatString_3; // rdx
  unsigned __int8 *FormatString_4; // r8
  unsigned __int64 v22; // r9
  char v23; // r11
  __int64 v24; // rdi
  const char *_r_n_1; // rbx
  va_list va_1; // r10
  unsigned __int8 *FormatString_5; // rdx
  int v28; // eax
  unsigned __int64 n13_1; // rcx
  unsigned __int16 *v30; // rax
  int v31; // eax
  unsigned __int8 *FormatString_6; // rdx
  unsigned __int64 v33... [32067 chars total]


// Function: AsciiSPrint @ 0x4930 (0x22 bytes)

unsigned __int64 AsciiSPrint(_BYTE *_r_n, unsigned __int64 n38, __int16 n64, char *%02d_%02d_%04d__%02d:%02d, ...)
{
  va_list va; // [rsp+60h] [rbp+28h] BYREF

  va_start(va, %02d_%02d_%04d__%02d:%02d);
  return BasePrintLibSPrintMarker((unsigned __int64)_r_n, n38, n64, (unsigned __int8 *)%02d_%02d_%04d__%02d:%02d, va); /*0x494d*/
}


// Function: Assert_17 @ 0x4954 (0x86 bytes)

bool __fastcall Assert_17(__int64 i)
{
  __int64 i_1; // rbx
  unsigned __int64 v2; // rdi
  __int64 j; // rcx
  unsigned __int64 n4; // rax

  i_1 = i; /*0x495e*/
  if ( !i ) /*0x4964*/
    DebugAssert( /*0x4977*/
      "e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c",
      0x3Eu,
      "DevicePath != ((void *) 0)");
  v2 = 0; /*0x497c*/
  for ( j = i_1; ; j = i_1 ) /*0x497e*/
  {
    if ( Assert_24(j) ) /*0x49b3*/
      return Assert_30(i_1) == 4; /*0x49c8*/
    n4 = Assert_30(i_1); /*0x4986*/
    if ( n4 < 4 ) /*0x498f*/
      break; /*0x498f*/
    if ( n4 > ~v2 ) /*0x499a*/
      break; /*0x499a*/
    v2 += n4; /*0x499c*/
    if ( v2 > 0xFFFFFFFFFFFFFFFBuLL ) /*0x49a3*/
      break; /*0x49a3*/
    i_1 = Assert_31(i_1); /*0x49ad*/
  }
  return 0; /*0x49d0*/
}


// Function: Assert_38 @ 0x49dc (0x2c bytes)

char __fastcall Assert_38(__int64 i)
{
  if ( !i ) /*0x49e8*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0x7Eu, "Node != ((void *) 0)"); /*0x49fb*/
  return *(_BYTE *)i; /*0x4a02*/
}


// Function: Assert_35 @ 0x4a08 (0x2f bytes)

char __fastcall Assert_35(__int64 i)
{
  if ( !i ) /*0x4a14*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0x94u, "Node != ((void *) 0)"); /*0x4a29*/
  return *(_BYTE *)(i + 1); /*0x4a31*/
}


// Function: Assert_30 @ 0x4a38 (0x38 bytes)

__int64 __fastcall Assert_30(__int64 i)
{
  if ( !i ) /*0x4a44*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0xADu, "Node != ((void *) 0)"); /*0x4a59*/
  return (unsigned __int16)Assert_37((unsigned __int16 *)(i + 2)); /*0x4a6a*/
}


// Function: Assert_31 @ 0x4a70 (0x37 bytes)

__int64 __fastcall Assert_31(__int64 i)
{
  if ( !i ) /*0x4a7c*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0xC5u, "Node != ((void *) 0)"); /*0x4a91*/
  return i + Assert_30(i); /*0x4aa1*/
}


// Function: Assert_29 @ 0x4aa8 (0x39 bytes)

bool __fastcall Assert_29(__int64 i)
{
  if ( !i ) /*0x4ab4*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0xE3u, "Node != ((void *) 0)"); /*0x4ac9*/
  return Assert_38(i) == 127; /*0x4adb*/
}


// Function: Assert_24 @ 0x4ae4 (0x53 bytes)

char __fastcall Assert_24(__int64 i)
{
  char v1; // bl

  v1 = 0; /*0x4aee*/
  if ( !i ) /*0x4af6*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0xFEu, "Node != ((void *) 0)"); /*0x4b0b*/
  if ( Assert_29(i) && Assert_35(i) == -1 ) /*0x4b26*/
    return 1; /*0x4b28*/
  return v1; /*0x4b31*/
}


// Function: Assert_22 @ 0x4b38 (0x67 bytes)

__int64 __fastcall Assert_22(_WORD *Pool, UINTN AllocationSize)
{
  if ( !Pool ) /*0x4b4b*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0x136u, "Node != ((void *) 0)"); /*0x4b60*/
  if ( AllocationSize - 4 > 0xFFFB ) /*0x4b6f*/
    DebugAssert( /*0x4b84*/
      "e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c",
      0x137u,
      "(Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)) && (Length < 0x00010000)");
  return Assert_28(Pool + 1, AllocationSize); /*0x4b95*/
}


// Function: Assert_25 @ 0x4ba0 (0x40 bytes)

void *__fastcall Assert_25(void *DestinationBuffer)
{
  if ( !DestinationBuffer ) /*0x4bac*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiDevicePathLib\\DevicePathUtilities.c", 0x151u, "Node != ((void *) 0)"); /*0x4bc1*/
  return CopyMem(DestinationBuffer, &SourceBuffer_, 4u); /*0x4bd6*/
}


// Function: Assert_44 @ 0x4be0 (0x60 bytes)

__int64 __fastcall Assert_44(__int64 i)
{
  __int64 v1; // rbx
  __int64 i_1; // rsi
  __int64 j; // rcx

  v1 = 0; /*0x4bef*/
  i_1 = i; /*0x4bf4*/
  if ( i && Assert_17(i) ) /*0x4bfc*/
  {
    for ( j = i_1; !Assert_24(j); j = i_1 ) /*0x4c05*/
      i_1 = Assert_31(i_1); /*0x4c0f*/
    return Assert_30(i_1) + i_1 - i; /*0x4c29*/
  }
  return v1; /*0x4c3a*/
}


// Function: Assert_42 @ 0x4c40 (0xd6 bytes)

char *__fastcall Assert_42(const void *SourceBuffer, void *SourceBuffer_2)
{
  __int64 v2; // rbx
  const void *SourceBuffer_1; // rdi
  UINTN Length; // rax
  __int64 v6; // rcx
  UINTN Length_1; // r14
  UINTN Length_2; // r15
  char *Pool; // rax
  char *Pool_1; // rbp

  v2 = 0; /*0x4c58*/
  SourceBuffer_1 = SourceBuffer; /*0x4c5d*/
  if ( !SourceBuffer ) /*0x4c63*/
  {
    SourceBuffer_1 = &SourceBuffer_; /*0x4c68*/
    if ( SourceBuffer_2 ) /*0x4c6f*/
      SourceBuffer_1 = SourceBuffer_2; /*0x4c6f*/
    SourceBuffer = SourceBuffer_1; /*0x4c73*/
    goto LABEL_5; /*0x4c73*/
  }
  if ( !SourceBuffer_2 ) /*0x4c93*/
  {
LABEL_5:
    Length = Assert_44((__int64)SourceBuffer); /*0x4c76*/
    if ( Length ) /*0x4c7e*/
      return (char *)AllocateCopyPool(v6, Length, (__int64)SourceBuffer_1); /*0x4c8b*/
    return (char *)v2; /*0x4c8e*/
  }
  if ( Assert_17((__int64)SourceBuffer) && Assert_17((__int64)SourceBuffer_2) ) /*0x4ca1*/
  {
    Length_1 = Assert_44((__int64)SourceBuffer_1); /*0x4cb5*/
    Length_2 = Assert_44((__int64)SourceBuffer_2); /*0x4cbd*/
    Pool = (char *)AllocatePool(Length_1 + Length_2 - 4); /*0x4cc7*/
    Pool_1 = Pool; /*0x4ccc*/
    if ( Pool ) /*0x4cd2*/
    {
      Pool_1 = (char *)CopyMem(Pool, SourceBuffer_1, Length_1); /*0x4cef*/
      CopyMem(&Pool_1[Length_1 - 4], SourceBuffer_2, Length_2); /*0x4cf2*/
    }
    return Pool_1; /*0x4cf7*/
  }
  return (char *)v2; /*0x4d0c*/
}


// Function: Assert_12 @ 0x4d18 (0xb4 bytes)

char *__fastcall Assert_12(const void *SourceBuffer, const void *i)
{
  char *v2; // rdi
  void *SourceBuffer_1; // rbx
  UINTN Length_1; // rax
  __int64 v7; // rcx
  UINTN Length; // rbp
  void *Pool; // rax
  void *i_1; // rbx
  void *DestinationBuffer; // rax

  v2 = 0; /*0x4d2c*/
  if ( i ) /*0x4d37*/
  {
    Length = Assert_30((__int64)i); /*0x4d6c*/
    Pool = AllocatePool(Length + 4); /*0x4d73*/
    if ( Pool ) /*0x4d7b*/
    {
      i_1 = CopyMem(Pool, i, Length); /*0x4d8e*/
      DestinationBuffer = (void *)Assert_31((__int64)i_1); /*0x4d91*/
      Assert_25(DestinationBuffer); /*0x4d99*/
      v2 = Assert_42(SourceBuffer, i_1); /*0x4dac*/
      AllocatePoolWithAssert(); /*0x4daf*/
    }
  }
  else
  {
    SourceBuffer_1 = &SourceBuffer_; /*0x4d3c*/
    if ( SourceBuffer ) /*0x4d43*/
      SourceBuffer_1 = (void *)SourceBuffer; /*0x4d43*/
    Length_1 = Assert_44((__int64)SourceBuffer_1); /*0x4d4a*/
    if ( Length_1 ) /*0x4d52*/
      return (char *)AllocateCopyPool(v7, Length_1, (__int64)SourceBuffer_1); /*0x4d5f*/
  }
  return v2; /*0x4dc6*/
}


// Function: UefiLibGetConfigTable @ 0x4dcc (0xc4 bytes)

unsigned __int64 __fastcall UefiLibGetConfigTable(GUID *ImageHandle, _QWORD *p_DestinationBuffer)
{
  __int64 SystemTable; // rdi
  __int64 v5; // rbx
  __int64 i; // r14

  if ( !ImageHandle ) /*0x4dee*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiLib\\UefiLib.c", 0x61u, "TableGuid != ((void *) 0)"); /*0x4e01*/
  if ( !p_DestinationBuffer ) /*0x4e09*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\UefiLib\\UefiLib.c", 0x62u, "Table != ((void *) 0)"); /*0x4e1c*/
  SystemTable = SystemTable_0; /*0x4e21*/
  v5 = 0; /*0x4e28*/
  *p_DestinationBuffer = 0; /*0x4e2a*/
  if ( !*(_QWORD *)(SystemTable + 104) ) /*0x4e2e*/
    return 0x800000000000000EuLL; /*0x4e57*/
  for ( i = 0; !CompareGuid(ImageHandle, (const GUID *)(i + *(_QWORD *)(SystemTable + 112))); i += 24 ) /*0x4e34*/
  {
    if ( (unsigned __int64)++v5 >= *(_QWORD *)(SystemTable + 104) ) /*0x4e55*/
      return 0x800000000000000EuLL; /*0x4e55*/
  }
  *p_DestinationBuffer = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 * v5 + 16); /*0x4e8b*/
  return 0; /*0x4e75*/
}


// Function: PciExpressLibGetPciExpressAddress @ 0x4e90 (0x3a bytes)

__int64 __fastcall PciExpressLibGetPciExpressAddress(__int64 n1024064)
{
  if ( (n1024064 & 0xFFFFFFFFF0000000uLL) != 0 ) /*0x4ea0*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\SmmPciExpressLib\\PciExpressLib.c", 0x76u, "((Address) & ~0xfffffff) == 0"); /*0x4eb5*/
  return n1024064 + qword_D240; /*0x4ec4*/
}


// Function: HobLibGetHobList @ 0x4ecc (0x82 bytes)

__int64 __fastcall HobLibGetHobList(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  __int64 DestinationBuffer; // rax
  __int64 ConfigTable; // rax

  DestinationBuffer = DestinationBuffer_1; /*0x4ed0*/
  if ( !DestinationBuffer_1 ) /*0x4eda*/
  {
    ConfigTable = UefiLibGetConfigTable(&ImageHandle__2, &DestinationBuffer_1); /*0x4eea*/
    if ( ConfigTable < 0 ) /*0x4ef2*/
    {
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", ConfigTable); /*0x4f03*/
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 0x36u, "!EFI_ERROR (Status)"); /*0x4f1b*/
    }
    DestinationBuffer = DestinationBuffer_1; /*0x4f20*/
    if ( !DestinationBuffer_1 ) /*0x4f2a*/
    {
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 0x37u, "mHobList != ((void *) 0)"); /*0x4f3d*/
      return DestinationBuffer_1; /*0x4f42*/
    }
  }
  return DestinationBuffer; /*0x4f49*/
}


// Function: HobLibGetNextHob @ 0x4f50 (0x58 bytes)

_WORD *__fastcall HobLibGetNextHob(__int16 n11, _WORD *i)
{
  _WORD *i_1; // rbx

  i_1 = i; /*0x4f5a*/
  if ( !i ) /*0x4f63*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 0x6Cu, "HobStart != ((void *) 0)"); /*0x4f76*/
  while ( 1 ) /*0x4f8e*/
  {
    if ( *i_1 == 0xFFFF ) /*0x4f94*/
      return 0; /*0x4f96*/
    if ( *i_1 == n11 ) /*0x4f85*/
      break; /*0x4f85*/
    i_1 = (_WORD *)((char *)i_1 + (unsigned __int16)i_1[1]); /*0x4f8b*/
  }
  return i_1; /*0x4f9d*/
}


// Function: ReFlashFindFlashDescriptor @ 0x4fa8 (0x4e bytes)

_WORD *__fastcall ReFlashFindFlashDescriptor(const GUID *ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
  _WORD *i; // rdx
  _WORD *NextHob; // rax
  _WORD *NextHob_1; // rbx

  for ( i = (_WORD *)HobLibGetHobList((__int64)ImageHandle, SystemTable); /*0x4fba*/
        ;
        i = (_WORD *)((char *)NextHob_1 + (unsigned __int16)NextHob_1[1]) )
  {
    NextHob = HobLibGetNextHob(4, i); /*0x4fdb*/
    NextHob_1 = NextHob; /*0x4fe0*/
    if ( !NextHob || CompareGuid(ImageHandle, (const GUID *)(NextHob + 4)) ) /*0x4fc6*/
      break; /*0x4fc6*/
  }
  return NextHob_1; /*0x4ff0*/
}


// Function: Assert_43 @ 0x4ff8 (0x73 bytes)

__int64 __fastcall Assert_43(unsigned int a1)
{
  unsigned int v1; // ebx
  int n0x400000; // edi
  unsigned __int32 v3; // esi
  __int64 result; // rax

  v1 = a1 >> 22; /*0x5010*/
  n0x400000 = a1 & 0x3FFFFF; /*0x5018*/
  do /*0x5054*/
  {
    v3 = n0x400000 + (Assert_33(0x508u) & 0xFFFFFF); /*0x502e*/
    n0x400000 = 0x400000; /*0x5030*/
    while ( ((v3 - Assert_33(0x508u)) & 0x800000) == 0 ) /*0x504c*/
      fn_addr(); /*0x5037*/
    result = v1--; /*0x504e*/
  }
  while ( (_DWORD)result ); /*0x5054*/
  return result; /*0x5065*/
}


// Function: Assert_49 @ 0x506c (0x31 bytes)

__int64 __fastcall Assert_49(__int64 n1000000)
{
  Assert_43(3579545 * n1000000 / 0xF4240uLL); /*0x508f*/
  return n1000000; /*0x5097*/
}


// Function: ReFlashGetLanguage @ 0x50a0 (0x73 bytes)

const char *ReFlashGetLanguage()
{
  __int64 en_US; // rax
  const char *en_US_1; // rbx

  en_US = en_US; /*0x50ac*/
  en_US_1 = "en-US"; /*0x50b3*/
  if ( (const char *)en_US == "en-US" ) /*0x50ce*/
    en_US = 0; /*0x50ce*/
  en_US = en_US; /*0x50d9*/
  if ( (__int64)GetVariable(L"PlatformLang", &Guid_) >= 0 ) /*0x50f6*/
    en_US_1 = (const char *)en_US; /*0x50f6*/
  en_US = (__int64)en_US_1; /*0x50fe*/
  return en_US_1; /*0x510d*/
}


// Function: HiiParseNameValuePairs @ 0x5114 (0x1a9 bytes)

__int64 __fastcall HiiParseNameValuePairs(__int64 a1, unsigned __int64 *p_n32, CHAR16 *Name)
{
  _WORD *v4; // r10
  unsigned __int64 i; // r9
  __int16 v7; // cx
  __int16 v8; // cx
  __int16 v9; // cx
  __int16 v10; // cx
  char v11; // cl
  char v12; // cl
  CHAR16 v13; // dx
  char v14; // cl
  unsigned __int8 v15; // cl
  CHAR16 v16; // r8
  char v17; // cl
  unsigned __int8 v18; // cl
  CHAR16 v19; // dx
  char v20; // cl
  unsigned __int8 v21; // cl

  v4 = (_WORD *)(a1 + 4); /*0x511c*/
  for ( i = 0; ; ++i ) /*0x5125*/
  {
    v7 = *(v4 - 2); /*0x5128*/
    if ( (unsigned __int16)(v7 - 48) > 0x36u ) /*0x5134*/
      break; /*0x5134*/
    if ( (unsigned __int16)(v7 - 58) <= 6u ) /*0x5141*/
      break; /*0x5141*/
    if ( (unsigned __int16)(v7 - 71) <= 0x19u ) /*0x514f*/
      break; /*0x514f*/
    v8 = *(v4 - 1); /*0x5155*/
    if ( (unsigned __int16)(v8 - 48) > 0x36u ) /*0x5161*/
      break; /*0x5161*/
    if ( (unsigned __int16)(v8 - 58) <= 6u ) /*0x516e*/
      break; /*0x516e*/
    if ( (unsigned __int16)(v8 - 71) <= 0x19u ) /*0x517c*/
      break; /*0x517c*/
    v9 = *v4; /*0x5182*/
    if ( (unsigned __int16)(*v4 - 48) > 0x36u ) /*0x518d*/
      break; /*0x518d*/
    if ( (unsigned __int16)(v9 - 58) <= 6u ) /*0x519a*/
      break; /*0x519a*/
    if ( (unsigned __int16)(v9 - 71) <= 0x19u ) /*0x51a8*/
      break; /*0x51a8*/
    v10 = v4[1]; /*0x51ae*/
    if ( (unsigned __int16)(v10 - 48) > 0x36u /*0x51e4*/
      || (unsigned __int16)(v10 - 58) <= 6u
      || (unsigned __int16)(v10 - 71) <= 0x19u
      || i >= *p_n32 - 1 )
    {
      break; /*0x51e4*/
    }
    v11 = *((_BYTE *)v4 - 4); /*0x51ea*/
    if ( (unsigned __int8)(v11 - 48) > 9u ) /*0x51f3*/
    {
      if ( (unsigned __int8)(v11 - 65) > 5u ) /*0x51ff*/
        v12 = v11 - 87; /*0x5206*/
      else
        v12 = v11 - 55; /*0x5201*/
    }
    else
    {
      v12 = v11 - 48; /*0x51f5*/
    }
    v13 = 16 * (v12 & 0xF); /*0x520f*/
    Name[i] = v13; /*0x5213*/
    v14 = *((_BYTE *)v4 - 2); /*0x5218*/
    if ( (unsigned __int8)(v14 - 48) > 9u ) /*0x5221*/
    {
      if ( (unsigned __int8)(v14 - 65) > 5u ) /*0x522d*/
        v15 = v14 - 87; /*0x5234*/
      else
        v15 = v14 - 55; /*0x522f*/
    }
    else
    {
      v15 = v14 - 48; /*0x5223*/
    }
    v16 = 16 * (v13 | v15); /*0x523f*/
    Name[i] = v16; /*0x5244*/
    v17 = *(_BYTE *)v4; /*0x5249*/
    if ( (unsigned __int8)(*(_BYTE *)v4 - 48) > 9u ) /*0x5251*/
    {
      if ( (unsigned __int8)(v17 - 65) > 5u ) /*0x525d*/
        v18 = v17 - 87; /*0x5264*/
      else
        v18 = v17 - 55; /*0x525f*/
    }
    else
    {
      v18 = v17 - 48; /*0x5253*/
    }
    v19 = 16 * (v16 | v18); /*0x526e*/
    Name[i] = v19; /*0x5272*/
    v20 = *((_BYTE *)v4 + 2); /*0x5277*/
    if ( (unsigned __int8)(v20 - 48) > 9u ) /*0x5280*/
    {
      if ( (unsigned __int8)(v20 - 65) > 5u ) /*0x528c*/
        v21 = v20 - 87; /*0x5293*/
      else
        v21 = v20 - 55; /*0x528e*/
    }
    else
    {
      v21 = v20 - 48; /*0x5282*/
    }
    v4 += 4; /*0x5299*/
    Name[i] = v19 | v21; /*0x52a0*/
  }
  *p_n32 = i; /*0x52ad*/
  Name[i] = 0; /*0x52b7*/
  return 0; /*0x52bc*/
}


// Function: HiiParseGuidString @ 0x52c0 (0x7d bytes)

__int64 __fastcall HiiParseGuidString(__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; /*0x52c5*/
  v5 = a1; /*0x52cb*/
  if ( n32 ) /*0x52d1*/
  {
    n32_2 = n32 - 1; /*0x52d3*/
    do /*0x5335*/
    {
      if ( n32_1 == n32_2 ) /*0x52da*/
      {
        LOBYTE(a1) = *(_BYTE *)(v5 + 2 * n32_1); /*0x52dc*/
        v7 = 0; /*0x52e0*/
      }
      else
      {
        v8 = *(_BYTE *)(v5 + 2 * n32_1); /*0x52e4*/
        if ( (unsigned __int8)(v8 - 48) > 9u ) /*0x52ed*/
        {
          if ( (unsigned __int8)(v8 - 65) > 5u ) /*0x52f9*/
            v7 = v8 - 87; /*0x5300*/
          else
            v7 = v8 - 55; /*0x52fb*/
        }
        else
        {
          v7 = v8 - 48; /*0x52ef*/
        }
        LOBYTE(a1) = *(_BYTE *)(v5 + 2 * n32_1 + 2); /*0x5303*/
      }
      result = (unsigned int)(a1 - 48); /*0x5308*/
      if ( (unsigned __int8)(a1 - 48) > 9u ) /*0x530d*/
      {
        result = (unsigned int)(a1 - 65); /*0x5314*/
        if ( (unsigned __int8)(a1 - 65) > 5u ) /*0x5319*/
          v10 = a1 - 87; /*0x5320*/
        else
          v10 = a1 - 55; /*0x531b*/
      }
      else
      {
        v10 = a1 - 48; /*0x530f*/
      }
      n32_1 += 2LL; /*0x5326*/
      *n4++ = v10 | (16 * v7); /*0x532c*/
    }
    while ( n32_1 < n32 ); /*0x5335*/
  }
  return result; /*0x533c*/
}


// Function: HiiParseRoutingData @ 0x5340 (0x165 bytes)

__int64 __fastcall HiiParseRoutingData(__int16 *a1, __int64 a2)
{
  __int64 v3; // rbx
  __int16 *v5; // rsi
  __int16 i; // ax
  __int16 *v7; // rdi
  unsigned __int64 n32; // rsi
  __int16 *j; // rdx
  __int16 v10; // cx
  _BYTE *n4_1; // rbx
  __int64 result; // rax
  _BYTE *n4_2; // rcx
  __int64 v14; // rax
  unsigned __int64 v15; // rbx
  _BYTE *n4; // [rsp+40h] [rbp+8h] BYREF
  _BYTE *n4_3; // [rsp+50h] [rbp+18h] BYREF

  v3 = 0; /*0x5358*/
  n4 = 0; /*0x535b*/
  v5 = a1; /*0x5363*/
  do /*0x539f*/
  {
    for ( i = *v5; i != 38 && i; i = a1[v3] ) /*0x5366*/
      ++v3; /*0x5370*/
    if ( !a1[v3] ) /*0x5382*/
      return 0x800000000000000EuLL; /*0x5488*/
    v5 = &a1[++v3]; /*0x5398*/
  }
  while ( StrnCmp((unsigned __int64)v5, L"PATH=", 0xAu) ); /*0x539f*/
  v7 = &a1[v3]; /*0x53a9*/
  n32 = 0; /*0x53ad*/
  for ( j = v7 + 5; ; ++j ) /*0x53b0*/
  {
    v10 = *j; /*0x53b4*/
    if ( (unsigned __int16)(*j - 48) > 0x36u /*0x53d1*/
      || (unsigned __int16)(v10 - 58) <= 6u
      || (unsigned __int16)(v10 - 71) <= 0x19u )
    {
      break; /*0x53d1*/
    }
    ++n32; /*0x53d3*/
  }
  n4_1 = (_BYTE *)(n32 >> 1); /*0x53f0*/
  result = (*(__int64 (__fastcall **)(__int64, unsigned __int64, _BYTE **))(BootServices + 64))(4, n32 >> 1, &n4); /*0x53f6*/
  if ( result >= 0 ) /*0x53fc*/
  {
    HiiParseGuidString((__int64)(v7 + 5), n32, n4); /*0x5411*/
    result = 0; /*0x5416*/
  }
  else
  {
    n4_1 = n4; /*0x53fe*/
  }
  if ( result >= 0 ) /*0x541c*/
  {
    n4_2 = n4; /*0x541e*/
    if ( n4 /*0x5442*/
      && (unsigned __int64)n4_1 >= 4
      && *((unsigned __int16 *)n4 + 1) <= (unsigned __int64)n4_1
      && ((unsigned __int8)(*n4 - 1) <= 4u || *n4 == 127) )
    {
      n4_3 = n4; /*0x5450*/
      v14 = (*(__int64 (__fastcall **)(void *, _BYTE **, __int64))(BootServices + 184))(&unk_CB58, &n4_3, a2); /*0x545f*/
      n4_2 = n4; /*0x5465*/
      v15 = v14; /*0x546a*/
    }
    else
    {
      v15 = 0x800000000000000EuLL; /*0x546f*/
    }
    (*(void (__fastcall **)(_BYTE *))(BootServices + 72))(n4_2); /*0x5480*/
    return v15; /*0x5483*/
  }
  return result; /*0x549c*/
}


// Function: ReFlashStripHiiConfigValues @ 0x54a8 (0xd6 bytes)

__int64 __fastcall ReFlashStripHiiConfigValues(char *ReservedPool, UINTN BufferSize)
{
  __int64 v3; // rbx
  __int64 v4; // rbp
  __int16 n38_1; // di
  char *ReservedPool_1; // rax
  __int16 n38; // ax
  char *src; // [rsp+40h] [rbp+8h] BYREF

  v3 = 0; /*0x54cc*/
  v4 = 0; /*0x54cf*/
  (*(void (__fastcall **)(__int64, UINTN, char **))(BootServices + 64))(4, BufferSize, &src); /*0x54d6*/
  n38_1 = *(_WORD *)ReservedPool; /*0x54d9*/
  if ( *(_WORD *)ReservedPool ) /*0x54d9*/
  {
    ReservedPool_1 = ReservedPool; /*0x54e1*/
    do /*0x5532*/
    {
      if ( n38_1 == 38 && !StrnCmp((unsigned __int64)(ReservedPool_1 + 2), L"VALUE=", 0xCu) ) /*0x54fb*/
      {
        do /*0x550a*/
        {
          ++v3; /*0x550c*/
          n38 = *(_WORD *)&ReservedPool[2 * v3]; /*0x550f*/
        }
        while ( n38 != 38 && n38 ); /*0x550a*/
        n38_1 = *(_WORD *)&ReservedPool[2 * v3]; /*0x5519*/
        if ( !n38_1 ) /*0x5520*/
          break; /*0x5520*/
      }
      ++v3; /*0x5527*/
      *(_WORD *)&src[2 * v4] = n38_1; /*0x552a*/
      ReservedPool_1 = &ReservedPool[2 * v3]; /*0x552e*/
      n38_1 = *(_WORD *)ReservedPool_1; /*0x5532*/
      ++v4; /*0x5535*/
    }
    while ( *(_WORD *)ReservedPool_1 ); /*0x5532*/
  }
  *(_WORD *)&src[2 * v4] = 0; /*0x554d*/
  InternalCopyMemOverlap(ReservedPool, src, 2 * v4 + 2); /*0x5557*/
  return (*(__int64 (__fastcall **)(char *))(BootServices + 72))(src); /*0x5575*/
}


// Function: HiiExtractConfigCallback @ 0x5580 (0x2c1 bytes)

void *__fastcall HiiExtractConfigCallback(__int64 a1, unsigned __int64 DestMax, unsigned __int64 *a3, __int64 a4)
{
  void *result; // rax
  _WORD *v8; // rbx
  UINTN AllocationSize; // rbx
  const void *Buffer; // rdx
  CHAR16 *CopyPool; // rax
  UINTN CopyPool_1; // r14
  UINTN v13; // rax
  const void *Buffer_1; // rdx
  CHAR16 *Destination; // rax
  const CHAR16 *Source; // r8
  CHAR16 *Destination_1; // r12
  const CHAR16 *Source_1; // r8
  __int64 v19; // rbx
  __int64 v20; // r15
  UINTN v21; // rax
  __int64 BootServices; // rdx
  __int64 v23; // [rsp+30h] [rbp-89h] BYREF
  __int64 v24; // [rsp+38h] [rbp-81h] BYREF
  EFI_GUID n4; // [rsp+40h] [rbp-79h] BYREF
  CHAR16 Name[80]; // [rsp+50h] [rbp-69h] BYREF
  unsigned __int64 p_n32; // [rsp+128h] [rbp+6Fh] BYREF

  v23 = 0; /*0x55a9*/
  if ( !DestMax ) /*0x55b7*/
  {
    *a3 = 0; /*0x55b9*/
    return (void *)0x8000000000000002LL; /*0x55c6*/
  }
  result = (void *)(*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CA80, 0, &v24); /*0x55e0*/
  if ( (__int64)result >= 0 )
  {
    if ( StrnCmp(DestMax, L"GUID=", 0xAu) ) /*0x5602*/
    {
LABEL_6:
      *a3 = DestMax; /*0x560c*/
      return (void *)0x8000000000000002LL; /*0x560f*/
    }
    p_n32 = 32; /*0x561d*/
    HiiParseGuidString(DestMax + 10, 0x20u, &n4); /*0x5625*/
    v8 = (_WORD *)(DestMax + 74); /*0x562a*/
    if ( *(_WORD *)(DestMax + 74) != 38 )
    {
      DebugPrintErrorLevel(0x80000000LL, "HII Extract Config: Guid extraction failed\n");
      goto LABEL_6; /*0x564a*/
    }
    if ( StrnCmp(DestMax + 76, L"NAME=", 0xAu) ) /*0x565a*/
    {
LABEL_10:
      *a3 = (unsigned __int64)v8; /*0x5664*/
      return (void *)0x8000000000000002LL; /*0x5667*/
    }
    p_n32 = 80; /*0x566f*/
    HiiParseNameValuePairs(DestMax + 86, &p_n32, Name); /*0x5686*/
    v8 = (_WORD *)(DestMax + 86 + 8 * p_n32); /*0x568f*/
    if ( *v8 != 38 )
    {
      DebugPrintErrorLevel(0x80000000LL, "HII Extract Config: Name extraction failed\n");
      *a3 = DestMax + 74; /*0x56aa*/
      return (void *)0x8000000000000002LL; /*0x56ad*/
    }
    p_n32 = 0; /*0x56b7*/
    result = GetVariable(Name, &n4); /*0x56cf*/
    if ( (__int64)result >= 0 ) /*0x56d7*/
    {
      while ( *++v8 != 38 ) /*0x56e6*/
      {
        if ( !*v8 ) /*0x56e4*/
        {
          AllocationSize = 2 * StrLen(L"&OFFSET=0&WIDTH=") + 18; /*0x5709*/
          CopyPool = (CHAR16 *)AllocateCopyPool(AllocationSize, Buffer); /*0x5714*/
          CopyPool_1 = (UINTN)CopyPool; /*0x5719*/
          if ( !CopyPool ) /*0x571f*/
            return (void *)0x8000000000000009LL; /*0x571f*/
          UnicodeSPrintAsciiFormat(CopyPool, AllocationSize, L"&OFFSET=0&WIDTH=%x", p_n32, &v23); /*0x5741*/
          v13 = StrLen((const CHAR16 *)DestMax); /*0x5749*/
          Destination = (CHAR16 *)AllocateCopyPool(AllocationSize + 2 * (v13 + 1), Buffer_1); /*0x5755*/
          Destination_1 = Destination; /*0x575a*/
          if ( !Destination ) /*0x5760*/
            return (void *)0x8000000000000009LL; /*0x572b*/
          StrCpyS(Destination, DestMax, Source); /*0x5768*/
          StrCpyS(Destination_1, CopyPool_1, Source_1); /*0x5773*/
          v19 = v23; /*0x5780*/
          v20 = (*(__int64 (__fastcall **)(__int64, CHAR16 *, __int64, unsigned __int64, __int64, unsigned __int64 *))(v24 + 24))( /*0x579f*/
                  v24,
                  Destination_1,
                  v23,
                  p_n32,
                  a4,
                  a3);
          v21 = StrLen((const CHAR16 *)DestMax); /*0x57a2*/
          BootServices = BootServices; /*0x57a7*/
          *a3 = DestMax + 2 * v21; /*0x57b2*/
          (*(void (__fastcall **)(UINTN))(BootServices + 72))(CopyPool_1); /*0x57b8*/
          (*(void (__fastcall **)(CHAR16 *))(BootServices + 72))(Destination_1); /*0x57c5*/
          goto LABEL_24; /*0x57c8*/
        }
      }
      if ( StrnCmp((unsigned __int64)(v8 + 1), L"OFFSET=", 0xEu) ) /*0x57db*/
        goto LABEL_10; /*0x57e3*/
      v19 = v23; /*0x57f1*/
      v20 = (*(__int64 (__fastcall **)(__int64, unsigned __int64, __int64, unsigned __int64, __int64, unsigned __int64 *))(v24 + 24))( /*0x580d*/
              v24,
              DestMax,
              v23,
              p_n32,
              a4,
              a3);
LABEL_24:
      (*(void (__fastcall **)(__int64))(BootServices + 72))(v19); /*0x5810*/
      return (void *)v20; /*0x581d*/
    }
    else
    {
      *a3 = DestMax; /*0x56d9*/
    }
  }
  return result; /*0x5834*/
}


// Function: HiiRouteConfigCallback @ 0x5844 (0x26a bytes)

__int64 __fastcall HiiRouteConfigCallback(__int64 a1, __int16 *a2, __int16 **a3)
{
  __int64 result; // rax
  __int16 *v6; // rbx
  __int64 v7; // r8
  unsigned __int64 p_n32_1; // r14
  __int64 v9; // [rsp+30h] [rbp-89h] BYREF
  __int64 v10; // [rsp+38h] [rbp-81h] BYREF
  EFI_GUID n4; // [rsp+40h] [rbp-79h] BYREF
  _BYTE v12[16]; // [rsp+50h] [rbp-69h] BYREF
  CHAR16 Name[80]; // [rsp+60h] [rbp-59h] BYREF
  unsigned int n3; // [rsp+128h] [rbp+6Fh]
  unsigned __int64 p_n32; // [rsp+138h] [rbp+7Fh] BYREF

  v9 = 0; /*0x585e*/
  if ( !a2 ) /*0x586d*/
  {
    *a3 = 0; /*0x586f*/
    return 0x8000000000000002uLL; /*0x587c*/
  }
  result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CA80, 0, &v10); /*0x5896*/
  if ( result < 0 ) /*0x589f*/
    return result; /*0x589f*/
  if ( StrnCmp((unsigned __int64)a2, L"GUID=", 0xAu) ) /*0x58b8*/
  {
    *a3 = a2; /*0x58c2*/
    return 0x8000000000000002uLL; /*0x58c5*/
  }
  if ( HiiParseRoutingData(a2, (__int64)v12) < 0 ) /*0x58d6*/
    return 0x800000000000000EuLL; /*0x58e2*/
  p_n32 = 32; /*0x58f3*/
  HiiParseGuidString((__int64)(a2 + 5), 0x20u, &n4); /*0x58fb*/
  v6 = a2 + 37; /*0x5900*/
  if ( a2[37] != 38 )
  {
    DebugPrintErrorLevel(0x80000000LL, "HII Route Config: Guid extraction failed\n");
LABEL_11:
    *a3 = v6; /*0x591b*/
    return 0x8000000000000002uLL; /*0x591e*/
  }
  if ( StrnCmp((unsigned __int64)(a2 + 38), L"NAME=", 0xAu) ) /*0x5931*/
    goto LABEL_11; /*0x5939*/
  p_n32 = 80; /*0x593f*/
  HiiParseNameValuePairs((__int64)(a2 + 43), &p_n32, Name); /*0x5952*/
  v6 = &a2[4 * p_n32 + 43]; /*0x595b*/
  if ( *v6 != 38 )
  {
    DebugPrintErrorLevel(0x80000000LL, "HII Route Config: Name extraction failed\n");
    goto LABEL_11; /*0x596c*/
  }
  p_n32 = 0; /*0x596e*/
  if ( (__int64)GetVariable(Name, &n4) >= 0 ) /*0x5995*/
  {
    v7 = v9; /*0x59c3*/
    p_n32_1 = p_n32; /*0x59c8*/
  }
  else
  {
    v7 = 0; /*0x59ab*/
    n3 = 3; /*0x59ae*/
    p_n32_1 = 0; /*0x59b5*/
    v9 = 0; /*0x59b8*/
    p_n32 = 0; /*0x59bd*/
  }
  for ( result = (*(__int64 (__fastcall **)(__int64, __int16 *, __int64, unsigned __int64 *, __int16 **))(v10 + 32))( /*0x59e0*/
                   v10,
                   a2,
                   v7,
                   &p_n32,
                   a3);
        ;
        result = (*(__int64 (__fastcall **)(__int64, __int16 *, __int64, unsigned __int64 *, __int16 **))(v10 + 32))(
                   v10,
                   a2,
                   v9,
                   &p_n32,
                   a3) )
  {
    if ( result == 0x8000000000000007uLL ) /*0x59ff*/
      goto LABEL_22; /*0x59ff*/
    if ( result != 0x8000000000000002uLL ) /*0x5a04*/
      break; /*0x5a04*/
    if ( v9 ) /*0x5a09*/
      return result; /*0x5a09*/
LABEL_22:
    if ( v9 ) /*0x5a12*/
      (*(void (__fastcall **)(__int64))(BootServices + 72))(v9); /*0x5a1b*/
    result = (*(__int64 (__fastcall **)(__int64, unsigned __int64, __int64 *))(BootServices + 64))(4, p_n32, &v9); /*0x5a33*/
    if ( result < 0 ) /*0x5a39*/
      return result; /*0x5a39*/
    p_n32_1 = p_n32; /*0x5a4c*/
  }
  if ( result >= 0 ) /*0x5a60*/
  {
    (*(void (__fastcall **)(CHAR16 *, EFI_GUID *, _QWORD, unsigned __int64, __int64))(RuntimeServices + 88))( /*0x5a82*/
      Name,
      &n4,
      n3,
      p_n32_1,
      v9);
    (*(void (__fastcall **)(__int64))(BootServices + 72))(v9); /*0x5a91*/
    return 0; /*0x5a94*/
  }
  return result; /*0x5aa6*/
}


// Function: ReFlashInstallProtocol @ 0x5abc (0x1af bytes)

__int64 ReFlashInstallProtocol(__int64 a1, __int64 a2, __int64 a3, ...)
{
  __int64 v3; // rdi
  _UNKNOWN **v4; // rbx
  _UNKNOWN **v7; // rdi
  _QWORD *v8; // rax
  _QWORD *v9; // rax
  _QWORD *v10; // rax
  __int64 v11; // rax
  __int64 v12; // rcx
  __int64 v13; // rdx
  __int64 v14; // rax
  __int128 v15; // xmm0
  __int64 v16; // rbx
  __int64 result; // rax
  __int64 v18; // [rsp+70h] [rbp+18h] BYREF
  __int64 v19; // [rsp+78h] [rbp+20h] BYREF
  va_list va; // [rsp+78h] [rbp+20h]
  _QWORD *v21; // [rsp+80h] [rbp+28h]
  _QWORD *v22; // [rsp+88h] [rbp+30h]
  va_list va1; // [rsp+90h] [rbp+38h] BYREF

  va_start(va1, a3);
  va_start(va, a3);
  v19 = va_arg(va1, _QWORD); /*0x5abc*/
  v21 = va_arg(va1, _QWORD *); /*0x5abc*/
  v22 = va_arg(va1, _QWORD *); /*0x5abc*/
  v18 = 0; /*0x5ae5*/
  v3 = 0; /*0x5ae9*/
  v4 = &off_C8D0; /*0x5aec*/
  do /*0x5b1c*/
  {
    if ( *v4 && !StrnCmp(a2 + 2, *v4, 16) ) /*0x5b07*/
      break; /*0x5b0f*/
    ++v3; /*0x5b11*/
    v4 += 4; /*0x5b14*/
  }
  while ( !v3 ); /*0x5b1c*/
  if ( v3 == 1 ) /*0x5b29*/
  {
    v7 = (_UNKNOWN **)&unk_CB38; /*0x5b2b*/
  }
  else
  {
    v7 = &off_C8D0 + 4 * v3; /*0x5b34*/
    v8 = v7[1]; /*0x5b37*/
    if ( v8 ) /*0x5b3e*/
    {
      if ( !*v8 ) /*0x5b4d*/
        *v8 = HiiExtractConfigCallback; /*0x5b59*/
      v9 = v7[1]; /*0x5b5c*/
      if ( !v9[1] ) /*0x5b60*/
        v9[1] = HiiRouteConfigCallback; /*0x5b6d*/
      v10 = v7[1]; /*0x5b71*/
      if ( !v10[2] ) /*0x5b75*/
        v10[2] = HiiUnsupportedCallback; /*0x5b82*/
    }
    else
    {
      v7[1] = off_CA40; /*0x5b47*/
    }
  }
  v11 = (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices + 152))( /*0x5b9d*/
          *(_QWORD *)(a1 + 24),
          &unk_CB78,
          (__int64 *)va);
  v12 = v19; /*0x5ba3*/
  v13 = *(_QWORD *)(a1 + 32); /*0x5bab*/
  if ( v11 < 0 ) /*0x5baf*/
    v12 = 0; /*0x5baf*/
  v19 = v12; /*0x5bb3*/
  v14 = ReFlashFlashMapAppend(v12, v13); /*0x5bb8*/
  v15 = *(_OWORD *)(a2 + 2); /*0x5bbd*/
  v19 = v14; /*0x5bc8*/
  xmmword_CA5C = v15; /*0x5bd0*/
  v16 = ReFlashFlashMapAppend(v14, &unk_CA58); /*0x5be4*/
  (*(void (__fastcall **)(__int64))(BootServices + 72))(v19); /*0x5bec*/
  result = (*(__int64 (__fastcall **)(__int64 *, void *, __int64, void *, void *, _QWORD))(BootServices + 328))( /*0x5c1b*/
             &v18,
             &unk_CB78,
             v16,
             &unk_CA90,
             v7[1],
             0);
  if ( result >= 0 ) /*0x5c24*/
  {
    if ( v22 ) /*0x5c31*/
      *v22 = v18; /*0x5c38*/
    if ( v21 ) /*0x5c46*/
    {
      if ( v7 == (_UNKNOWN **)&unk_CB38 ) /*0x5c4b*/
        v7 = 0; /*0x5c4b*/
      *v21 = v7; /*0x5c4f*/
    }
    return 0; /*0x5c52*/
  }
  return result; /*0x5c5e*/
}


// Function: InternalGetBestLanguage @ 0x5c6c (0x135 bytes)

char *__fastcall InternalGetBestLanguage(char *PackageList, char *Language, char *en_US, char *a4)
{
  char *Language_2; // rdx
  char *PackageList_4; // rbx
  char **p_Language; // r10
  char *PackageList_1; // rcx
  char *PackageList_3; // rsi
  char v11; // r11
  char *PackageList_2; // rdi
  char *Language_3; // r8
  char n59; // al
  char *PackageList_5; // rax
  unsigned __int64 n8; // rbx
  char *ReservedPool; // rax
  char *ReservedPool_1; // rdi
  char *PackageList_6; // [rsp+20h] [rbp-38h]
  char *Language_1; // [rsp+68h] [rbp+10h] BYREF
  char *en_US_1; // [rsp+70h] [rbp+18h]
  char *v22; // [rsp+78h] [rbp+20h]

  Language_1 = Language; /*0x5c73*/
  en_US_1 = en_US; /*0x5c77*/
  v22 = a4; /*0x5c7b*/
  if ( !PackageList ) /*0x5c8e*/
    return 0; /*0x5c8e*/
  Language_2 = Language_1; /*0x5c97*/
  PackageList_4 = PackageList_6; /*0x5c9c*/
  if ( Language_1 ) /*0x5ca4*/
  {
    p_Language = &Language_1; /*0x5caa*/
    while ( 1 ) /*0x5cb5*/
    {
      PackageList_1 = PackageList; /*0x5cb5*/
      PackageList_3 = 0; /*0x5cb8*/
      do /*0x5d3f*/
      {
        v11 = 0; /*0x5cba*/
        PackageList_2 = PackageList_1; /*0x5cbd*/
        Language_3 = Language_2; /*0x5cc0*/
        if ( *Language_2 ) /*0x5cc3*/
        {
          n59 = *Language_2; /*0x5cc8*/
          do /*0x5cec*/
          {
            if ( n59 == 59 ) /*0x5ccc*/
              break; /*0x5ccc*/
            if ( n59 == 45 ) /*0x5cd4*/
              v11 = 1; /*0x5cd4*/
            if ( n59 != *PackageList_1 ) /*0x5cda*/
              break; /*0x5cda*/
            if ( !*PackageList_1 ) /*0x5cdf*/
              goto LABEL_19; /*0x5cdf*/
            if ( *PackageList_1 == 59 ) /*0x5ce4*/
              break; /*0x5ce4*/
            ++Language_3; /*0x5ce6*/
            ++PackageList_1; /*0x5ce9*/
            n59 = *Language_3; /*0x5cec*/
          }
          while ( *Language_3 ); /*0x5cec*/
        }
        while ( *PackageList_1 && *PackageList_1 != 59 ) /*0x5cf7*/
          ++PackageList_1; /*0x5cf9*/
LABEL_19:
        if ( (v11 || !*Language_3 || *Language_3 == 59) && Language_3 - Language_2 > 0 ) /*0x5d1b*/
        {
          PackageList_3 = PackageList_2; /*0x5d1d*/
          PackageList_4 = PackageList_1; /*0x5d20*/
        }
        PackageList_5 = PackageList_1 + 1; /*0x5d26*/
        if ( *PackageList_1 != 59 ) /*0x5d2a*/
          PackageList_5 = PackageList_1; /*0x5d2a*/
        PackageList_1 = PackageList_5; /*0x5d2e*/
      }
      while ( *PackageList_5 && *Language_3 && *Language_3 != 59 ); /*0x5d3f*/
      if ( PackageList_3 ) /*0x5d48*/
        break; /*0x5d48*/
      Language_2 = *++p_Language; /*0x5d4e*/
      if ( !*p_Language ) /*0x5d4e*/
        goto LABEL_33; /*0x5d54*/
    }
  }
  else
  {
    PackageList_3 = PackageList_6; /*0x5d5c*/
LABEL_33:
    if ( !PackageList_3 ) /*0x5d64*/
      return 0; /*0x5d64*/
  }
  n8 = PackageList_4 - PackageList_3; /*0x5d6a*/
  ReservedPool = (char *)AllocateReservedPool(n8 + 1); /*0x5d71*/
  ReservedPool_1 = ReservedPool; /*0x5d76*/
  if ( !ReservedPool ) /*0x5d7c*/
    return 0; /*0x5c92*/
  InternalCopyMemOverlap(ReservedPool, PackageList_3, n8); /*0x5d8b*/
  ReservedPool_1[n8] = 0; /*0x5d93*/
  return ReservedPool_1; /*0x5d97*/
}


// Function: ReFlashGetPackageList @ 0x5da4 (0xbf bytes)

void *__fastcall ReFlashGetPackageList(__int64 a1)
{
  __int64 v3; // rax
  void *ReservedPool; // rbx
  UINTN AllocationSize; // [rsp+30h] [rbp+8h] BYREF

  AllocationSize = 0; /*0x5dae*/
  if ( !a1 ) /*0x5dba*/
    return 0; /*0x5dba*/
  v3 = qword_D2E0; /*0x5dc3*/
  if ( !qword_D2E0 ) /*0x5dcd*/
  {
    if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CA70, 0, &qword_D2E0) < 0 ) /*0x5def*/
      return 0; /*0x5dbe*/
    v3 = qword_D2E0; /*0x5df1*/
  }
  if ( (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, UINTN *))(v3 + 24))(v3, a1, 0, &AllocationSize) != 0x8000000000000005uLL ) /*0x5e16*/
    return 0; /*0x5e16*/
  ReservedPool = AllocateReservedPool(AllocationSize); /*0x5e37*/
  if ( (*(__int64 (__fastcall **)(__int64, __int64, void *, UINTN *))(qword_D2E0 + 24))( /*0x5e41*/
         qword_D2E0,
         a1,
         ReservedPool,
         &AllocationSize) < 0 )
  {
    (*(void (__fastcall **)(void *))(BootServices + 72))(ReservedPool); /*0x5e4d*/
    return 0; /*0x5e50*/
  }
  return ReservedPool; /*0x5e5d*/
}


// Function: HiiSetStringNew @ 0x5e64 (0xb6 bytes)

__int64 __fastcall HiiSetStringNew(
        char *i,
        __int64 a2,
        __int64 a3,
        unsigned __int16 n48,
        __int64 *p_n29,
        __int64 DmiVar%02x%04x%02x%02x)
{
  __int64 v7; // rsi
  char *j; // rbx
  char v10; // di
  __int64 result; // rax

  v7 = qword_D2E0; /*0x5e86*/
  if ( !*i ) /*0x5e7f*/
    return a2; /*0x5efc*/
  do /*0x5ef5*/
  {
    for ( j = i; *j != 59; ++j ) /*0x5ea8*/
    {
      if ( !*j ) /*0x5eaa*/
        break; /*0x5ead*/
    }
    v10 = *j; /*0x5ec0*/
    *j = 0; /*0x5ed7*/
    result = (*(__int64 (__fastcall **)(__int64, char *, __int64, _QWORD, __int64, __int64 *, _QWORD))(v7 + 8))( /*0x5eda*/
               v7,
               i,
               a3,
               n48,
               DmiVar%02x%04x%02x%02x,
               p_n29,
               0);
    if ( result != 0x8000000000000020uLL ) /*0x5eea*/
      break; /*0x5eea*/
    if ( !v10 ) /*0x5eef*/
      break; /*0x5eef*/
    i = j + 1; /*0x5ef1*/
  }
  while ( j[1] ); /*0x5ef5*/
  return result; /*0x5f0e*/
}


// Function: ReFlashInternalGetHiiString @ 0x5f1c (0x142 bytes)

__int64 __fastcall ReFlashInternalGetHiiString(__int64 a1, __int64 n48, __int64 *p_n29, __int64 DmiVar%02x%04x%02x%02x)
{
  unsigned __int16 n48_1; // r15
  char *Language; // rbx
  char *PackageList; // rax
  char *PackageList_1; // rdi
  char *BestLanguage; // r12
  __int64 v13; // rbx
  __int64 v14; // rdx

  n48_1 = n48; /*0x5f47*/
  if ( !qword_D2E0 /*0x5f70*/
    && (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CA70, 0, &qword_D2E0) < 0 )
  {
    return 0x800000000000000EuLL; /*0x5f70*/
  }
  Language = (char *)ReFlashGetLanguage(); /*0x5f89*/
  PackageList = (char *)ReFlashGetPackageList(a1); /*0x5f8c*/
  PackageList_1 = PackageList; /*0x5f91*/
  if ( !PackageList ) /*0x5f97*/
    return 0x800000000000000EuLL; /*0x5f72*/
  BestLanguage = InternalGetBestLanguage(PackageList, Language, "en-US", "en-US"); /*0x5fb9*/
  if ( BestLanguage ) /*0x5fbf*/
  {
    v13 = (*(__int64 (__fastcall **)(__int64, char *, __int64, _QWORD, __int64, __int64 *, _QWORD))(qword_D2E0 + 8))( /*0x5ffe*/
            qword_D2E0,
            BestLanguage,
            a1,
            n48_1,
            DmiVar%02x%04x%02x%02x,
            p_n29,
            0);
    (*(void (__fastcall **)(char *))(BootServices + 72))(BestLanguage); /*0x6001*/
    if ( v13 == 0x8000000000000020uLL ) /*0x6011*/
      v13 = HiiSetStringNew(PackageList_1, v14, a1, n48_1, p_n29, DmiVar%02x%04x%02x%02x); /*0x602c*/
  }
  else
  {
    v13 = 0x800000000000000EuLL; /*0x5fc1*/
  }
  (*(void (__fastcall **)(char *))(BootServices + 72))(PackageList_1); /*0x6039*/
  return v13; /*0x6053*/
}


// Function: ReFlashSetProgress @ 0x6060 (0x145 bytes)

__int64 __fastcall ReFlashSetProgress(__int64 a1, unsigned __int16 n47, wchar_t *________________)
{
  __int64 v4; // rax
  __int64 result; // rax
  _BYTE *ReservedPool; // rdi
  __int64 v9; // rsi
  _BYTE *i; // rbx
  _BYTE *i_1; // r9
  char v12; // r14
  UINTN AllocationSize; // [rsp+78h] [rbp+20h] BYREF

  AllocationSize = 0; /*0x6076*/
  v4 = qword_D2E0; /*0x607f*/
  if ( !qword_D2E0 ) /*0x6090*/
  {
    if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CA70, 0, &qword_D2E0) < 0 ) /*0x60b2*/
      return 0x800000000000000EuLL; /*0x60be*/
    v4 = qword_D2E0; /*0x60c3*/
  }
  result = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, UINTN *))(v4 + 24))(v4, a1, 0, &AllocationSize); /*0x60d8*/
  if ( result == 0x8000000000000005uLL ) /*0x60e8*/
  {
    ReservedPool = AllocateReservedPool(AllocationSize); /*0x610d*/
    v9 = (*(__int64 (__fastcall **)(__int64, __int64, _BYTE *, UINTN *))(qword_D2E0 + 24))( /*0x6114*/
           qword_D2E0,
           a1,
           ReservedPool,
           &AllocationSize);
    if ( v9 >= 0 ) /*0x611a*/
    {
      for ( i = ReservedPool; i < &ReservedPool[AllocationSize]; *i++ = v12 ) /*0x612a*/
      {
        i_1 = i; /*0x612c*/
        while ( *i != 59 && *i ) /*0x6134*/
          ++i; /*0x6136*/
        v12 = *i; /*0x613e*/
        *i = 0; /*0x614e*/
        v9 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, _BYTE *, wchar_t *, _QWORD))(qword_D2E0 + 16))( /*0x6163*/
               qword_D2E0,
               a1,
               n47,
               i_1,
               ________________,
               0);
        if ( v9 < 0 ) /*0x6169*/
          break; /*0x6169*/
      }
    }
    (*(void (__fastcall **)(_BYTE *))(BootServices + 72))(ReservedPool); /*0x6188*/
    return v9; /*0x618b*/
  }
  return result; /*0x6198*/
}


// Function: ReFlashReadHiiConfig @ 0x61a8 (0x182 bytes)

__int64 __fastcall ReFlashReadHiiConfig(__int64 *p_n7, __int64 a2, __int64 n100, __int64 TotalBlocks)
{
  __int64 v5; // rax
  __int64 result; // rax
  __int64 n7_1; // rbx
  CHAR16 *ReservedPool; // rsi
  UINTN _GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_; // rax
  __int64 v11; // r9
  __int64 v12; // rbx
  __int64 n100_1; // [rsp+70h] [rbp+18h] BYREF
  __int64 n7; // [rsp+78h] [rbp+20h] BYREF

  n100_1 = n100; /*0x61b3*/
  n7 = 0; /*0x61c2*/
  v5 = qword_D2C8; /*0x61ca*/
  if ( !qword_D2C8 ) /*0x61d7*/
  {
    if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *, __int64))(BootServices + 320))( /*0x61f9*/
           &unk_CAA0,
           0,
           &qword_D2C8,
           TotalBlocks) < 0 )
      return 0x800000000000000EuLL; /*0x6205*/
    v5 = qword_D2C8; /*0x620a*/
  }
  if ( !qword_D2D0 ) /*0x6219*/
  {
    if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *, __int64))(BootServices + 320))( /*0x623b*/
           &unk_CA80,
           0,
           &qword_D2D0,
           TotalBlocks) < 0 )
      return 0x800000000000000EuLL; /*0x623b*/
    v5 = qword_D2C8; /*0x623d*/
  }
  LOBYTE(TotalBlocks) = 1; /*0x624b*/
  result = (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD, __int64, void *, const wchar_t *))(v5 + 8))( /*0x626a*/
             v5,
             &n7,
             0,
             TotalBlocks,
             &unk_C8F0,
             L"Setup");
  if ( result == 0x8000000000000005uLL ) /*0x627a*/
  {
    n7_1 = n7; /*0x6280*/
    ReservedPool = (CHAR16 *)AllocateReservedPool(n7 + 112); /*0x629f*/
    _GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_ = UnicodeSPrintAsciiFormat( /*0x62a6*/
                                                                   ReservedPool,
                                                                   n7_1 + 112,
                                                                   L"%s",
                                                                   aGuid0000000000);// "GUID=00000000000000000000000000000000&NAME=0000&PATH=00&"
    LOBYTE(v11) = 1; /*0x62b5*/
    v12 = (*(__int64 (__fastcall **)(__int64, __int64 *, CHAR16 *, __int64, void *, const wchar_t *))(qword_D2C8 + 8))( /*0x62ce*/
            qword_D2C8,
            &n7,
            &ReservedPool[_GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_],
            v11,
            &unk_C8F0,
            L"Setup");
    if ( v12 >= 0 ) /*0x62d4*/
    {
      n7 = *p_n7; /*0x62dc*/
      v12 = (*(__int64 (__fastcall **)(__int64, CHAR16 *, __int64, __int64 *, __int64 *))(qword_D2D0 + 32))( /*0x62fe*/
              qword_D2D0,
              ReservedPool,
              a2,
              p_n7,
              &n100_1);
      *p_n7 = n7; /*0x6306*/
    }
    (*(void (__fastcall **)(CHAR16 *))(BootServices + 72))(ReservedPool); /*0x6313*/
    return v12; /*0x6316*/
  }
  return result; /*0x631e*/
}


// Function: ReFlashWriteHiiConfig @ 0x632c (0x219 bytes)

__int64 __fastcall ReFlashWriteHiiConfig(__int64 n7, __int64 a2, _WORD *i, __int64 a4)
{
  __int64 v6; // rax
  __int64 result; // rax
  UINTN BufferSize; // r14
  CHAR16 *ReservedPool; // rbx
  UINTN _GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_; // rax
  __int64 v11; // r9
  __int64 v12; // rdi
  unsigned int n2; // ecx
  _WORD *j; // rax
  char v15[72]; // [rsp+30h] [rbp-48h] BYREF
  _WORD *i_1; // [rsp+90h] [rbp+18h] BYREF
  __int64 n2_1; // [rsp+98h] [rbp+20h] BYREF

  i_1 = i; /*0x6337*/
  n2_1 = 0; /*0x6350*/
  v6 = qword_D2C8; /*0x6357*/
  if ( !qword_D2C8 ) /*0x6361*/
  {
    if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CAA0, 0, &qword_D2C8) < 0 ) /*0x6383*/
      return 0x800000000000000EuLL; /*0x638f*/
    v6 = qword_D2C8; /*0x6394*/
  }
  if ( !qword_D2D0 ) /*0x63a2*/
  {
    if ( (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_CA80, 0, &qword_D2D0) < 0 ) /*0x63c4*/
      return 0x800000000000000EuLL; /*0x63c4*/
    v6 = qword_D2C8; /*0x63c6*/
  }
  LOBYTE(a4) = 1; /*0x63d4*/
  result = (*(__int64 (__fastcall **)(__int64, __int64 *, _QWORD, __int64, void *, const wchar_t *))(v6 + 8))( /*0x63f6*/
             v6,
             &n2_1,
             0,
             a4,
             &unk_C8F0,
             L"Setup");
  if ( result == 0x8000000000000005uLL ) /*0x6406*/
  {
    BufferSize = n2_1 + 112; /*0x6414*/
    ReservedPool = (CHAR16 *)AllocateReservedPool(n2_1 + 112); /*0x6434*/
    _GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_ = UnicodeSPrintAsciiFormat( /*0x6437*/
                                                                   ReservedPool,
                                                                   BufferSize,
                                                                   L"%s",
                                                                   aGuid0000000000);// "GUID=00000000000000000000000000000000&NAME=0000&PATH=00&"
    LOBYTE(v11) = 1; /*0x6449*/
    v12 = (*(__int64 (__fastcall **)(__int64, __int64 *, CHAR16 *, __int64, void *, const wchar_t *))(qword_D2C8 + 8))( /*0x6462*/
            qword_D2C8,
            &n2_1,
            &ReservedPool[_GUID_00000000000000000000000000000000&NAME_0000&PATH_00&_],
            v11,
            &unk_C8F0,
            L"Setup");
    if ( v12 >= 0 ) /*0x646b*/
    {
      ReFlashStripHiiConfigValues((char *)ReservedPool, BufferSize); /*0x647f*/
      v12 = (*(__int64 (__fastcall **)(__int64, CHAR16 *, __int64, __int64, _WORD **, char *))(qword_D2D0 + 24))( /*0x64b1*/
              qword_D2D0,
              ReservedPool,
              a2,
              n7,
              &i_1,
              v15);
      if ( v12 >= 0 ) /*0x64b7*/
      {
        n2 = 2; /*0x64c1*/
        for ( j = i_1; *j; n2 += 2 ) /*0x64c9*/
          ++j; /*0x64cf*/
        n2_1 = n2; /*0x64e6*/
        v12 = (*(__int64 (__fastcall **)(__int64, __int64 *, _WORD *, _QWORD, void *, const wchar_t *))(qword_D2C8 + 8))( /*0x6510*/
                qword_D2C8,
                &n2_1,
                i_1,
                0,
                &unk_C8F0,
                L"Setup");
        (*(void (__fastcall **)(_WORD *))(BootServices + 72))(i_1); /*0x651a*/
      }
      (*(void (__fastcall **)(CHAR16 *))(BootServices + 72))(ReservedPool); /*0x6527*/
    }
    else
    {
      (*(void (__fastcall **)(CHAR16 *))(BootServices + 72))(ReservedPool); /*0x6474*/
    }
    return v12; /*0x652a*/
  }
  return result; /*0x6535*/
}


// Function: ReFlashFindConfigTable @ 0x6548 (0x5e bytes)

__int64 __fastcall ReFlashFindConfigTable(__int64 SystemTable, GUID *ImageHandle)
{
  __int64 v3; // rdi
  unsigned __int64 v4; // rbx

  v3 = *(_QWORD *)(::SystemTable + 104); /*0x6561*/
  v4 = *(_QWORD *)(::SystemTable + 112); /*0x6565*/
  if ( !v3 ) /*0x656c*/
    return 0; /*0x658e*/
  while ( StrnCmp(v4, ImageHandle, 0x10u) ) /*0x6582*/
  {
    v4 += 24LL; /*0x6584*/
    if ( !--v3 ) /*0x658c*/
      return 0; /*0x658c*/
  }
  return *(_QWORD *)(v4 + 16); /*0x659a*/
}


// Function: ReFlashInitConsole @ 0x65a8 (0xe1 bytes)

__int64 ReFlashInitConsole()
{
  __int64 v1; // rcx
  unsigned __int64 n0x10; // rbx
  __int64 v3; // rax

  if ( byte_D300 ) /*0x65bb*/
  {
    if ( qword_D308 ) /*0x65c4*/
      return 0; /*0x65c8*/
    if ( !qword_D310 ) /*0x65d7*/
      return 0x8000000000000003uLL; /*0x65d7*/
    v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(qword_D310 + 208))(&unk_C760, 0, &qword_D308); /*0x65fe*/
    if ( v1 < 0 ) /*0x6604*/
      qword_D308 = 0; /*0x6606*/
  }
  else
  {
    if ( qword_D318 ) /*0x6616*/
      return 0; /*0x6616*/
    if ( byte_D301 == 1 ) /*0x661f*/
      return 0x8000000000000003uLL; /*0x661f*/
    n0x10 = (*(__int64 (__fastcall **)(__int64))(BootServices + 24))(31); /*0x663a*/
    (*(void (__fastcall **)(unsigned __int64))(BootServices + 32))(n0x10); /*0x663d*/
    if ( n0x10 > 0x10 ) /*0x6644*/
      return 0x8000000000000003uLL; /*0x65e3*/
    v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices + 320))(&unk_C6C0, 0, &qword_D318); /*0x6663*/
    v3 = qword_D318; /*0x6666*/
    if ( v1 < 0 ) /*0x6670*/
      v3 = 0; /*0x6670*/
    qword_D318 = v3; /*0x6674*/
  }
  return v1; /*0x6683*/
}


// Function: DebugPrintErrorLevel @ 0x668c (0x8a bytes)

__int64 DebugPrintErrorLevel(__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); /*0x668c*/
  v10 = va_arg(va1, _QWORD); /*0x668c*/
  result = ReFlashInitConsole(); /*0x66a3*/
  if ( result >= 0 ) /*0x66ae*/
  {
    result = DebugLibGetDebugMask(); /*0x66c6*/
    if ( v4 ) /*0x66ce*/
    {
      if ( ((unsigned int)a1 & (unsigned int)result) != 0 ) /*0x66d2*/
      {
        HII_Extract_Config:_Guid_extraction_failed_n_1 = HII_Extract_Config:_Guid_extraction_failed_n; /*0x66d4*/
        if ( *HII_Extract_Config:_Guid_extraction_failed_n != v5 ) /*0x66dc*/
        {
          do /*0x66fe*/
          {
            if ( *HII_Extract_Config:_Guid_extraction_failed_n_1 == 37 ) /*0x66e1*/
            {
              if ( *++HII_Extract_Config:_Guid_extraction_failed_n_1 == 115 ) /*0x66e9*/
              {
                *HII_Extract_Config:_Guid_extraction_failed_n_1 = 97; /*0x66eb*/
              }
              else if ( *HII_Extract_Config:_Guid_extraction_failed_n_1 == 71 ) /*0x66f3*/
              {
                *HII_Extract_Config:_Guid_extraction_failed_n_1 = 103; /*0x66f5*/
              }
            }
            ++HII_Extract_Config:_Guid_extraction_failed_n_1; /*0x66f8*/
          }
          while ( *HII_Extract_Config:_Guid_extraction_failed_n_1 != v5 ); /*0x66fe*/
          HII_Extract_Config:_Guid_extraction_failed_n_1 = HII_Extract_Config:_Guid_extraction_failed_n; /*0x6700*/
        }
        return (*v4)(a1, HII_Extract_Config:_Guid_extraction_failed_n_1, (__int64 *)va); /*0x670d*/
      }
    }
  }
  return result; /*0x6710*/
}


// Function: AllocateReservedPool @ 0x6718 (0x2b bytes)

void *__cdecl AllocateReservedPool(UINTN AllocationSize)
{
  void *v2; // [rsp+38h] [rbp+10h] BYREF

  v2 = 0; /*0x6728*/
  (*(void (__fastcall **)(__int64, UINTN, void **))(BootServices + 64))(4, AllocationSize, &v2); /*0x6736*/
  return v2; /*0x673e*/
}


// Function: AllocateCopyPool @ 0x6744 (0x3e bytes)

void *__cdecl AllocateCopyPool(UINTN AllocationSize, const void *Buffer)
{
  void *result; // rax
  void *v4; // rbx

  result = AllocateReservedPool(AllocationSize); /*0x6751*/
  v4 = result; /*0x6756*/
  if ( result ) /*0x675c*/
  {
    (*(void (__fastcall **)(void *, UINTN, _QWORD))(BootServices + 360))(result, AllocationSize, 0); /*0x676e*/
    return v4; /*0x6774*/
  }
  return result; /*0x677c*/
}


// Function: ReFlashFlashMapGetSize @ 0x6784 (0x52 bytes)

__int64 __fastcall ReFlashFlashMapGetSize(_BYTE *src)
{
  _BYTE *src_1; // rdx
  __int64 v3; // r8
  __int64 v4; // r10

  src_1 = src; /*0x6784*/
  if ( !src ) /*0x678a*/
    return 0; /*0x678c*/
  v3 = 0; /*0x678f*/
  while ( 1 ) /*0x6792*/
  {
    if ( *src_1 == 127 && src_1[1] == 0xFF ) /*0x679b*/
      return v3 + 4; /*0x67d1*/
    v4 = (unsigned __int8)src_1[2]; /*0x67a2*/
    if ( !*src_1 || !((_DWORD)v4 + ((unsigned __int8)src_1[3] << 8)) ) /*0x67ad*/
      break; /*0x67ad*/
    v3 += (unsigned int)v4 + ((unsigned __int8)src_1[3] << 8); /*0x67bb*/
    src_1 += 256 * (unsigned __int64)(unsigned __int8)src_1[3] + v4; /*0x67c8*/
  }
  return v3; /*0x678e*/
}


// Function: ReFlashFlashMapAppend @ 0x67d8 (0xd5 bytes)

char *__fastcall ReFlashFlashMapAppend(char *src, __int64 src_2)
{
  char *src_1; // rdi
  unsigned __int64 n8; // rbx
  char *ReservedPool; // rax
  char *ReservedPool_1; // r14
  char *ReservedPool_2; // r15

  src_1 = src; /*0x67f4*/
  if ( src_2 ) /*0x67fa*/
  {
    if ( src ) /*0x6815*/
      n8 = ReFlashFlashMapGetSize(src) - 4; /*0x681c*/
    else
      n8 = 0; /*0x6822*/
    ReservedPool = (char *)AllocateReservedPool( /*0x683a*/
                             n8
                           + ((unsigned __int64)*(unsigned __int8 *)(src_2 + 3) << 8)
                           + *(unsigned __int8 *)(src_2 + 2)
                           + 4LL);
    ReservedPool_1 = ReservedPool; /*0x683f*/
    ReservedPool_2 = ReservedPool; /*0x6842*/
    if ( n8 ) /*0x6848*/
    {
      InternalCopyMemOverlap(ReservedPool, src_1, n8); /*0x6853*/
      ReservedPool_2 += n8; /*0x6858*/
    }
    InternalCopyMemOverlap( /*0x6872*/
      ReservedPool_2,
      (char *)src_2,
      *(unsigned __int8 *)(src_2 + 2) + ((unsigned __int64)*(unsigned __int8 *)(src_2 + 3) << 8));
    *(_DWORD *)&ReservedPool_2[256 * (unsigned __int64)*(unsigned __int8 *)(src_2 + 3) + *(unsigned __int8 *)(src_2 + 2)] = dword_CB88; /*0x688c*/
    return ReservedPool_1; /*0x688f*/
  }
  else
  {
    if ( !src ) /*0x67ff*/
      src = (char *)&dword_CB88; /*0x6801*/
    return ReFlashFlashMapClone(src); /*0x6808*/
  }
}


// Function: ReFlashFlashMapClone @ 0x68b0 (0x46 bytes)

char *__fastcall ReFlashFlashMapClone(char *src)
{
  UINTN AllocationSize; // rbx
  char *ReservedPool; // rdi

  AllocationSize = ReFlashFlashMapGetSize(src); /*0x68ca*/
  ReservedPool = (char *)AllocateReservedPool(AllocationSize); /*0x68db*/
  InternalCopyMemOverlap(ReservedPool, src, AllocationSize); /*0x68de*/
  return ReservedPool; /*0x68f0*/
}


// Function: GetVariable @ 0x68f8 (0xbe bytes)

void *__cdecl GetVariable(const CHAR16 *Name, const EFI_GUID *Guid)
{
  __int64 v2; // r8
  UINTN *p_AllocationSize_1; // r9
  UINTN *p_AllocationSize; // rdi
  __int64 v5; // rsi
  void *result; // rax
  void *ReservedPool; // rax
  _QWORD *v10; // [rsp+60h] [rbp+28h]

  p_AllocationSize = p_AllocationSize_1; /*0x6916*/
  v5 = v2; /*0x6919*/
  if ( !*v10 ) /*0x6922*/
    *p_AllocationSize_1 = 0; /*0x6928*/
  result = (void *)(*(__int64 (__fastcall **)(const CHAR16 *))(RuntimeServices + 72))(Name); /*0x693b*/
  if ( result == (void *)0x8000000000000005LL ) /*0x6941*/
  {
    if ( *v10 ) /*0x6952*/
      (*(void (**)(void))(BootServices + 72))(); /*0x6961*/
    ReservedPool = AllocateReservedPool(*p_AllocationSize); /*0x6967*/
    *v10 = ReservedPool; /*0x696c*/
    if ( ReservedPool ) /*0x6972*/
      return (void *)(*(__int64 (__fastcall **)(const CHAR16 *, const EFI_GUID *, __int64, UINTN *, void *))(RuntimeServices + 72))( /*0x6998*/
                       Name,
                       Guid,
                       v5,
                       p_AllocationSize,
                       ReservedPool);
    else
      return (void *)0x8000000000000009LL; /*0x6974*/
  }
  return result; /*0x69af*/
}


// Function: ValueToString @ 0x69b8 (0x71 bytes)

_BYTE *__fastcall ValueToString(__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; /*0x69bb*/
  n_1 = n; /*0x69c1*/
  if ( a4 ) /*0x69c7*/
    v4 = a1; /*0x69c7*/
  if ( (_DWORD)n10 == 10 ) /*0x69cf*/
    v4 = -a1; /*0x69cf*/
  if ( a1 >= 0 ) /*0x69d6*/
    v4 = a1; /*0x69d6*/
  if ( v4 ) /*0x69dd*/
  {
    do /*0x6a04*/
    {
      v6 = v4 / (int)n10; /*0x69e7*/
      n0xA = v4 % (int)n10; /*0x69e7*/
      v4 = v6; /*0x69ea*/
      if ( n0xA >= 0xA ) /*0x69f1*/
        v8 = n0xA + 87; /*0x69f8*/
      else
        v8 = n0xA + 48; /*0x69f3*/
      *n_1++ = v8; /*0x69fb*/
    }
    while ( v6 ); /*0x6a04*/
  }
  else
  {
    *n = 48; /*0x6a08*/
    n_1 = n + 1; /*0x6a0b*/
  }
  if ( (_DWORD)n10 == 10 && a1 < 0 ) /*0x6a17*/
    *n_1++ = 45; /*0x6a19*/
  *n_1 = 0; /*0x6a20*/
  return n_1 - 1; /*0x6a28*/
}


// Function: AsciiStrDecimalToUintn @ 0x6a2c (0xd7 bytes)

__int64 __fastcall AsciiStrDecimalToUintn(const CHAR8 *FormatString, const CHAR8 **p_FormatString, int n32)
{
  char v3; // r10
  char v4; // r9
  unsigned int n0x7FFFFFFF; // r8d
  const CHAR8 *FormatString_1; // rdx
  CHAR8 v9; // cl
  char n10; // cl

  v3 = 0; /*0x6a36*/
  v4 = 1; /*0x6a3e*/
  n0x7FFFFFFF = 0; /*0x6a41*/
  while ( *FormatString == 32 || *FormatString == 9 ) /*0x6a4f*/
    FormatString += 2; /*0x6a51*/
  if ( *FormatString ) /*0x6a57*/
  {
    if ( *FormatString == 45 ) /*0x6a69*/
    {
      v4 = -1; /*0x6a6b*/
      FormatString += 2; /*0x6a6e*/
    }
    FormatString_1 = FormatString + 2; /*0x6a75*/
    if ( *FormatString != 43 ) /*0x6a79*/
      FormatString_1 = FormatString; /*0x6a79*/
    while ( 1 ) /*0x6a7d*/
    {
      v9 = *FormatString_1; /*0x6a7d*/
      if ( (unsigned __int8)(*FormatString_1 - 48) > 9u ) /*0x6a84*/
      {
        if ( (unsigned __int8)((v9 & 0xDF) - 65) > 0x19u ) /*0x6a93*/
          break; /*0x6a93*/
        n10 = (v9 & 0xDF) - 55; /*0x6a98*/
      }
      else
      {
        n10 = v9 - 48; /*0x6a86*/
      }
      if ( n10 >= 10 ) /*0x6aa3*/
        break; /*0x6aa3*/
      n0x7FFFFFFF = n10 + 10 * n0x7FFFFFFF; /*0x6aa9*/
      if ( v4 == 1 ) /*0x6ab0*/
      {
        if ( n0x7FFFFFFF >= 0x80000000 ) /*0x6ab9*/
          v3 = 1; /*0x6abb*/
      }
      else if ( n0x7FFFFFFF > 0x80000000 ) /*0x6acb*/
      {
        v3 = 1; /*0x6acb*/
      }
      FormatString_1 += 2; /*0x6acf*/
    }
    *p_FormatString = FormatString_1; /*0x6ad5*/
    if ( v3 ) /*0x6adb*/
    {
      n0x7FFFFFFF = 0x7FFFFFFF; /*0x6ae6*/
      if ( v4 == -1 ) /*0x6aec*/
        n0x7FFFFFFF = 0x80000000; /*0x6aec*/
    }
    return n0x7FFFFFFF * v4; /*0x6af4*/
  }
  else
  {
    *p_FormatString = FormatString; /*0x6a5d*/
    return 0; /*0x6a60*/
  }
}


// Function: StatusToString @ 0x6b04 (0xc7 bytes)

const char *__fastcall StatusToString(unsigned __int64 n4, __int64 n37, __int64 n32)
{
  __int64 v4; // rax
  char *EFI_INTERRUPT_PENDING; // rcx
  unsigned __int64 n3; // rdx

  if ( !n4 ) /*0x6b07*/
    return "EFI_SUCCESS"; /*0x6b10*/
  if ( (n4 & 0x8000000000000000uLL) != 0LL ) /*0x6b11*/
  {
    n3 = n4 & 0x1FFFFFFFFFFFFFFFLL; /*0x6b65*/
    if ( (n4 & 0xA000000000000000uLL) == 0xA000000000000000uLL ) /*0x6b71*/
    {
      if ( n3 >= 3 ) /*0x6b77*/
        return 0; /*0x6b77*/
      v4 = 25 * n3; /*0x6b79*/
      EFI_INTERRUPT_PENDING = aEfiInterruptPe; // "EFI_INTERRUPT_PENDING" /*0x6b7d*/
      return &EFI_INTERRUPT_PENDING[v4]; /*0x6b84*/
    }
    if ( (n4 & 0xC000000000000000uLL) == 0xC000000000000000uLL ) /*0x6b96*/
    {
      if ( n3 > 2 ) /*0x6b9c*/
        return 0; /*0x6b9c*/
      v4 = 25 * n3 + 52375; /*0x6ba2*/
    }
    else
    {
      if ( n3 > 0x1E ) /*0x6baf*/
        return 0; /*0x6baf*/
      v4 = 25 * n3 + 52439; /*0x6bb9*/
    }
LABEL_18:
    EFI_INTERRUPT_PENDING = (char *)&_ImageBase; /*0x6bc0*/
    return &EFI_INTERRUPT_PENDING[v4]; /*0x6bc0*/
  }
  if ( (n4 & 0x2000000000000000LL) == 0 ) /*0x6b20*/
  {
    if ( n4 > 4 ) /*0x6b3f*/
      return 0; /*0x6b3f*/
    v4 = 26 * n4 + 52086; /*0x6b45*/
    goto LABEL_18; /*0x6b4c*/
  }
  if ( n4 >= 2 ) /*0x6b26*/
    return 0; /*0x6b2a*/
  v4 = 35 * n4; /*0x6b2b*/
  EFI_INTERRUPT_PENDING = aEfiWarnInterru; // "EFI_WARN_INTERRUPT_SOURCE_PENDING" /*0x6b2f*/
  return &EFI_INTERRUPT_PENDING[v4]; /*0x6b10*/
}


// Function: HiiConstructConfigAltString @ 0x6bcc (0x26 bytes)

__int64 HiiConstructConfigAltString(wchar_t *________________, const CHAR8 *DmiVar%02x%04x%02x%02x, ...)
{
  va_list va; // [rsp+40h] [rbp+18h] BYREF

  va_start(va, DmiVar%02x%04x%02x%02x);
  return HiiConstructConfigAltStringWorker(________________, 0, DmiVar%02x%04x%02x%02x, va); /*0x6bed*/
}


// Function: HiiConstructConfigAltStringWorker @ 0x6bf4 (0x478 bytes)

__int64 __fastcall HiiConstructConfigAltStringWorker(
        CHAR16 *StartOfBuffer,
        UINTN BufferSize,
        CHAR8 *FormatString,
        va_list va)
{
  CHAR8 *FormatString_1; // r12
  UINTN BufferSize_1; // r13
  CHAR16 *StartOfBuffer_1; // rdi
  CHAR16 *StartOfBuffer_2; // r15
  va_list i_1; // rcx
  CHAR16 n37_1; // ax
  __int64 n32; // r8
  __int64 n37; // rdx
  __int16 n32_1; // si
  va_list i_2; // rcx
  unsigned int v14; // edi
  unsigned int v15; // eax
  CHAR16 *j; // rax
  unsigned int *v17; // r9
  UINTN v18; // r8
  CHAR16 *m; // rcx
  const char *v20; // rax
  __int64 v21; // r9
  UINTN v22; // rax
  char v23; // al
  CHAR16 n100; // dx
  char v25; // r9
  __int64 n10; // r8
  __int64 *i_3; // rcx
  _WORD *v28; // rbx
  _BYTE *ii; // rcx
  _BYTE *jj; // rcx
  bool v31; // zf
  __int16 v32; // dx
  _WORD *v33; // rcx
  _WORD *v34; // rcx
  unsigned __int64 v35; // rax
  CHAR16 *v36; // rcx
  CHAR16 v37; // ax
  _BYTE *k; // rdx
  __int64 v39; // r15
  __int64 v41; // [rsp+20h] [rbp-E0h]
  __int64 v42; // [rsp+28h] [rbp-D8h]
  __int64 v43; // [rsp+30h] [rbp-D0h]
  __int64 v44; // [rsp+38h] [rbp-C8h]
  __int64 v45; // [rsp+40h] [rbp-C0h]
  __int64 v46; // [rsp+48h] [rbp-B8h]
  __int64 v47; // [rsp+50h] [rbp-B0h]
  __int64 v48; // [rsp+58h] [rbp-A8h]
  __int64 v49; // [rsp+60h] [rbp-A0h]
  __int64 v50; // [rsp+68h] [rbp-98h]
  CHAR8 *p_FormatString; // [rsp+70h] [rbp-90h] BYREF
  CHAR16 *StartOfBuffer_3; // [rsp+78h] [rbp-88h]
  _WORD v53[32]; // [rsp+80h] [rbp-80h] BYREF
  _BYTE n[256]; // [rsp+C0h] [rbp-40h] BYREF
  _BYTE n_1[304]; // [rsp+1C0h] [rbp+C0h] BYREF
  va_list i; // [rsp+310h] [rbp+210h]

  FormatString_1 = FormatString; /*0x6c1b*/
  BufferSize_1 = BufferSize; /*0x6c1e*/
  StartOfBuffer_1 = StartOfBuffer; /*0x6c21*/
  StartOfBuffer_2 = StartOfBuffer; /*0x6c24*/
  if ( !StartOfBuffer || !FormatString ) /*0x6c33*/
    return -1; /*0x704d*/
  if ( BufferSize == 1 ) /*0x6c3d*/
  {
LABEL_83:
    *StartOfBuffer_2 = 0; /*0x7044*/
    v39 = (char *)StartOfBuffer_2 - (char *)StartOfBuffer_1; /*0x7048*/
    return v39 >> 1; /*0x704b*/
  }
  i_1 = va - 1; /*0x6c43*/
  for ( i = va - 1; ; i_1 = i ) /*0x6c47*/
  {
    n37_1 = *(_WORD *)FormatString_1; /*0x6c4e*/
    n32 = 32; /*0x6c59*/
    n37 = 37; /*0x6c5d*/
    if ( !*(_WORD *)FormatString_1 ) /*0x6c64*/
    {
LABEL_82:
      StartOfBuffer_1 = StartOfBuffer; /*0x703d*/
      goto LABEL_83; /*0x703d*/
    }
    FormatString_1 += 2; /*0x6c6a*/
    if ( n37_1 != 37 ) /*0x6c71*/
    {
      *StartOfBuffer_2 = n37_1; /*0x6c73*/
LABEL_8:
      ++StartOfBuffer_2; /*0x6c77*/
      --BufferSize_1; /*0x6c7b*/
      goto LABEL_78; /*0x6c7e*/
    }
    if ( *(_WORD *)FormatString_1 == 37 ) /*0x6c88*/
    {
      FormatString_1 += 2; /*0x6c8a*/
      *StartOfBuffer_2 = 37; /*0x6c8e*/
      goto LABEL_8; /*0x6c92*/
    }
    n32_1 = 32; /*0x6c94*/
    if ( *(_WORD *)FormatString_1 == 48 ) /*0x6c9d*/
    {
      n32_1 = 48; /*0x6c9f*/
      FormatString_1 += 2; /*0x6ca2*/
    }
    switch ( *(_WORD *)FormatString_1 ) /*0x6cac*/
    {
      case '*': /*0x6cac*/
        FormatString_1 += 2; /*0x6cae*/
        i_2 = i_1 + 1; /*0x6cb2*/
        i = i_2; /*0x6cb6*/
        v14 = *(_DWORD *)i_2; /*0x6cbd*/
        break;
      case 's': /*0x6cac*/
        i = i_2 + 1; /*0x6ce8*/
        for ( j = (CHAR16 *)i_2[1]; *j; ++j ) /*0x6cef*/
        {
          if ( !--BufferSize_1 ) /*0x6cf8*/
            goto LABEL_80; /*0x6cf8*/
          *StartOfBuffer_2++ = *j; /*0x6cfe*/
        }
        goto LABEL_77; /*0x6d10*/
      case 'S': /*0x6cac*/
      case 'a': /*0x6cac*/
        i = i_2 + 1; /*0x6fee*/
        for ( k = i_2[1]; *k; ++k ) /*0x6ff5*/
        {
          if ( !--BufferSize_1 ) /*0x6ffe*/
            goto LABEL_80; /*0x6ffe*/
          *StartOfBuffer_2++ = (char)*k; /*0x7003*/
        }
        goto LABEL_77; /*0x7012*/
      default:
        v15 = AsciiStrDecimalToUintn(FormatString_1, (const CHAR8 **)&p_FormatString, 32); /*0x6cc9*/
        i_2 = i; /*0x6cce*/
        v14 = v15; /*0x6cd5*/
        FormatString_1 = p_FormatString; /*0x6cd7*/
        break;
    }
    if ( *(_WORD *)FormatString_1 != 99 ) /*0x6d35*/
      break; /*0x6d35*/
    i = i_2 + 1; /*0x6d3b*/
    *StartOfBuffer_2++ = *((_WORD *)i_2 + 4); /*0x6d45*/
LABEL_77:
    FormatString_1 += 2; /*0x7014*/
LABEL_78:
    if ( BufferSize_1 == 1 ) /*0x701c*/
      goto LABEL_82; /*0x701c*/
  }
  if ( (*FormatString_1 & 0xDF) == 0x47 ) /*0x6d5a*/
  {
    StartOfBuffer_3 = StartOfBuffer_2; /*0x6d64*/
    i = i_2 + 1; /*0x6d69*/
    v17 = (unsigned int *)i_2[1]; /*0x6d70*/
    LODWORD(v50) = *((unsigned __int8 *)v17 + 15); /*0x6da8*/
    LODWORD(v49) = *((unsigned __int8 *)v17 + 14); /*0x6dac*/
    LODWORD(v48) = *((unsigned __int8 *)v17 + 13); /*0x6db3*/
    LODWORD(v47) = *((unsigned __int8 *)v17 + 12); /*0x6dba*/
    LODWORD(v46) = *((unsigned __int8 *)v17 + 11); /*0x6dc6*/
    LODWORD(v45) = *((unsigned __int8 *)v17 + 10); /*0x6dcb*/
    LODWORD(v44) = *((unsigned __int8 *)v17 + 9); /*0x6dd0*/
    LODWORD(v43) = *((unsigned __int8 *)v17 + 8); /*0x6dd4*/
    LODWORD(v42) = *((unsigned __int16 *)v17 + 3); /*0x6dd8*/
    LODWORD(v41) = *((unsigned __int16 *)v17 + 2); /*0x6ddc*/
    v18 = UnicodeSPrintAsciiFormat( /*0x6de9*/
            StartOfBuffer_2,
            BufferSize_1,
            L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
            *v17,
            v41,
            v42,
            v43,
            v44,
            v45,
            v46,
            v47,
            v48,
            v49,
            v50);
    StartOfBuffer_2 += v18; /*0x6df2*/
    if ( *(_WORD *)FormatString_1 == 71 ) /*0x6df6*/
    {
      for ( m = StartOfBuffer_3; *m; ++m ) /*0x6dfd*/
      {
        if ( (unsigned __int16)(*m - 97) <= 0x19u ) /*0x6e11*/
          *m -= 32; /*0x6e17*/
      }
    }
    BufferSize_1 -= v18; /*0x6e24*/
    goto LABEL_77; /*0x6e27*/
  }
  if ( *(_WORD *)FormatString_1 == 114 ) /*0x6e32*/
  {
    i = i_2 + 1; /*0x6e38*/
    v20 = StatusToString((unsigned __int64)i_2[1], n37, n32); /*0x6e45*/
    if ( v20 ) /*0x6e53*/
      v22 = UnicodeSPrintAsciiFormat(StartOfBuffer_2, BufferSize_1, L"%S", v20); /*0x6e79*/
    else
      v22 = UnicodeSPrintAsciiFormat( /*0x6e68*/
              StartOfBuffer_2,
              BufferSize_1,
              L"%S(%X)",
              aStatusCode, // "Status Code"
              v21);
    StartOfBuffer_2 += v22; /*0x6e7e*/
    BufferSize_1 -= v22; /*0x6e82*/
    goto LABEL_77; /*0x6e85*/
  }
  if ( *(_WORD *)FormatString_1 == 108 ) /*0x6e90*/
  {
    FormatString_1 += 2; /*0x6e92*/
    v23 = 1; /*0x6e96*/
  }
  else
  {
    v23 = 0; /*0x6e9a*/
  }
  n100 = *(_WORD *)FormatString_1; /*0x6e9d*/
  v25 = 1; /*0x6ea2*/
  if ( *(_WORD *)FormatString_1 != 112 ) /*0x6eaf*/
    v25 = v23; /*0x6eaf*/
  if ( n100 == 100 || n100 == 105 ) /*0x6ebd*/
  {
    n10 = 10; /*0x6ed3*/
  }
  else
  {
    if ( (n100 & 0xDF) != 0x58 ) /*0x6ec5*/
      goto LABEL_78; /*0x6ec5*/
    n10 = 16; /*0x6ecb*/
  }
  i_3 = (__int64 *)(i_2 + 1); /*0x6ed9*/
  v28 = v53; /*0x6edd*/
  i = (va_list)i_3; /*0x6ee1*/
  if ( v25 ) /*0x6eeb*/
  {
    for ( ii = ValueToString(*i_3, n, n10, 1); ii >= n; --ii ) /*0x6efc*/
      *v28++ = (char)*ii; /*0x6f04*/
  }
  else
  {
    for ( jj = ValueToString(*(int *)i_3, n_1, n10, 0); jj >= n_1; --jj ) /*0x6f2b*/
      *v28++ = (char)*jj; /*0x6f33*/
  }
  v31 = *(_WORD *)FormatString_1 == 88; /*0x6f49*/
  *v28 = 0; /*0x6f4f*/
  if ( v31 || *(_WORD *)FormatString_1 == 112 ) /*0x6f5b*/
  {
    v32 = v53[0]; /*0x6f5d*/
    v33 = v53; /*0x6f61*/
    if ( v53[0] ) /*0x6f68*/
    {
      do /*0x6f87*/
      {
        if ( (unsigned __int16)(*v33 - 97) <= 0x19u ) /*0x6f7a*/
          *v33 -= 32; /*0x6f80*/
        ++v33; /*0x6f83*/
      }
      while ( *v33 ); /*0x6f87*/
      goto LABEL_62; /*0x6f8b*/
    }
  }
  else
  {
LABEL_62:
    v32 = v53[0]; /*0x6f8d*/
  }
  v34 = v53; /*0x6f91*/
  v35 = 0; /*0x6f95*/
  if ( v32 ) /*0x6f9b*/
  {
    do /*0x6fa4*/
    {
      ++v34; /*0x6f9d*/
      ++v35; /*0x6fa1*/
    }
    while ( *v34 ); /*0x6fa4*/
  }
  while ( v35 < v14 ) /*0x6fc2*/
  {
    ++v35; /*0x6fae*/
    if ( !--BufferSize_1 ) /*0x6fb5*/
      goto LABEL_80; /*0x6fb5*/
    *StartOfBuffer_2++ = n32_1; /*0x6fb7*/
  }
  v36 = v53; /*0x6fc4*/
  if ( !v32 ) /*0x6fcb*/
    goto LABEL_77; /*0x6fcb*/
  while ( --BufferSize_1 ) /*0x6fcd*/
  {
    v37 = *v36++; /*0x6fd3*/
    *StartOfBuffer_2++ = v37; /*0x6fda*/
    if ( !*v36 ) /*0x6fe2*/
      goto LABEL_77; /*0x6fe6*/
  }
LABEL_80:
  *StartOfBuffer_2 = 0; /*0x702a*/
  v39 = (char *)StartOfBuffer_2 - (char *)StartOfBuffer; /*0x702e*/
  return v39 >> 1; /*0x7059*/
}


// Function: UnicodeSPrintAsciiFormat @ 0x706c (0x1d bytes)

UINTN UnicodeSPrintAsciiFormat(CHAR16 *StartOfBuffer, UINTN BufferSize, const CHAR8 *FormatString, ...)
{
  va_list va; // [rsp+48h] [rbp+20h] BYREF

  va_start(va, FormatString);
  return HiiConstructConfigAltStringWorker(StartOfBuffer, BufferSize, (CHAR8 *)FormatString, va); /*0x7084*/
}


// Function: StrnCmp @ 0x708c (0x78 bytes)

__int64 __fastcall StrnCmp(unsigned __int64 a1, _BYTE *a2, unsigned __int64 n8)
{
  unsigned __int64 v3; // r10
  unsigned __int64 n8_1; // r9
  unsigned __int64 v5; // r8

  v3 = a1 + n8; /*0x7092*/
  if ( n8 >= 8 ) /*0x7099*/
  {
    n8_1 = a1 & 7; /*0x709e*/
    if ( (a1 & 7) != 0 && n8_1 == ((unsigned __int8)a2 & 7) ) /*0x70ad*/
    {
      v5 = 8 - n8_1; /*0x70b2*/
      if ( n8_1 != 8 ) /*0x70b5*/
      {
        do /*0x70c7*/
        {
          if ( *(_BYTE *)a1 != *a2 ) /*0x70bb*/
            break; /*0x70bb*/
          ++a1; /*0x70bd*/
          ++a2; /*0x70c0*/
          --v5; /*0x70c3*/
        }
        while ( v5 ); /*0x70c7*/
      }
    }
    while ( a1 <= v3 - 8 && *(_QWORD *)a1 == *(_QWORD *)a2 ) /*0x70d5*/
    {
      a1 += 8LL; /*0x70d7*/
      a2 += 8; /*0x70da*/
    }
  }
  while ( 1 ) /*0x70f0*/
  {
    if ( a1 >= v3 ) /*0x70f3*/
      return 0; /*0x70f7*/
    if ( *(_BYTE *)a1 != *a2 ) /*0x70e8*/
      break; /*0x70e8*/
    ++a1; /*0x70ea*/
    ++a2; /*0x70ed*/
  }
  return *(char *)a1 - (char)*a2; /*0x70f7*/
}


// Function: DevicePathFindAcpiNode @ 0x7104 (0x9e bytes)

__int64 __fastcall DevicePathFindAcpiNode(_BYTE *a1, _WORD **a2)
{
  _WORD *i_1; // rsi
  bool v5; // zf
  _WORD *i; // rbx
  __int64 result; // rax

  if ( !a1 || !a2 ) /*0x712b*/
    return 0x8000000000000002uLL; /*0x717d*/
  i_1 = *a2; /*0x712d*/
  while ( 2 ) /*0x7136*/
  {
    v5 = *i_1 == 0xFFFF; /*0x7136*/
    for ( i = i_1; ; v5 = *i == 0xFFFF ) /*0x713a*/
    {
      if ( v5 ) /*0x713d*/
        return 0x800000000000000EuLL; /*0x717b*/
      i = (_WORD *)((char *)i + (unsigned __int16)i[1]); /*0x7143*/
      if ( *i == 4 ) /*0x714a*/
        break; /*0x714a*/
    }
    i_1 = i; /*0x715f*/
    result = StrnCmp((unsigned __int64)(i + 4), a1, 0x10u); /*0x7162*/
    if ( result ) /*0x716a*/
      continue; /*0x716a*/
    break;
  }
  *a2 = i; /*0x716c*/
  return result; /*0x719b*/
}


// Function: ReFlashParseFirmwareImage @ 0x71a4 (0x530 bytes)

void *__fastcall ReFlashParseFirmwareImage(__int64 i, UINTN *p_n0x1000000, _DWORD *p_ImageType)
{
  UINTN Length; // rax
  __int64 v7; // rcx
  void *ia_1; // rax
  __int64 ia_3; // r14
  __int64 ia_2; // rdi
  __int64 v11; // rdi
  __int64 v12; // r8
  __int64 v13; // rdi
  __int64 ia_4; // rbx
  UINTN Length_1; // rax
  __int64 v16; // rcx
  void *ia_5; // rsi
  __int64 ia_6; // rax
  __int64 v19; // rbx
  _QWORD *Pool_1; // rbx
  _QWORD *Pool; // rax
  __int64 v22; // rax
  void *v23; // rax
  __int64 v24; // rax
  void *v25; // rax
  __int64 ia; // [rsp+40h] [rbp-29h] BYREF
  UINTN AllocationSize_1; // [rsp+48h] [rbp-21h] BYREF
  void *v29; // [rsp+50h] [rbp-19h] BYREF
  __int64 v30; // [rsp+58h] [rbp-11h] BYREF
  __int64 v31; // [rsp+60h] [rbp-9h] BYREF
  UINTN AllocationSize; // [rsp+68h] [rbp-1h] BYREF
  __int64 v33; // [rsp+70h] [rbp+7h] BYREF
  __int64 (__fastcall **v34)(_QWORD, _QWORD, _QWORD, _QWORD, _QWORD); // [rsp+78h] [rbp+Fh] BYREF
  __int64 (__fastcall **v35)(_QWORD, _QWORD, _QWORD, _Q... [10621 chars total]


// Function: Assert_5 @ 0x76d4 (0x14b bytes)

__int64 __fastcall Assert_5(const char *FilePath, unsigned __int16 n3, wchar_t *Firmware_Update)
{
  __int64 v3; // rbp
  _BYTE *x_UEFI_2; // rax
  __int64 result; // rax
  __int64 v7; // rsi
  _BYTE *x_UEFI_1; // rbx
  _BYTE *x_UEFI; // r15
  unsigned __int64 n0xF4240; // rax
  __int64 v11; // rdx
  __int64 v12; // rax
  unsigned __int16 n3_1; // [rsp+78h] [rbp+10h] BYREF

  n3_1 = n3; /*0x76de*/
  v3 = qword_D158; /*0x76ef*/
  if ( !qword_D158 ) /*0x76ff*/
    DebugAssert("e:\\hs\\MdeModulePkg\\Library\\UefiHiiLib\\HiiString.c", 0x46u, "HiiHandle != ((void *) 0)"); /*0x7712*/
  if ( !Firmware_Update ) /*0x771a*/
    DebugAssert("e:\\hs\\MdeModulePkg\\Library\\UefiHiiLib\\HiiString.c", 0x47u, "String != ((void *) 0)"); /*0x772e*/
  x_UEFI_2 = Assert_14(v3); /*0x7736*/
  if ( !x_UEFI_2 ) /*0x7741*/
    return 0; /*0x7743*/
  v7 = 0x8000000000000002uLL; /*0x774c*/
  x_UEFI_1 = x_UEFI_2; /*0x7756*/
  while ( *x_UEFI_1 )
  {
    x_UEFI = x_UEFI_1; /*0x7762*/
    if ( *x_UEFI_1 ) /*0x7765*/
    {
      do /*0x7772*/
      {
        if ( *x_UEFI_1 == 59 ) /*0x776d*/
          break; /*0x776d*/
        ++x_UEFI_1; /*0x776f*/
      }
      while ( *x_UEFI_1 ); /*0x7772*/
      if ( *x_UEFI_1 ) /*0x7777*/
        *x_UEFI_1++ = 0; /*0x777c*/
    }
    n0xF4240 = Assert_21("x-UEFI"); /*0x7789*/
    if ( Assert_8(x_UEFI, v11, n0xF4240) )
    {
      v12 = n3_1
          ? (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, _BYTE *, wchar_t *, _QWORD))(qword_D250 + 16))(
              qword_D250,
              v3,
              n3_1,
              x_UEFI,
              Firmware_Update,
              0)
          : (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *, _BYTE *, _QWORD, wchar_t *, _QWORD))qword_D250)(
              qword_D250,
              v3,
              &n3_1,
              x_UEFI,
              0,
              Firmware_Update,
              0);
      v7 = v12; /*0x77df*/
      if ( v12 < 0 ) /*0x77e5*/
        break; /*0x77e5*/
    }
  }
  AllocatePoolWithAssert(); /*0x77f3*/
  result = 0; /*0x77f8*/
  if ( v7 >= 0 ) /*0x77ff*/
    return n3_1; /*0x7801*/
  return result; /*0x7813*/
}


// Function: Assert_14 @ 0x7820 (0xa7 bytes)

void *__fastcall Assert_14(__int64 a1)
{
  void *ZeroPool; // rax
  void *ZeroPool_1; // rbx
  char v5; // [rsp+38h] [rbp+10h] BYREF
  __int64 v6; // [rsp+40h] [rbp+18h] BYREF

  if ( !a1 ) /*0x7830*/
    DebugAssert("e:\\hs\\MdeModulePkg\\Library\\UefiHiiLib\\HiiLanguage.c", 0x2Fu, "HiiHandle != ((void *) 0)"); /*0x7843*/
  v6 = 0; /*0x7854*/
  if ( (*(__int64 (__fastcall **)(__int64, __int64, char *, __int64 *))(qword_D250 + 24))(qword_D250, a1, &v5, &v6) != 0x8000000000000005uLL ) /*0x7875*/
    return 0; /*0x7875*/
  ZeroPool = AllocateZeroPool(4u); /*0x7885*/
  ZeroPool_1 = ZeroPool; /*0x788a*/
  if ( !ZeroPool ) /*0x7890*/
    return 0; /*0x7890*/
  if ( (*(__int64 (__fastcall **)(__int64, __int64, void *, __int64 *))(qword_D250 + 24))(qword_D250, a1, ZeroPool, &v6) < 0 ) /*0x78ad*/
  {
    AllocatePoolWithAssert(); /*0x78b2*/
    return 0; /*0x7879*/
  }
  return ZeroPool_1; /*0x78c1*/
}


// Function: Assert_6 @ 0x78c8 (0x13c bytes)

__int64 Assert_6(__int64 a1, unsigned __int8 *FormatString, ...)
{
  unsigned __int8 *FormatStringa_1; // r8
  unsigned int *FormatStringa_2; // rdi
  int v6; // ebx
  unsigned int *FormatStringa_3; // rax
  unsigned int **v8; // rsi
  int v9; // ebx
  char *ZeroPool; // rax
  char *ZeroPool_1; // rsi
  unsigned __int8 *FormatString_1; // rdx
  unsigned __int8 *FormatString_2; // r8
  char *DestinationBuffer; // rbp
  unsigned int **v15; // r15
  UINTN Length; // rbx
  __int64 v17; // rax
  __int64 v18; // rcx
  __int64 v20[9]; // [rsp+20h] [rbp-48h] BYREF
  unsigned int *FormatStringa; // [rsp+80h] [rbp+18h] BYREF
  va_list FormatStringb; // [rsp+80h] [rbp+18h]
  va_list va1; // [rsp+88h] [rbp+20h] BYREF

  va_start(va1, FormatString);
  va_start(FormatStringb, FormatString);
  FormatStringa = va_arg(va1, unsigned int *); /*0x78c8*/
  FormatStringa_1 = (unsigned __int8 *)FormatStringa; /*0x78c8*/
  if ( !a1 ) /*0x78f1*/
    DebugAssert("e:\\hs\\MdeModulePkg\\Library\\UefiHiiLib\\HiiLib.c", 0xA0u, "PackageListGuid != ((void *) 0)"); /*0x7906*/
  FormatStringa_2 = FormatStringa; /*0x790b*/
  v6 = 0; /*0x7913*/
  FormatStringa_3 = FormatStringa; /*0x7916*/
  if ( !FormatStringa ) /*0x791c*/
    return 0; /*0x791c*/
  va_copy((va_list)v8, FormatStringb); /*0x7922*/
  do /*0x793b*/
  {
    ++v8; /*0x7935*/
    v6 += Assert_36(FormatStringa_3, FormatString, FormatStringa_1) - 4; /*0x7939*/
    FormatStringa_3 = *v8; /*0x793b*/
  }
  while ( *v8 ); /*0x793b*/
  if ( !v6 ) /*0x7945*/
    return 0; /*0x7945*/
  v9 = v6 + 24; /*0x794b*/
  ZeroPool = (char *)AllocateZeroPool(4u); /*0x7953*/
  ZeroPool_1 = ZeroPool; /*0x7958*/
  if ( !ZeroPool ) /*0x795e*/
    return 0; /*0x79f3*/
  Assert_46(ZeroPool, a1); /*0x796a*/
  *((_DWORD *)ZeroPool_1 + 4) = v9; /*0x796f*/
  DestinationBuffer = ZeroPool_1 + 20; /*0x7972*/
  va_copy((va_list)v15, FormatStringb); /*0x7976*/
  do /*0x79a1*/
  {
    Length = (unsigned int)Assert_36(FormatStringa_2, FormatString_1, FormatString_2) - 4; /*0x7993*/
    CopyMem(DestinationBuffer, FormatStringa_2 + 1, Length); /*0x7995*/
    ++v15; /*0x799a*/
    DestinationBuffer += Length; /*0x799e*/
    FormatStringa_2 = *v15; /*0x79a1*/
  }
  while ( *v15 ); /*0x79a1*/
  CopyMem(DestinationBuffer, &SourceBuffer__0, 4u); /*0x79b7*/
  v17 = (*(__int64 (__fastcall **)(__int64, char *, unsigned __int8 *, __int64 *))qword_D270)( /*0x79d1*/
          qword_D270,
          ZeroPool_1,
          FormatString,
          v20);
  v18 = v20[0]; /*0x79d3*/
  if ( v17 < 0 ) /*0x79db*/
    v18 = 0; /*0x79db*/
  v20[0] = v18; /*0x79df*/
  AllocatePoolWithAssert(); /*0x79e7*/
  return v20[0]; /*0x79f5*/
}


// Function: ReFlashReadRomLayout @ 0x7a04 (0xdf bytes)

unsigned __int64 __fastcall ReFlashReadRomLayout(_DWORD *Guid2, _QWORD *p_SourceBuffer)
{
  _DWORD *Guid2_1; // rbx
  unsigned int Data1; // ebp

  if ( !p_SourceBuffer ) /*0x7a21*/
    return 0x8000000000000002uLL; /*0x7ac4*/
  Guid2_1 = Guid2 + 4194289; /*0x7a27*/
  if ( Guid2 + 4194289 != (_DWORD *)((unsigned __int64)(Guid2 + 4194289) & 0xFFFFFFFFFFFFFFFCuLL) ) /*0x7a38*/
    DebugAssert( /*0x7a4d*/
      "e:\\hs\\AmiModulePkg\\Library\\AmiRomLayout\\AmiRomLayoutLibCommon.c",
      0xC8u,
      "(UINTN)SearchPointer == ((UINTN)SearchPointer & (~0x03))");
  Data1 = Guid1__1.Data1; /*0x7a52*/
  while ( Guid2_1 != Guid2 ) /*0x7a5b*/
  {
    if ( *Guid2_1 == Data1 /*0x7a8f*/
      && CompareGuid(&Guid1__1, (const GUID *)Guid2_1)
      && CompareGuid(&ImageHandle_, (const GUID *)(Guid2_1 + 7))
      && Guid2_1[11] == 1280134994 )
    {
      RegionSize = Guid2_1[13]; /*0x7a9a*/
      LODWORD(n40) = Guid2_1[13] * Guid2_1[14]; /*0x7aa7*/
      *p_SourceBuffer = Guid2_1 + 15; /*0x7ab1*/
      return 0; /*0x7ab6*/
    }
    --Guid2_1; /*0x7a91*/
  }
  return 0x800000000000000EuLL; /*0x7add*/
}


// Function: ReFlashGetHiiString @ 0x7ae4 (0x4b bytes)

__int64 __fastcall ReFlashGetHiiString(__int64 a1)
{
  __int64 v1; // rax
  unsigned __int16 v2; // cx
  unsigned __int16 v4; // [rsp+58h] [rbp+10h] BYREF

  v1 = (*(__int64 (__fastcall **)(__int64, __int64, unsigned __int16 *, const char *, _QWORD, __int64, _QWORD))qword_F668)( /*0x7b15*/
         qword_F668,
         qword_F680,
         &v4,
         "en-US",
         0,
         a1,
         0);
  v2 = v4; /*0x7b17*/
  if ( v1 ) /*0x7b24*/
    return 2; /*0x7b24*/
  return v2; /*0x7b2a*/
}


// Function: Assert_13 @ 0x7b30 (0xab bytes)

char *__fastcall Assert_13(__int64 a1, const CHAR16 *SourceBuffer)
{
  UINTN AllocationSize; // rsi
  _WORD *Pool; // rax
  _WORD *Pool_1; // rdi
  UINTN v7; // rax
  char *v8; // rbx
  __int64 SourceBuffera; // [rsp+40h] [rbp+18h] BYREF

  if ( (*(__int64 (__fastcall **)(__int64, void *, __int64 *))(BootServices_0 + 152))(a1, &unk_C780, &SourceBuffera) ) /*0x7b55*/
    return 0; /*0x7b55*/
  AllocationSize = 2 * StrLen(SourceBuffer) + 6; /*0x7b6c*/
  Pool = AllocatePool(AllocationSize); /*0x7b77*/
  Pool_1 = Pool; /*0x7b7c*/
  if ( !Pool ) /*0x7b82*/
    return 0; /*0x7b60*/
  *Pool = 1028; /*0x7b87*/
  Assert_22(Pool, AllocationSize); /*0x7b8f*/
  v7 = StrLen(SourceBuffer); /*0x7b97*/
  CopyMem(Pool_1 + 2, SourceBuffer, 2 * v7 + 2); /*0x7bab*/
  v8 = Assert_12((const void *)SourceBuffera, Pool_1); /*0x7bc0*/
  AllocatePoolWithAssert(); /*0x7bc3*/
  return v8; /*0x7bd5*/
}


// Function: Assert_0 @ 0x7bdc (0x218 bytes)

unsigned __int64 Assert_0(__int64 CtxPtr, __int64 a2, __int64 n100, ...)
{
  const CHAR16 *SourceBuffer_1; // rdi
  char *i_1; // rsi
  unsigned __int64 result; // rax
  __int64 v6; // rax
  __int64 *v7; // rax
  __int64 *v8; // rbx
  const CHAR16 *SourceBuffer; // rax
  __int64 i; // rcx
  UINTN AllocationSize; // [rsp+48h] [rbp+20h] BYREF
  va_list AllocationSizea; // [rsp+48h] [rbp+20h]
  va_list va1; // [rsp+50h] [rbp+28h] BYREF

  va_start(va1, n100);
  va_start(AllocationSizea, n100);
  AllocationSize = va_arg(va1, _QWORD); /*0x7bdc*/
  SourceBuffer_1 = 0; /*0x7c07*/
  i_1 = 0; /*0x7c09*/
  if ( !(*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C6B0, 0, &qword_F688) ) /*0x7c0b*/
    return (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, __int64 *))qword_F688)(0, 0, 0, &i_0); /*0x7c2b*/
  result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C800, 0, &qword_F690); /*0x7c47*/
  if ( !result ) /*0x7c50*/
  {
    result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C820, 0, &qword_F668); /*0x7c6d*/
    if ( !result ) /*0x7c76*/
    {
      result = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C830, 0, &qword_F678); /*0x7c93*/
      if ( !result ) /*0x7c9c*/
      {
        AllocationSize = 0; /*0x7ca2*/
        v6 = Assert_6((__int64)&qword_D030, 0, &unk_D040, 0); /*0x7cba*/
        qword_F680 = v6; /*0x7cbf*/
        if ( v6 ) /*0x7cc9*/
        {
          result = (*(__int64 (__fastcall **)(__int64, __int64, UINTN *, __int64))(qword_F690 + 32))( /*0x7cf3*/
                     qword_F690,
                     v6,
                     (UINTN *)AllocationSizea,
                     qword_D338);
          if ( result == 0x8000000000000005uLL ) /*0x7d03*/
          {
            qword_D338 = (__int64)AllocatePool(AllocationSize); /*0x7d1b*/
            result = (*(__int64 (__fastcall **)(__int64, __int64, UINTN *, __int64))(qword_F690 + 32))( /*0x7d2f*/
                       qword_F690,
                       qword_F680,
                       (UINTN *)AllocationSizea,
                       qword_D338);
          }
          if ( !result ) /*0x7d35*/
          {
            String = 0; /*0x7d3b*/
            v7 = (__int64 *)Assert_4(); /*0x7d42*/
            v8 = v7; /*0x7d47*/
            if ( v7 ) /*0x7d4d*/
            {
              SourceBuffer = (const CHAR16 *)Assert_40((__int64)v7); /*0x7d52*/
              SourceBuffer_1 = SourceBuffer; /*0x7d57*/
              if ( SourceBuffer ) /*0x7d5d*/
                i_1 = Assert_13(*v8, SourceBuffer); /*0x7d6a*/
            }
            (*(void (__fastcall **)(__int64, __int64))(qword_F690 + 8))(qword_F690, qword_F680); /*0x7d7e*/
            AllocatePoolWithAssert(); /*0x7d89*/
            i = i_0; /*0x7d8e*/
            if ( i_1 ) /*0x7d98*/
              i = (__int64)i_1; /*0x7d98*/
            i_0 = i; /*0x7d9c*/
            if ( SourceBuffer_1 ) /*0x7da6*/
              AllocatePoolWithAssert(); /*0x7dab*/
            if ( v8 ) /*0x7db3*/
              AllocatePoolWithAssert(); /*0x7db8*/
            if ( String ) /*0x7dc7*/
              AllocatePoolWithAssert(); /*0x7dc9*/
            return -(__int64)(i_1 == 0) & 0x800000000000000EuLL; /*0x7de1*/
          }
        }
        else
        {
          return 0x8000000000000009uLL; /*0x7ccb*/
        }
      }
    }
  }
  return result; /*0x7dee*/
}


// Function: Assert_15 @ 0x7df4 (0xa1 bytes)

bool __fastcall Assert_15(const CHAR16 *a1)
{
  UINTN i; // rax
  const CHAR16 *v4; // rbx
  UINTN v5; // rax
  __int64 v6; // rdx
  const CHAR16 *Pool; // rsi
  const CHAR16 *j; // r8
  __int16 v9; // ax
  _WORD *v10; // r8
  __int64 v11; // rcx
  CHAR16 *v12; // rbx

  for ( i = StrLen(a1) - 1; a1[i] != 46; --i ) /*0x7e0b*/
  {
    if ( !i ) /*0x7e15*/
      return 1; /*0x7e15*/
  }
  if ( !i ) /*0x7e24*/
    return 1; /*0x7e28*/
  v4 = &a1[i + 1]; /*0x7e2e*/
  v5 = StrLen(v4); /*0x7e35*/
  Pool = (const CHAR16 *)AllocatePool(2 * v5 + 2); /*0x7e47*/
  for ( j = Pool; ; j = v10 + 1 ) /*0x7e4a*/
  {
    v11 = *v4; /*0x7e60*/
    if ( !(_WORD)v11 ) /*0x7e66*/
      break; /*0x7e66*/
    v9 = CharToUpper(v11, v6, j); /*0x7e4f*/
    *v10 = v9; /*0x7e54*/
    ++v4; /*0x7e58*/
  }
  *j = 0; /*0x7e6b*/
  v12 = Assert_10(v11, Pool); /*0x7e77*/
  AllocatePoolWithAssert(Pool); /*0x7e7a*/
  return v12 != 0; /*0x7e8f*/
}


// Function: Assert_9 @ 0x7e98 (0xcd bytes)

void __fastcall Assert_9(CHAR16 *String)
{
  UINTN v2; // rbx
  UINTN v3; // rax
  UINTN AllocationSize; // rbx
  CHAR16 *Pool; // rax
  const CHAR16 *%s%s; // r8
  CHAR16 *Pool_1; // rsi

  if ( String ) /*0x7ead*/
  {
    v2 = StrLen(::Pool); /*0x7ed8*/
    v3 = StrLen(String); /*0x7edb*/
    if ( v2 == 1 && *::Pool == 92 ) /*0x7ef3*/
    {
      AllocationSize = 2 * v3 + 4; /*0x7ef5*/
      Pool = (CHAR16 *)AllocatePool(AllocationSize); /*0x7f00*/
      %s%s = (const CHAR16 *)"%s%s"; /*0x7f05*/
    }
    else
    {
      AllocationSize = 2 * (v2 + v3) + 4; /*0x7f11*/
      Pool = (CHAR16 *)AllocatePool(AllocationSize); /*0x7f1c*/
      %s%s = "%s\\%s"; /*0x7f21*/
    }
    Pool_1 = Pool; /*0x7f3a*/
    UnicodeSPrint(Pool, AllocationSize, %s%s, ::Pool, String); /*0x7f3d*/
    AllocatePoolWithAssert(); /*0x7f49*/
    ::Pool = Pool_1; /*0x7f4e*/
  }
  else
  {
    ::Pool = (CHAR16 *)AllocatePool(4u); /*0x7eb7*/
    *(_DWORD *)::Pool = 92; /*0x7ebe*/
  }
}


// Function: StrAllocatePad @ 0x7f68 (0x86 bytes)

char *__fastcall StrAllocatePad(const CHAR16 *SourceBuffer, __int64 a2)
{
  UINTN v4; // rsi
  char *Pool; // rbx
  __int64 v6; // rcx
  char *v7; // rdi

  v4 = StrLen(SourceBuffer); /*0x7f8b*/
  Pool = (char *)AllocatePool(2 * (v4 + a2) + 2); /*0x7fac*/
  CopyMem(Pool, SourceBuffer, 2 * v4); /*0x7faf*/
  if ( a2 ) /*0x7fb9*/
  {
    v6 = a2; /*0x7fbe*/
    v7 = &Pool[2 * v4]; /*0x7fc4*/
    while ( v6 ) /*0x7fc8*/
    {
      *(_WORD *)v7 = 32; /*0x7fc8*/
      v7 += 2; /*0x7fc8*/
      --v6; /*0x7fc8*/
    }
    v4 += a2; /*0x7fcb*/
  }
  *(_WORD *)&Pool[2 * v4] = 0; /*0x7fd6*/
  return Pool; /*0x7fe4*/
}


// Function: CharToUpper @ 0x7ff0 (0x2f bytes)

__int64 __fastcall CharToUpper(unsigned __int16 a1, __int64 a2, const CHAR16 *j)
{
  unsigned int v3; // eax
  int n2139095039; // edx

  if ( (unsigned __int16)(a1 - 97) <= 0x19u ) /*0x7ff7*/
    return (unsigned int)a1 - 32; /*0x7ff7*/
  v3 = a1; /*0x7ffe*/
  if ( (unsigned __int16)(a1 - 224) <= 0x1Eu /*0x8012*/
    && (n2139095039 = 2139095039, LOWORD(v3) = a1 - 224, _bittest(&n2139095039, v3)) )
  {
    return (unsigned int)a1 - 32; /*0x801b*/
  }
  else
  {
    return a1; /*0x8014*/
  }
}


// Function: Assert_11 @ 0x8020 (0xc2 bytes)

__int64 __fastcall Assert_11(const CHAR16 *SourceBuffer, CHAR16 *SourceBuffer_2)
{
  __int64 j_2; // r14
  char *SourceBuffer_4; // rbp
  const CHAR16 *SourceBuffer_1; // rdi
  UINTN v6; // rsi
  UINTN v7; // rax
  __int64 v8; // rdx
  const CHAR16 *j; // r8
  char *SourceBuffer_3; // rax
  unsigned __int16 v11; // cx
  signed __int64 v12; // rdi
  unsigned __int16 j_1; // ax
  __int64 v14; // rdx
  unsigned __int16 v15; // ax
  int v16; // r8d

  j_2 = 0; /*0x803e*/
  SourceBuffer_4 = 0; /*0x8041*/
  SourceBuffer_1 = SourceBuffer; /*0x8044*/
  v6 = StrLen(SourceBuffer); /*0x804f*/
  v7 = StrLen(SourceBuffer_2); /*0x8052*/
  if ( v7 <= v6 ) /*0x805a*/
  {
    if ( v7 >= v6 ) /*0x806f*/
      goto LABEL_6; /*0x806f*/
    SourceBuffer_3 = StrAllocatePad(SourceBuffer_2, v6 - v7); /*0x807a*/
    SourceBuffer_2 = (CHAR16 *)SourceBuffer_3; /*0x807f*/
  }
  else
  {
    SourceBuffer_3 = StrAllocatePad(SourceBuffer_1, v7 - v6); /*0x8065*/
    SourceBuffer_1 = (const CHAR16 *)SourceBuffer_3; /*0x806a*/
  }
  SourceBuffer_4 = SourceBuffer_3; /*0x8082*/
LABEL_6:
  v11 = *SourceBuffer_1; /*0x8085*/
  if ( *SourceBuffer_1 ) /*0x8085*/
  {
    v12 = (char *)SourceBuffer_1 - (char *)SourceBuffer_2; /*0x808d*/
    do /*0x80b7*/
    {
      j_1 = CharToUpper(v11, v8, j); /*0x8090*/
      v15 = CharToUpper(*SourceBuffer_2, v14, (const CHAR16 *)j_1); /*0x809c*/
      j = (const CHAR16 *)(v16 - (unsigned int)v15); /*0x80a4*/
      j_2 = (int)j; /*0x80a7*/
      if ( (_DWORD)j ) /*0x80aa*/
        break; /*0x80aa*/
      v11 = *(CHAR16 *)((char *)++SourceBuffer_2 + v12); /*0x80b0*/
    }
    while ( v11 ); /*0x80b7*/
  }
  if ( SourceBuffer_4 ) /*0x80bc*/
    AllocatePoolWithAssert(); /*0x80c1*/
  return j_2; /*0x80d8*/
}


// Function: Assert_41 @ 0x80e4 (0x101 bytes)

__int64 __fastcall Assert_41(const CHAR16 *SourceBuffer, CHAR16 *SourceBuffer_2)
{
  UINTN v4; // rdi
  UINTN i_1; // rax
  __int64 v6; // rbp
  UINTN i; // rbx
  CHAR16 *SourceBuffer_3; // rdx
  const CHAR16 *SourceBuffer_1; // rcx
  __int64 v10; // rax
  __int64 result; // rax
  __int64 v12; // rax

  v4 = StrLen(SourceBuffer); /*0x810f*/
  i_1 = StrLen(SourceBuffer_2); /*0x8112*/
  v6 = 1; /*0x8117*/
  for ( i = i_1; v4; --v4 ) /*0x8129*/
  {
    if ( SourceBuffer[v4] == 46 ) /*0x8130*/
      break; /*0x8130*/
  }
  if ( i_1 ) /*0x813a*/
  {
    do /*0x8146*/
    {
      if ( SourceBuffer_2[i] == 46 ) /*0x8141*/
        break; /*0x8141*/
      --i; /*0x8143*/
    }
    while ( i ); /*0x8146*/
  }
  SourceBuffer_3 = SourceBuffer_2; /*0x8148*/
  SourceBuffer_1 = SourceBuffer; /*0x814b*/
  if ( !v4 ) /*0x8151*/
  {
    if ( i ) /*0x8156*/
    {
      SourceBuffer_2[i] = 0; /*0x8158*/
      v10 = Assert_11(SourceBuffer, SourceBuffer_2); /*0x815d*/
      SourceBuffer_2[i] = 46; /*0x8166*/
      if ( v10 <= 0 ) /*0x816e*/
        return -1; /*0x816e*/
      return v6; /*0x8175*/
    }
    return Assert_11(SourceBuffer_1, SourceBuffer_3); /*0x8156*/
  }
  SourceBuffer[v4] = 0; /*0x8177*/
  if ( !i ) /*0x817f*/
  {
    v12 = Assert_11(SourceBuffer, SourceBuffer_2); /*0x8181*/
    SourceBuffer[v4] = 46; /*0x818a*/
    if ( v12 < 0 ) /*0x8192*/
      return -1; /*0x8192*/
    return v6; /*0x8192*/
  }
  SourceBuffer_2[i] = 0; /*0x8198*/
  result = Assert_11(SourceBuffer, SourceBuffer_2); /*0x819d*/
  SourceBuffer[v4] = 46; /*0x81a2*/
  SourceBuffer_2[i] = 46; /*0x81a7*/
  if ( !result ) /*0x81af*/
  {
    SourceBuffer_3 = &SourceBuffer_2[i + 1]; /*0x81b9*/
    SourceBuffer_1 = &SourceBuffer[v4 + 1]; /*0x81bd*/
    return Assert_11(SourceBuffer_1, SourceBuffer_3); /*0x81c1*/
  }
  return result; /*0x81da*/
}


// Function: Assert_47 @ 0x81e8 (0x6e bytes)

__int64 __fastcall Assert_47(__int64 *a1, __int64 *a2)
{
  __int64 v2; // r8
  __int64 v3; // rax

  v2 = *a1; /*0x81e8*/
  v3 = *a2; /*0x81ef*/
  if ( *(_WORD *)(*a1 + 80) == 46 && *(_WORD *)(v2 + 82) == 46 && !*(_WORD *)(v2 + 84) ) /*0x8200*/
    return -1; /*0x8206*/
  if ( *(_WORD *)(v3 + 80) == 46 && *(_WORD *)(v3 + 82) == 46 && !*(_WORD *)(v3 + 84) ) /*0x8219*/
    return 1; /*0x821e*/
  if ( (*(_BYTE *)(v2 + 72) & 0x10) != 0 ) /*0x8239*/
  {
    if ( (*(_BYTE *)(v3 + 72) & 0x10) == 0 ) /*0x823d*/
      return -1; /*0x820c*/
  }
  else if ( (*(_BYTE *)(v3 + 72) & 0x10) == 0 ) /*0x8243*/
  {
    return Assert_41((const CHAR16 *)(v2 + 80), (const CHAR16 *)(v3 + 80)); /*0x8243*/
  }
  if ( (*(_BYTE *)(v2 + 72) & 0x10) == 0 ) /*0x8247*/
    return 1; /*0x8225*/
  return Assert_41((const CHAR16 *)(v2 + 80), (const CHAR16 *)(v3 + 80)); /*0x820c*/
}


// Function: Assert_2 @ 0x8258 (0x1fb bytes)

char **__fastcall Assert_2(__int64 a1)
{
  char **p_SourceBuffer; // r14
  CHAR16 *Pool; // rbx
  __int64 v4; // r15
  bool v5; // al
  CHAR16 *ZeroPool; // rsi
  UINTN v7; // rbp
  const CHAR16 *_%s__1; // r8
  char *DestinationBuffer; // r12
  const CHAR16 *_%s_; // r8
  UINTN AllocationSize; // [rsp+50h] [rbp+8h] BYREF

  p_SourceBuffer = (char **)ListAllocate(100, 112, 50); /*0x828b*/
  do /*0x8414*/
  {
    AllocationSize = 0; /*0x8296*/
    Pool = 0; /*0x82a3*/
    v4 = (*(__int64 (__fastcall **)(__int64, UINTN *, _QWORD))(a1 + 32))(a1, &AllocationSize, 0); /*0x82aa*/
    if ( v4 == 0x8000000000000005uLL ) /*0x82ba*/
    {
      Pool = (CHAR16 *)AllocatePool(AllocationSize); /*0x82d1*/
      v4 = (*(__int64 (__fastcall **)(__int64, UINTN *, CHAR16 *))(a1 + 32))(a1, &AllocationSize, Pool); /*0x82d8*/
    }
    if ( v4 >= 0 && AllocationSize && (Pool[40] != 46 || Pool[41]) ) /*0x82f8*/
    {
      if ( (Pool[36] & 6) != 0 ) /*0x8307*/
      {
        v5 = 0; /*0x831c*/
      }
      else
      {
        if ( !String ) /*0x8310*/
          goto LABEL_13; /*0x8310*/
        v5 = Assert_15(Pool + 40); /*0x8315*/
      }
      if ( v5 ) /*0x8321*/
      {
LABEL_13:
        ZeroPool = (CHAR16 *)AllocatePool(0x70u); /*0x8327*/
        *(_QWORD *)ZeroPool = Pool; /*0x8334*/
        v7 = (-(__int64)((Pool[36] & 0x10) != 0) & 0xFFFFFFFFFFFFFFFEuLL) + 49; /*0x8349*/
        if ( StrLen(Pool + 40) >= v7 ) /*0x8355*/
        {
          DestinationBuffer = (char *)AllocatePool(2 * v7 + 2); /*0x8399*/
          CopyMem(DestinationBuffer, Pool + 40, 2 * v7 - 6); /*0x839c*/
          *(_DWORD *)&DestinationBuffer[2 * v7 - 6] = 3014702; /*0x83a1*/
          *(_DWORD *)&DestinationBuffer[2 * v7 - 2] = 46; /*0x83ae*/
          _%s_ = (const CHAR16 *)"<%s>"; /*0x83b7*/
          if ( (Pool[36] & 0x10) == 0 ) /*0x83ca*/
            _%s_ = "%s"; /*0x83cc*/
          UnicodeSPrint(ZeroPool + 5, 0x64u, _%s_, Pool + 40); /*0x83d3*/
          AllocatePoolWithAssert(); /*0x83db*/
        }
        else
        {
          _%s__1 = (const CHAR16 *)"<%s>"; /*0x8362*/
          if ( (Pool[36] & 0x10) == 0 ) /*0x836e*/
            _%s__1 = "%s"; /*0x8370*/
          UnicodeSPrint(ZeroPool + 5, 0x64u, _%s__1, Pool + 40); /*0x8377*/
        }
        Assert_18(p_SourceBuffer, ZeroPool); /*0x83e9*/
        AllocatePoolWithAssert(); /*0x83f1*/
        continue; /*0x83fb*/
      }
    }
    if ( Pool ) /*0x8400*/
      AllocatePoolWithAssert(); /*0x8405*/
  }
  while ( AllocationSize && v4 >= 0 ); /*0x8414*/
  Assert_16( /*0x842e*/
    *p_SourceBuffer,
    (unsigned int)(*((_DWORD *)p_SourceBuffer + 3) / *((_DWORD *)p_SourceBuffer + 4)),
    *((unsigned int *)p_SourceBuffer + 4));
  return p_SourceBuffer; /*0x8445*/
}


// Function: Assert_3 @ 0x8454 (0x175 bytes)

unsigned __int64 __fastcall Assert_3(__int64 a1)
{
  __int64 v1; // rdi
  unsigned __int64 i_1; // r15
  _WORD *ZeroPool; // r14
  _WORD *ZeroPool_1; // rbp
  unsigned __int64 i; // rbx
  unsigned __int64 v7; // rcx
  __int64 v8; // rbx
  int v10; // [rsp+20h] [rbp-28h]
  unsigned __int16 v11; // [rsp+50h] [rbp+8h] BYREF

  v1 = 0; /*0x846e*/
  v11 = 0; /*0x8470*/
  i_1 = (unsigned int)(*(_DWORD *)(a1 + 12) / *(_DWORD *)(a1 + 16)); /*0x8480*/
  ZeroPool = AllocateZeroPool(4u); /*0x8490*/
  ZeroPool_1 = ZeroPool; /*0x8493*/
  for ( i = 0; i < i_1; ZeroPool += 20 ) /*0x849b*/
  {
    if ( i < (unsigned int)(*(_DWORD *)(a1 + 12) / *(_DWORD *)(a1 + 16)) ) /*0x84aa*/
      v7 = *(_QWORD *)a1 + i * *(unsigned int *)(a1 + 16); /*0x84b8*/
    else
      v7 = 0; /*0x84ac*/
    *ZeroPool = ReFlashGetHiiString(v7 + 10); /*0x84c4*/
    ++i; /*0x84c8*/
  }
  (*(void (__fastcall **)(__int64, __int64, __int64, const char *, CHAR16 *, _QWORD))(qword_F668 + 16))( /*0x8505*/
    qword_F668,
    qword_F680,
    3,
    "en-US",
    Pool,
    0);
  (*(void (__fastcall **)(__int64, __int64, __int64, const char *, __int64, _QWORD))(qword_F668 + 16))( /*0x8535*/
    qword_F668,
    qword_F680,
    4,
    "en-US",
    qword_D3F0,
    0);
  LOWORD(v10) = i_1; /*0x8559*/
  v8 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _WORD *, int, unsigned __int16 *))(qword_F678 + 104))( /*0x8565*/
         qword_F680,
         3,
         4,
         ZeroPool_1,
         v10,
         &v11);
  AllocatePoolWithAssert(); /*0x8568*/
  (*(void (__fastcall **)(__int64, __int64, __int64))(qword_F690 + 16))(qword_F690, qword_F680, qword_D338); /*0x8585*/
  if ( !v8 && v11 < (unsigned __int64)(unsigned int)(*(_DWORD *)(a1 + 12) / *(_DWORD *)(a1 + 16)) ) /*0x85a1*/
    return *(_QWORD *)a1 + v11 * (unsigned __int64)*(unsigned int *)(a1 + 16); /*0x85aa*/
  return v1; /*0x85bf*/
}


// Function: Assert_20 @ 0x85cc (0x6c bytes)

void __fastcall Assert_20(__int64 a1)
{
  unsigned int i_1; // eax
  unsigned __int64 i_2; // rdi
  unsigned __int64 i; // rsi

  i_1 = *(_DWORD *)(a1 + 12) / *(_DWORD *)(a1 + 16); /*0x85e0*/
  i_2 = 0; /*0x85e3*/
  for ( i = i_1; i_2 < i; ++i_2 ) /*0x85ec*/
  {
    if ( i_2 < (unsigned int)(*(_DWORD *)(a1 + 12) / *(_DWORD *)(a1 + 16)) /*0x8604*/
      && *(_QWORD *)a1 + i_2 * *(unsigned int *)(a1 + 16) )
    {
      AllocatePoolWithAssert(); /*0x860c*/
    }
  }
  AllocatePoolWithAssert(); /*0x861c*/
  AllocatePoolWithAssert(); /*0x8633*/
}


// Function: Assert_39 @ 0x8638 (0x1de bytes)

__int64 *__fastcall Assert_39(__int64 *a1)
{
  _DWORD *v1; // rdi
  UINTN i; // rax
  int i_1; // edx
  __int64 v4; // rcx
  char **v5; // rdi
  int v6; // ecx
  __int64 v7; // rdx
  __int64 v8; // rcx
  __int64 v9; // rax
  __int64 *v11; // rax
  __int64 *v12; // r8
  __int64 v13; // rax
  int v14; // edx
  __int64 i_2; // rcx
  __int64 v16; // [rsp+40h] [rbp+8h] BYREF

  v1 = (_DWORD *)(*a1 + 80); /*0x864c*/
  if ( *v1 != 3014702 || *(_WORD *)(*a1 + 84) ) /*0x8665*/
  {
    Assert_9((CHAR16 *)(*a1 + 80)); /*0x872e*/
    if ( dword_D400 ) /*0x8742*/
      v9 = qword_D410[dword_D400 - 1]; /*0x8746*/
    else
      v9 = 0; /*0x8750*/
    v16 = v9; /*0x8753*/
    if ( !v9 || (*(__int64 (__fastcall **)(__int64, __int64 *, _DWORD *, __int64, _QWORD))(v9 + 8))(v9, &v16, v1, 1, 0) ) /*0x877a*/
      return 0; /*0x8780*/
    v5 = Assert_2(v16); /*0x878c*/
  }
  else
  {
    for ( i = StrLen(Pool); Pool[i] != 92; --i ) /*0x8676*/
      ; /*0x8684*/
    if ( i ) /*0x8691*/
      Pool[i] = 0; /*0x8693*/
    else
      Pool[1] = 0; /*0x8699*/
    i_1 = ::i; /*0x869e*/
    v4 = qword_D350[::i]; /*0x86ab*/
    if ( v4 ) /*0x86b6*/
    {
      Assert_20(v4); /*0x86b8*/
      i_1 = ::i; /*0x86bd*/
      qword_D350[::i] = 0; /*0x86c3*/
    }
    if ( i_1 ) /*0x86cd*/
    {
      ::i = i_1 - 1; /*0x86d1*/
      v5 = (char **)qword_D350[i_1 - 1]; /*0x86d7*/
    }
    else
    {
      v5 = 0; /*0x86e1*/
    }
    v6 = dword_D400; /*0x86e4*/
    v7 = qword_D410[dword_D400]; /*0x86ea*/
    if ( v7 ) /*0x86f5*/
    {
      (*(void (__fastcall **)(__int64))(v7 + 16))(qword_D410[dword_D400]); /*0x86fa*/
      v6 = dword_D400; /*0x86fd*/
      qword_D410[dword_D400] = 0; /*0x8703*/
    }
    if ( v6 ) /*0x870d*/
    {
      dword_D400 = v6 - 1; /*0x8711*/
      v8 = qword_D410[v6 - 1]; /*0x8717*/
    }
    else
    {
      v8 = 0; /*0x8721*/
    }
    v16 = v8; /*0x8724*/
  }
  if ( !v5 ) /*0x8792*/
    return 0; /*0x875f*/
  v11 = (__int64 *)Assert_3((__int64)v5); /*0x8797*/
  v12 = v11; /*0x879c*/
  if ( !v11 ) /*0x87a2*/
    return v12; /*0x87a2*/
  v13 = *v11; /*0x87a4*/
  if ( (*(_BYTE *)(v13 + 72) & 0x10) == 0 ) /*0x87b2*/
    return v12; /*0x8803*/
  if ( *(_WORD *)(v13 + 80) != 46 || *(_WORD *)(v13 + 82) != 46 || *(_WORD *)(v13 + 84) ) /*0x87c2*/
  {
    v14 = dword_D400; /*0x87c8*/
    i_2 = (unsigned int)::i; /*0x87ce*/
    qword_D410[dword_D400] = v16; /*0x87d9*/
    qword_D350[i_2] = (__int64)v5; /*0x87e3*/
    ::i = i_2 + 1; /*0x87ed*/
    dword_D400 = v14 + 1; /*0x87f3*/
  }
  return Assert_39(v12); /*0x8810*/
}


// Function: Assert_40 @ 0x8818 (0x176 bytes)

unsigned __int64 __fastcall Assert_40(__int64 a1)
{
  char **v3; // rbx
  unsigned __int64 v4; // rax
  __int64 *v5; // rdi
  int i_1; // ecx
  __int64 v7; // rdx
  __int64 v8; // rax
  int v9; // eax
  unsigned int v10; // esi
  __int64 v11; // rbx
  unsigned int i; // esi
  __int64 i_2; // rbx
  __int64 v14; // [rsp+40h] [rbp+8h] BYREF

  if ( (*(__int64 (__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(a1 + 8) + 8LL))(*(_QWORD *)(a1 + 8), &v14) ) /*0x8839*/
    return 0; /*0x8839*/
  v3 = Assert_2(v14); /*0x8854*/
  if ( !v3 ) /*0x885a*/
    return 0; /*0x8843*/
  qword_D3F0 = a1 + 18; /*0x8865*/
  Pool = (CHAR16 *)AllocatePool(4u); /*0x8874*/
  *(_DWORD *)Pool = 92; /*0x887b*/
  v4 = Assert_3((__int64)v3); /*0x8881*/
  v5 = (__int64 *)v4; /*0x888d*/
  if ( v4 ) /*0x8893*/
  {
    if ( (*(_BYTE *)(*(_QWORD *)v4 + 72LL) & 0x10) != 0 ) /*0x88a3*/
    {
      i_1 = ::i; /*0x88a5*/
      v7 = (unsigned int)dword_D400; /*0x88ab*/
      v8 = v14; /*0x88b1*/
      qword_D350[::i] = (__int64)v3; /*0x88b6*/
      qword_D410[v7] = v8; /*0x88c0*/
      ::i = i_1 + 1; /*0x88ca*/
      dword_D400 = v7 + 1; /*0x88d3*/
      v5 = Assert_39(v5); /*0x88de*/
    }
    if ( v5 ) /*0x88e4*/
      Assert_9((CHAR16 *)(*v5 + 80)); /*0x88ed*/
  }
  v9 = dword_D400; /*0x88f2*/
  if ( !dword_D400 && v5 ) /*0x88ff*/
  {
    Assert_20((__int64)v3); /*0x8904*/
    v9 = dword_D400; /*0x8909*/
  }
  v10 = 0; /*0x890f*/
  if ( v9 ) /*0x8913*/
  {
    do /*0x8935*/
    {
      v11 = v10; /*0x8915*/
      (*(void (__fastcall **)(__int64))(qword_D410[v10] + 16))(qword_D410[v10]); /*0x8922*/
      ++v10; /*0x8925*/
      qword_D410[v11] = 0; /*0x8927*/
    }
    while ( v10 < dword_D400 ); /*0x8935*/
  }
  for ( i = 0; i < ::i; qword_D350[i_2] = 0 ) /*0x893f*/
  {
    i_2 = i; /*0x8941*/
    Assert_20(qword_D350[i++]); /*0x894b*/
  }
  ::i = 0; /*0x8965*/
  dword_D400 = 0; /*0x896b*/
  return (unsigned __int64)Pool & -(__int64)(v5 != 0); /*0x8985*/
}


// Function: Assert_7 @ 0x8990 (0xe2 bytes)

void *__fastcall Assert_7(unsigned __int64 *p_n0x40000000, _QWORD *a2)
{
  __int64 v2; // rax
  void *DestinationBuffer; // rbx
  char *Pool; // rdi
  __int64 v7; // rax
  UINTN AllocationSize; // [rsp+38h] [rbp+10h] BYREF

  v2 = *a2; /*0x89a5*/
  DestinationBuffer = 0; /*0x89b2*/
  AllocationSize = 0; /*0x89be*/
  Pool = 0; /*0x89c5*/
  v7 = (*(__int64 (__fastcall **)(__int64, void *, UINTN *, _QWORD))(v2 + 64))(v2, &unk_C740, &AllocationSize, 0); /*0x89c7*/
  if ( v7 == 0x8000000000000005uLL ) /*0x89d7*/
  {
    Pool = (char *)AllocatePool(AllocationSize); /*0x89f8*/
    v7 = (*(__int64 (__fastcall **)(_QWORD, void *, UINTN *, char *))(*a2 + 64LL))( /*0x89fb*/
           *a2,
           &unk_C740,
           &AllocationSize,
           Pool);
  }
  if ( v7 ) /*0x8a02*/
  {
    *p_n0x40000000 = 0; /*0x8a04*/
    return 0; /*0x8a07*/
  }
  else
  {
    *p_n0x40000000 = *((_QWORD *)Pool + 2); /*0x8a0f*/
    if ( *((_WORD *)Pool + 18) ) /*0x8a16*/
    {
      AllocationSize = 2 * StrLen((const CHAR16 *)Pool + 18) + 2; /*0x8a2b*/
      DestinationBuffer = AllocatePool(AllocationSize); /*0x8a40*/
      CopyMem(DestinationBuffer, Pool + 36, AllocationSize); /*0x8a43*/
    }
    (*(void (__fastcall **)(_QWORD))(*a2 + 16LL))(*a2); /*0x8a4e*/
    AllocatePoolWithAssert(); /*0x8a54*/
    return DestinationBuffer; /*0x8a59*/
  }
}


// Function: Assert_45 @ 0x8a74 (0x4a bytes)

char __fastcall Assert_45(__int64 i, char n3)
{
  __int64 j; // rbx

  for ( j = i; ; i = j ) /*0x8a81*/
  {
    if ( Assert_29(i) ) /*0x8aa1*/
      return -1; /*0x8aaa*/
    if ( Assert_38(j) == n3 ) /*0x8a94*/
      break; /*0x8a94*/
    j = Assert_31(j); /*0x8a9b*/
  }
  return Assert_35(j); /*0x8ab1*/
}


// Function: StrTruncate @ 0x8ac0 (0x83 bytes)

UINTN __fastcall StrTruncate(char *DestinationBuffer, const CHAR16 *SourceBuffer, UINTN n0x28)
{
  UINTN n0x28_1; // rax
  UINTN n0x28_2; // rbx

  n0x28_1 = StrLen(SourceBuffer); /*0x8ae0*/
  n0x28_2 = n0x28_1; /*0x8ae5*/
  if ( n0x28_1 >= n0x28 ) /*0x8af1*/
  {
    CopyMem(DestinationBuffer, SourceBuffer, 2 * n0x28 - 6); /*0x8b09*/
    CopyMem(&DestinationBuffer[2 * n0x28 - 6], L"...", 6u); /*0x8b26*/
    return n0x28; /*0x8b2b*/
  }
  else
  {
    CopyMem(DestinationBuffer, SourceBuffer, 2 * n0x28_1); /*0x8af7*/
    return n0x28_2; /*0x8afc*/
  }
}


// Function: DeviceTypeToStr @ 0x8b44 (0xfc bytes)

UINTN __fastcall DeviceTypeToStr(CHAR16 *StartOfBuffer, __int64 i)
{
  char n0xE; // al
  const CHAR16 *ATAPI; // rsi
  char n2; // al
  const CHAR16 *HDD; // rbp
  UINTN v8; // rdi
  UINTN v9; // rbx
  UINTN n40; // rax

  n0xE = Assert_45(i, 3); /*0x8b68*/
  if ( n0xE == 1 ) /*0x8b6f*/
  {
    ATAPI = L"ATAPI"; /*0x8ba9*/
  }
  else if ( n0xE == 2 ) /*0x8b73*/
  {
    ATAPI = L"SCSI"; /*0x8ba0*/
  }
  else
  {
    if ( n0xE != 5 ) /*0x8b77*/
    {
      if ( (unsigned __int8)n0xE <= 0xEu ) /*0x8b7b*/
      {
LABEL_8:
        ATAPI = L"Unknown"; /*0x8b8e*/
        goto LABEL_12; /*0x8b95*/
      }
      if ( (unsigned __int8)n0xE > 0x10u ) /*0x8b7f*/
      {
        if ( n0xE == 18 ) /*0x8b83*/
        {
          ATAPI = L"SATA"; /*0x8b85*/
          goto LABEL_12; /*0x8b8c*/
        }
        goto LABEL_8; /*0x8b83*/
      }
    }
    ATAPI = L"USB"; /*0x8b97*/
  }
LABEL_12:
  n2 = Assert_45(i, 4); /*0x8bb0*/
  if ( n2 == 1 ) /*0x8bc0*/
  {
    HDD = L"HDD"; /*0x8bd9*/
  }
  else if ( n2 == 2 ) /*0x8bc5*/
  {
    HDD = L"CDROM"; /*0x8bd0*/
  }
  else
  {
    HDD = L"Unknown"; /*0x8bc7*/
  }
  v8 = StrLen(ATAPI); /*0x8beb*/
  v9 = StrLen(HDD); /*0x8c0a*/
  UnicodeSPrint(StartOfBuffer, 0x50u, "%s %s", (const char *)HDD, (const char *)ATAPI); /*0x8c0d*/
  n40 = 40; /*0x8c28*/
  if ( v9 + v8 + 1 < 0x28 ) /*0x8c35*/
    return v9 + v8 + 1; /*0x8c35*/
  return n40; /*0x8c39*/
}


// Function: Assert @ 0x8c40 (0x228 bytes)

_DWORD *Assert()
{
  __int64 v0; // rsi
  _QWORD *p_SourceBuffer; // r15
  UINTN v2; // r14
  char *ZeroPool; // rdi
  unsigned __int64 n0x40000000_1; // rbx
  const CHAR16 *SourceBuffer; // rax
  UINTN BufferSize; // rdx
  CHAR16 *StartOfBuffer; // rcx
  __int64 v9; // [rsp+30h] [rbp-18h] BYREF
  _QWORD v10[2]; // [rsp+38h] [rbp-10h] BYREF
  __int64 v11; // [rsp+80h] [rbp+38h] BYREF
  unsigned __int64 n0x40000000; // [rsp+88h] [rbp+40h] BYREF
  __int64 i; // [rsp+90h] [rbp+48h] BYREF
  unsigned __int64 n100; // [rsp+98h] [rbp+50h] BYREF

  if ( (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(BootServices_0 + 312))( /*0x8c88*/
         2,
         &unk_C810,
         0,
         &n100,
         &v11)
    || !n100 )
  {
    return 0; /*0x8e59*/
  }
  v0 = 0; /*0x8c9e*/
  p_SourceBuffer = ListAllocate(n100, 120, 1); /*0x8ca0*/
  if ( n100 ) /*0x8ca7*/
  {
    while ( 1 ) /*0x8cc3*/
    {
      v2 = 0; /*0x8cc3*/
      if ( !(*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices_0 + 152))( /*0x8cca*/
              *(_QWORD *)(v11 + 8 * v0),
              &unk_C810,
              &v9) )
        break; /*0x8cca*/
LABEL_22:
      if ( ++v0 >= n100 ) /*0x8e40*/
        goto LABEL_23; /*0x8e40*/
    }
    ZeroPool = (char *)AllocateZeroPool(4u); /*0x8ce8*/
    *((_QWORD *)ZeroPool + 1) = v9; /*0x8ceb*/
    *(_QWORD *)ZeroPool = *(_QWORD *)(v11 + 8 * v0); /*0x8cf7*/
    if ( (*(__int64 (__fastcall **)(__int64, _QWORD *))(v9 + 8))(v9, v10) ) /*0x8d05*/
    {
      n0x40000000_1 = 0; /*0x8d0e*/
      n0x40000000 = 0; /*0x8d10*/
    }
    else
    {
      SourceBuffer = (const CHAR16 *)Assert_7(&n0x40000000, v10); /*0x8d1e*/
      if ( SourceBuffer ) /*0x8d29*/
      {
        v2 = StrTruncate(ZeroPool + 18, SourceBuffer, 0x28u); /*0x8d40*/
        AllocatePoolWithAssert(); /*0x8d43*/
        n0x40000000_1 = n0x40000000; /*0x8d48*/
LABEL_14:
        BufferSize = 100 - 2 * v2; /*0x8db8*/
        StartOfBuffer = (CHAR16 *)&ZeroPool[2 * v2 + 18]; /*0x8dc8*/
        if ( n0x40000000_1 >= 0x100000 ) /*0x8dd2*/
        {
          if ( n0x40000000_1 >= 0x40000000 ) /*0x8de8*/
          {
            if ( n0x40000000_1 >= 0x10000000000LL ) /*0x8e04*/
              UnicodeSPrint(StartOfBuffer, BufferSize, " %dTB", n0x40000000_1 >> 40); /*0x8e21*/
            else
              UnicodeSPrint(StartOfBuffer, BufferSize, (const CHAR16 *)" %dGB", n0x40000000_1 >> 30); /*0x8e11*/
          }
          else
          {
            UnicodeSPrint(StartOfBuffer, BufferSize, (const CHAR16 *)" %dMB", n0x40000000_1 >> 20); /*0x8df5*/
          }
        }
        else
        {
          UnicodeSPrint(StartOfBuffer, BufferSize, (const CHAR16 *)" %dKB", n0x40000000_1 >> 10); /*0x8ddf*/
        }
        Assert_18(p_SourceBuffer, (CHAR16 *)ZeroPool); /*0x8e2c*/
        AllocatePoolWithAssert(); /*0x8e34*/
        goto LABEL_22; /*0x8e34*/
      }
      n0x40000000_1 = n0x40000000; /*0x8d4e*/
    }
    (*(void (__fastcall **)(_QWORD, void *, __int64 *))(BootServices_0 + 152))(*(_QWORD *)(v11 + 8 * v0), &unk_C780, &i); /*0x8d6c*/
    if ( Assert_45(i, 3) == -1 && Assert_45(i, 4) == -1 ) /*0x8d8e*/
      StrTruncate(ZeroPool + 18, L"Unknown", 0x12u); /*0x8da1*/
    else
      v2 = DeviceTypeToStr((CHAR16 *)ZeroPool + 9, i); /*0x8db5*/
    goto LABEL_14; /*0x8da6*/
  }
LABEL_23:
  (*(void (__fastcall **)(__int64))(BootServices_0 + 72))(v11); /*0x8e46*/
  return p_SourceBuffer; /*0x8e5b*/
}


// Function: Assert_4 @ 0x8e68 (0x150 bytes)

_DWORD *Assert_4()
{
  const void *SourceBuffer; // rdi
  void *Pool; // rbp
  _DWORD *result; // rax
  _DWORD *v3; // rsi
  unsigned __int64 i_1; // r15
  _WORD *ZeroPool; // r14
  _WORD *ZeroPool_1; // r12
  unsigned __int64 i; // rbx
  unsigned __int64 v8; // rcx
  __int64 v9; // rbx
  unsigned __int16 v10; // [rsp+60h] [rbp+8h] BYREF

  SourceBuffer = 0; /*0x8e7e*/
  v10 = 0; /*0x8e80*/
  Pool = 0; /*0x8e85*/
  result = Assert(); /*0x8e87*/
  v3 = result; /*0x8e8c*/
  if ( result ) /*0x8e92*/
  {
    i_1 = (unsigned int)(result[3] / result[4]); /*0x8ea5*/
    ZeroPool = AllocateZeroPool(4u); /*0x8eb5*/
    ZeroPool_1 = ZeroPool; /*0x8eb8*/
    for ( i = 0; i < i_1; ZeroPool += 20 ) /*0x8ec1*/
    {
      if ( i < (unsigned int)(v3[3] / v3[4]) ) /*0x8ed0*/
        v8 = *(_QWORD *)v3 + i * (unsigned int)v3[4]; /*0x8ede*/
      else
        v8 = 0; /*0x8ed2*/
      *ZeroPool = ReFlashGetHiiString(v8 + 18); /*0x8eea*/
      ++i; /*0x8eee*/
    }
    v9 = (*(__int64 (__fastcall **)(__int64, __int64, __int64, _WORD *, _WORD, unsigned __int16 *))(qword_F678 + 104))( /*0x8f2a*/
           qword_F680,
           3,
           4,
           ZeroPool_1,
           i_1,
           &v10);
    AllocatePoolWithAssert(); /*0x8f2d*/
    if ( !v9 ) /*0x8f35*/
    {
      Pool = AllocatePool(0x78u); /*0x8f49*/
      if ( v10 < (unsigned __int64)(unsigned int)(v3[3] / v3[4]) ) /*0x8f59*/
        SourceBuffer = (const void *)(*(_QWORD *)v3 + v10 * (unsigned __int64)(unsigned int)v3[4]); /*0x8f62*/
      CopyMem(Pool, SourceBuffer, 0x78u); /*0x8f6e*/
    }
    AllocatePoolWithAssert(); /*0x8f76*/
    AllocatePoolWithAssert(); /*0x8f7e*/
    (*(void (__fastcall **)(__int64, __int64, __int64))(qword_F690 + 16))(qword_F690, qword_F680, qword_D338); /*0x8f9b*/
    return Pool; /*0x8f9e*/
  }
  return result; /*0x8fab*/
}


// Function: ListAllocate @ 0x8fb8 (0x5a bytes)

_DWORD *__fastcall ListAllocate(int n100, int n120, int n50)
{
  unsigned int AllocationSize; // ebx
  _DWORD *Pool; // rsi

  AllocationSize = n120 * n100; /*0x8fdd*/
  Pool = AllocatePool(0x18u); /*0x8fe0*/
  Pool[3] = 0; /*0x8fe3*/
  Pool[4] = n120; /*0x8fe7*/
  Pool[2] = AllocationSize; /*0x8fec*/
  Pool[5] = n50; /*0x8fef*/
  *(_QWORD *)Pool = AllocatePool(AllocationSize); /*0x9001*/
  return Pool; /*0x900c*/
}


// Function: Assert_18 @ 0x9014 (0x7a bytes)

__int64 __fastcall Assert_18(_QWORD *p_SourceBuffer, CHAR16 *ZeroPool)
{
  int v4; // ecx
  unsigned int AllocationSize; // r8d
  void *Pool; // rbx
  __int64 result; // rax

  v4 = *((_DWORD *)p_SourceBuffer + 2); /*0x9029*/
  if ( *((_DWORD *)p_SourceBuffer + 3) == v4 ) /*0x902f*/
  {
    AllocationSize = v4 + *((_DWORD *)p_SourceBuffer + 4) * *((_DWORD *)p_SourceBuffer + 5); /*0x903a*/
    *((_DWORD *)p_SourceBuffer + 2) = AllocationSize; /*0x9040*/
    Pool = AllocatePool(AllocationSize); /*0x9053*/
    CopyMem(Pool, (const void *)*p_SourceBuffer, *((unsigned int *)p_SourceBuffer + 3)); /*0x9056*/
    AllocatePoolWithAssert(); /*0x905e*/
    *p_SourceBuffer = Pool; /*0x9063*/
  }
  CopyMem( /*0x9073*/
    (void *)(*p_SourceBuffer + *((unsigned int *)p_SourceBuffer + 3)),
    ZeroPool,
    *((unsigned int *)p_SourceBuffer + 4));
  result = *((unsigned int *)p_SourceBuffer + 4); /*0x9078*/
  *((_DWORD *)p_SourceBuffer + 3) += result; /*0x907b*/
  return result; /*0x9088*/
}


// Function: ReFlashReadDmiArray @ 0x9090 (0x14e bytes)

void *ReFlashReadDmiArray()
{
  void *n1024; // rax
  unsigned __int8 v1; // si
  unsigned __int8 v2; // di
  _QWORD *v3; // rbx
  __int64 v4; // rdx
  __int64 v5; // [rsp+20h] [rbp-18h]
  __int64 v6; // [rsp+28h] [rbp-10h]

  n1024 = (void *)(*(__int64 (__fastcall **)(const wchar_t *, void *, _QWORD, __int64 *, char *))(RuntimeServices + 72))( /*0x90d3*/
                    L"DmiArray",
                    &unk_C850,
                    0,
                    &qword_D0E0,
                    byte_D4C0);
  if ( !n1024 ) /*0x90d9*/
  {
    v1 = byte_D4C0[0]; /*0x90df*/
    n1024 = &unk_E260; /*0x90e6*/
    v2 = 0; /*0x90ed*/
    dst = (char *)&unk_E260; /*0x90f0*/
    if ( byte_D4C0[0] ) /*0x90fa*/
    {
      v3 = &unk_DA60; /*0x9100*/
      do /*0x91b6*/
      {
        v4 = 5LL * ((unsigned int)v2 + 1); /*0x9114*/
        LODWORD(v6) = (unsigned __int8)byte_D4C0[v4 + 4]; /*0x9134*/
        LODWORD(v5) = (unsigned __int8)byte_D4C0[v4 + 3]; /*0x913f*/
        HiiConstructConfigAltString( /*0x9143*/
          L"                ",
          (const CHAR8 *)L"DmiVar%02x%04x%02x%02x",
          (unsigned __int8)byte_D4C0[v4],
          *(unsigned __int16 *)&byte_D4C0[v4 + 1],
          v5,
          v6);
        n1024 = 1024; /*0x9159*/
        n1024 = (void *)(*(__int64 (__fastcall **)(const wchar_t *, void *, _QWORD, unsigned __int64 *, char *))(RuntimeServices + 72))( /*0x9177*/
                          L"                ",
                          &unk_C850,
                          0,
                          &n1024,
                          src);
        if ( n1024 ) /*0x917d*/
        {
          *v3 = 0; /*0x91a8*/
        }
        else
        {
          InternalCopyMemOverlap(dst, src, n1024); /*0x9190*/
          n1024 = (void *)n1024; /*0x9195*/
          dst += n1024; /*0x919c*/
          *v3 = n1024; /*0x91a3*/
        }
        ++v2; /*0x91ac*/
        ++v3; /*0x91af*/
      }
      while ( v2 < v1 ); /*0x91b6*/
    }
    byte_D9C0 = 1; /*0x91bc*/
  }
  return n1024; /*0x91d7*/
}


// Function: ReFlashSaveDmiArray @ 0x91e0 (0x107 bytes)

_UNKNOWN **ReFlashSaveDmiArray()
{
  _UNKNOWN **result; // rax
  unsigned __int8 v1; // bl
  unsigned __int8 v2; // di
  _QWORD *v3; // rsi
  __int64 v4; // rdx
  __int64 v5; // [rsp+20h] [rbp-18h]
  __int64 v6; // [rsp+28h] [rbp-10h]
  _UNKNOWN *retaddr; // [rsp+38h] [rbp+0h] BYREF

  result = &retaddr; /*0x91e0*/
  v1 = 0; /*0x91f4*/
  if ( byte_D9C0 ) /*0x91fc*/
  {
    (*(void (__fastcall **)(const wchar_t *, void *, __int64, __int64, char *))(RuntimeServices + 88))( /*0x922f*/
      L"DmiArray",
      &unk_C850,
      7,
      qword_D0E0,
      byte_D4C0);
    v2 = byte_D4C0[0]; /*0x9232*/
    result = (_UNKNOWN **)&unk_E260; /*0x9239*/
    dst = (__int64)&unk_E260; /*0x9240*/
    if ( byte_D4C0[0] ) /*0x924a*/
    {
      v3 = &unk_DA60; /*0x9250*/
      do /*0x92d0*/
      {
        v4 = 5LL * ((unsigned int)v1 + 1); /*0x925c*/
        LODWORD(v6) = (unsigned __int8)byte_D4C0[v4 + 4]; /*0x927c*/
        LODWORD(v5) = (unsigned __int8)byte_D4C0[v4 + 3]; /*0x9287*/
        HiiConstructConfigAltString( /*0x928b*/
          (__int64)L"                ",
          (__int64)L"DmiVar%02x%04x%02x%02x",
          (unsigned __int8)byte_D4C0[v4],
          *(unsigned __int16 *)&byte_D4C0[v4 + 1],
          v5,
          v6);
        (*(void (__fastcall **)(const wchar_t *, void *, __int64, _QWORD, __int64))(RuntimeServices + 88))( /*0x92ba*/
          L"                ",
          &unk_C850,
          7,
          *v3,
          dst);
        result = (_UNKNOWN **)*v3; /*0x92bd*/
        ++v1; /*0x92c0*/
        dst += *v3++; /*0x92c2*/
      }
      while ( v1 < v2 ); /*0x92d0*/
    }
  }
  return result; /*0x92e1*/
}


// Function: ReFlashCheckSmbiosPreserve @ 0x92e8 (0x92 bytes)

__int64 ReFlashCheckSmbiosPreserve()
{
  _DWORD v1[4]; // [rsp+30h] [rbp-10h] BYREF
  char v2; // [rsp+50h] [rbp+10h] BYREF
  __int64 v3; // [rsp+58h] [rbp+18h] BYREF

  v1[0] = 1261470371; /*0x92f5*/
  v1[1] = 1300136134; /*0x9313*/
  v1[2] = 962121884; /*0x9321*/
  v1[3] = -245553641; /*0x9328*/
  v3 = 1; /*0x932f*/
  byte_D4B8 = 0; /*0x9337*/
  if ( (*(__int64 (__fastcall **)(const wchar_t *, _DWORD *, _QWORD, __int64 *, char *))(RuntimeServices + 72))( /*0x9344*/
         L"PreserveSmbiosNvramVar",
         v1,
         0,
         &v3,
         &v2) >= 0 )
  {
    byte_D4B8 = 1; /*0x9346*/
    ReFlashReadDmiArray(); /*0x934d*/
  }
  return (*(__int64 (__fastcall **)(const wchar_t *, _DWORD *, __int64))(RuntimeServices + 88))( /*0x9374*/
           L"PreserveSmbiosNvramVar",
           v1,
           3);
}


// Function: ReFlashSaveSmbiosIfNeeded @ 0x937c (0x1e bytes)

_UNKNOWN **ReFlashSaveSmbiosIfNeeded()
{
  _UNKNOWN **result; // rax

  if ( byte_D4B8 ) /*0x9387*/
    result = ReFlashSaveDmiArray(); /*0x9389*/
  byte_D4B8 = 0; /*0x938e*/
  return result; /*0x9395*/
}


// Function: ReFlashReadSfpRecord @ 0x939c (0x9b bytes)

__int64 ReFlashReadSfpRecord()
{
  __int64 v0; // rcx
  void *v1; // rax
  _DWORD v3[4]; // [rsp+30h] [rbp-10h] BYREF
  __int64 n8; // [rsp+50h] [rbp+10h] BYREF

  v0 = qword_D9C8; /*0x93a5*/
  n8 = 8; /*0x93ac*/
  v3[0] = 20351105; /*0x93b4*/
  v3[1] = 1260242093; /*0x93bb*/
  v3[2] = 2060792246; /*0x93c2*/
  v3[3] = 1809565838; /*0x93c9*/
  if ( !qword_D9C8 ) /*0x93d3*/
  {
    (*(void (__fastcall **)(const wchar_t *, _DWORD *, _QWORD, __int64 *, __int64 *))(RuntimeServices + 72))( /*0x93fa*/
      L"SFPFREC",
      v3,
      0,
      &n8,
      &qword_D9C8);
    v0 = qword_D9C8; /*0x93fd*/
  }
  n32 = 32; /*0x9407*/
  v1 = &unk_D9D0; /*0x940e*/
  n178 = 178; /*0x9415*/
  if ( v0 ) /*0x941f*/
    LODWORD(v1) = v0; /*0x941f*/
  dword_D0F7 = (int)v1; /*0x9422*/
  return ((__int64 (*)(void))loc_D0E8)(); /*0x9431*/
}


// Function: ReFlashReadSfpExtended @ 0x9438 (0x9b bytes)

__int64 ReFlashReadSfpExtended()
{
  __int64 v0; // rcx
  void *v1; // rax
  _DWORD v3[4]; // [rsp+30h] [rbp-10h] BYREF
  __int64 n8; // [rsp+50h] [rbp+10h] BYREF

  v0 = qword_D9C8; /*0x9441*/
  n8 = 8; /*0x9448*/
  v3[0] = 20351105; /*0x9450*/
  v3[1] = 1260242093; /*0x9457*/
  v3[2] = 2060792246; /*0x945e*/
  v3[3] = 1809565838; /*0x9465*/
  if ( !qword_D9C8 ) /*0x946f*/
  {
    (*(void (__fastcall **)(const wchar_t *, _DWORD *, _QWORD, __int64 *, __int64 *))(RuntimeServices + 72))( /*0x9496*/
      L"SFPFREC",
      v3,
      0,
      &n8,
      &qword_D9C8);
    v0 = qword_D9C8; /*0x9499*/
  }
  n32 = 36; /*0x94a3*/
  v1 = &unk_D9D0; /*0x94aa*/
  n178 = 178; /*0x94b1*/
  if ( v0 ) /*0x94bb*/
    LODWORD(v1) = v0; /*0x94bb*/
  dword_D0F7 = (int)v1; /*0x94be*/
  return ((__int64 (*)(void))loc_D0E8)(); /*0x94cd*/
}


// Function: ReFlashReadFlashLayoutFromBlockIo @ 0x94d4 (0x115 bytes)

__int64 __fastcall ReFlashReadFlashLayoutFromBlockIo(char *dst)
{
  __int64 result; // rax
  __int64 v3; // rbx
  __int64 v4; // r8
  unsigned __int64 v5; // [rsp+40h] [rbp-20h] BYREF
  __int64 v6; // [rsp+48h] [rbp-18h] BYREF
  __int64 v7; // [rsp+50h] [rbp-10h] BYREF
  char v8; // [rsp+88h] [rbp+28h] BYREF
  char *src; // [rsp+90h] [rbp+30h] BYREF
  __int64 v10; // [rsp+98h] [rbp+38h] BYREF

  result = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(BootServices + 312))( /*0x9504*/
             2,
             &unk_C790,
             0,
             &v5,
             &v10);
  if ( result >= 0 ) /*0x950d*/
  {
    v3 = 0; /*0x9513*/
    if ( v5 ) /*0x9519*/
    {
      while ( 1 ) /*0x9535*/
      {
        if ( (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(BootServices + 152))( /*0x953e*/
               *(_QWORD *)(v10 + 8 * v3),
               &unk_C790,
               &v7) >= 0 )
        {
          src = 0; /*0x9540*/
          v6 = 0; /*0x9549*/
          LOBYTE(v4) = 24; /*0x9561*/
          if ( (*(__int64 (__fastcall **)(__int64, void *, __int64, _QWORD, char **, __int64 *, char *))(v7 + 24))( /*0x957f*/
                 v7,
                 &unk_D108,
                 v4,
                 0,
                 &src,
                 &v6,
                 &v8) >= 0 )
            break; /*0x957f*/
        }
        if ( ++v3 >= v5 ) /*0x9588*/
          goto LABEL_6; /*0x9588*/
      }
      src += 16; /*0x95bb*/
      InternalCopyMemOverlap(dst, src, 0x78u); /*0x95bf*/
      src -= 16; /*0x95cf*/
      (*(void (__fastcall **)(__int64))(BootServices + 72))(v10); /*0x95d4*/
      (*(void (__fastcall **)(char *))(BootServices + 72))(src); /*0x95e2*/
      return 0; /*0x95e5*/
    }
    else
    {
LABEL_6:
      (*(void (__fastcall **)(__int64))(BootServices + 72))(v10); /*0x958a*/
      return 0x800000000000000EuLL; /*0x9598*/
    }
  }
  return result; /*0x95a2*/
}


// Function: ReFlashScanFlashSignature @ 0x95ec (0x86 bytes)

unsigned __int64 __fastcall ReFlashScanFlashSignature(char *dst, unsigned __int64 i)
{
  int v2; // esi
  _BYTE *j; // rbx
  unsigned __int64 j_1; // rax

  v2 = dword_D118; /*0x9600*/
  for ( j = (_BYTE *)(i + 16777200); *(_DWORD *)j != v2 || StrnCmp((unsigned __int64)&dword_D118, j, 0x10u); j -= 4 ) /*0x9606*/
  {
    j_1 = (unsigned __int64)j; /*0x9631*/
    if ( j_1 < i ) /*0x963b*/
      return 0x800000000000000EuLL; /*0x963d*/
  }
  InternalCopyMemOverlap(dst, j + 64, 0x78u); /*0x9669*/
  return 0; /*0x9656*/
}


// Function: HiiGetStringAndUpdate @ 0x9674 (0xe9 bytes)

signed __int64 __fastcall HiiGetStringAndUpdate(__int64 a1, __int64 a2, __int64 a3, __int64 a4)
{
  __int64 v4; // rbp
  __int64 v5; // rbx
  signed __int64 UnicodeString_1; // rcx
  __int64 v7; // rsi
  _QWORD *v8; // rdi
  __int64 v9; // r8
  _BYTE *v10; // rdx
  _QWORD *v11; // rdi
  unsigned __int64 UnicodeString; // rax
  _QWORD v14[2]; // [rsp+20h] [rbp-28h] BYREF
  _QWORD v15[3]; // [rsp+30h] [rbp-18h] BYREF

  v14[0] = a1; /*0x9688*/
  v4 = 1; /*0x968c*/
  v14[1] = a2; /*0x9691*/
  v15[0] = a3; /*0x9695*/
  v15[1] = a4; /*0x9699*/
  v5 = 0; /*0x96a2*/
  UnicodeString_1 = HiiInitUpdateContext(); /*0x96a4*/
  if ( UnicodeString_1 < 0 ) /*0x96aa*/
    return 0x8000000000000007uLL; /*0x96ac*/
  v7 = 0; /*0x96bb*/
  v8 = v14; /*0x96be*/
  do /*0x96f0*/
  {
    if ( v7 ) /*0x96c7*/
      break; /*0x96c7*/
    v9 = v8[1]; /*0x96c9*/
    v10 = (_BYTE *)*v8; /*0x96cd*/
    --v4; /*0x96d0*/
    v7 = 1; /*0x96e3*/
    v8 += 2; /*0x96e6*/
    UnicodeString_1 = HiiInternalApplyUpdate(UnicodeString_1, v10, v9, v4 == 0); /*0x96ea*/
  }
  while ( UnicodeString_1 >= 0 ); /*0x96f0*/
  if ( UnicodeString_1 >= 0 ) /*0x96f5*/
  {
    while ( !HiiCheckUpdateState((char *)0xFED40018LL, 16) ) /*0x9705*/
      ; /*0x96f7*/
    v11 = v15; /*0x9711*/
    UnicodeString_1 = 0x8000000000000005uLL; /*0x9716*/
    do /*0x9738*/
    {
      if ( v5 ) /*0x971d*/
        break; /*0x971d*/
      UnicodeString = HiiInternalGetUnicodeString(UnicodeString_1, (_BYTE *)*v11, v11 + 1); /*0x9726*/
      v5 = 1; /*0x972b*/
      v11 += 2; /*0x972e*/
      UnicodeString_1 = UnicodeString; /*0x9732*/
    }
    while ( UnicodeString == 0x8000000000000005uLL ); /*0x9738*/
    MEMORY[0xFED40018] = 64; /*0x973c*/
  }
  return UnicodeString_1; /*0x9757*/
}


// Function: ReFlashVerifyUpdate @ 0x9760 (0xb3 bytes)

unsigned __int64 ReFlashVerifyUpdate()
{
  int buf; // [rsp+20h] [rbp-30h] BYREF
  int v2; // [rsp+26h] [rbp-2Ah]
  __int16 v3; // [rsp+30h] [rbp-20h] BYREF
  int n167772160; // [rsp+32h] [rbp-1Eh]
  int n1862270976; // [rsp+36h] [rbp-1Ah]
  __int16 v6; // [rsp+40h] [rbp-10h] BYREF
  int n184549376; // [rsp+42h] [rbp-Eh]
  int n1912602624; // [rsp+46h] [rbp-Ah]
  char v9; // [rsp+4Ah] [rbp-6h]

  n167772160 = 167772160; /*0x9775*/
  n1862270976 = 1862270976; /*0x9781*/
  v3 = -16128; /*0x978c*/
  InternalSetMem16(&buf, 0xAu, 0); /*0x9796*/
  if ( HiiGetStringAndUpdate((__int64)&v3, 10, (__int64)&buf, 10) < 0 ) /*0x97b0*/
    return 0x800000000000001AuLL; /*0x97b0*/
  if ( v2 ) /*0x97b6*/
    return 0x800000000000001AuLL; /*0x97b6*/
  v6 = -16128; /*0x97bb*/
  n184549376 = 184549376; /*0x97c1*/
  n1912602624 = 1912602624; /*0x97cc*/
  v9 = 0; /*0x97d3*/
  InternalSetMem16(&buf, 0xAu, 0); /*0x97d7*/
  HiiGetStringAndUpdate((__int64)&v6, 11, (__int64)&buf, 10); /*0x97ea*/
  if ( v2 ) /*0x97f3*/
    return 0x800000000000001AuLL; /*0x97f9*/
  else
    return 0; /*0x97f5*/
}


// Function: ReFlashExecuteUpdate @ 0x9814 (0x293 bytes)

char ReFlashExecuteUpdate()
{
  char n2; // bl
  int n30000; // esi
  int n5; // edi
  bool v3; // zf
  __int16 v5; // [rsp+20h] [rbp-89h] BYREF
  int n201326592_1; // [rsp+22h] [rbp-87h]
  int n167772224; // [rsp+26h] [rbp-83h]
  __int16 n0x2000; // [rsp+2Ah] [rbp-7Fh]
  int buf_1[4]; // [rsp+30h] [rbp-79h] BYREF
  __int16 v10; // [rsp+40h] [rbp-69h] BYREF
  int n201326592; // [rsp+42h] [rbp-67h]
  int v12; // [rsp+46h] [rbp-63h]
  __int16 n256; // [rsp+4Ah] [rbp-5Fh]
  __int16 v14; // [rsp+50h] [rbp-59h] BYREF
  int n167772160; // [rsp+52h] [rbp-57h]
  int n1560281088; // [rsp+56h] [rbp-53h]
  __int16 v17; // [rsp+60h] [rbp-49h] BYREF
  int n369098752; // [rsp+62h] [rbp-47h]
  int n1694498816; // [rsp+66h] [rbp-43h]
  int n0x4000000; // [rsp+6Ah] [rbp-3Fh]
  int n0x4000000_1; // [rsp+6Eh] [rbp-3Bh]
  int n134283264; // [rsp+72h] [rbp-37h]
  __int16 v23; // [rsp+78h] [rbp-31h] BYREF
  int n369098752_1; // [rsp+7Ah] [rbp-2Fh]
  int n1694498816_1; // [rsp+7Eh] [rbp-2Bh]
  int n0x4000000_2; // [rsp+82h] [rbp-27h]
  int n0x4000000_3; // [rsp+86h] [rbp-23h]
  int n151060480; // [rsp+8Ah] [rbp-1Fh]
  int buf[4]; // [rsp+90h] [rbp-19h] BYREF
  int buf_; // [rsp+A0h] [rbp-9h] BYREF
  int v31; // [rsp+A6h] [rbp-3h]
  _BYTE v32[6]; // [rsp+B0h] [rbp+7h] BYREF
  int v33; // [rsp+B6h] [rbp+Dh]
  char v34; // [rsp+C3h] [rbp+1Ah]
  _BYTE v35[6]; // [rsp+C8h] [rbp+1Fh] BYREF
  int n637534208; // [rsp+CEh] [rbp+25h]

  n2 = 0; /*0x9838*/
  if ( ReFlashSpiCheckControllerId() || MEMORY[0xFED40000] == 0xFF || !MEMORY[0xFED40000] ) /*0x985e*/
    return 0; /*0x9a88*/
  if ( (MEMORY[0xFED40000] & 0x20) == 0 ) /*0x9875*/
  {
    n30000 = 30000; /*0x9879*/
    MEMORY[0xFED40000] = 2; /*0x987e*/
    do /*0x98b0*/
    {
      n5 = 5; /*0x988b*/
      do /*0x989d*/
      {
        Assert_43(0x6Bu); /*0x9895*/
        --n5; /*0x989a*/
      }
      while ( n5 ); /*0x989d*/
      if ( (MEMORY[0xFED40000] & 0x20) != 0 && MEMORY[0xFED40000] < 0 ) /*0x98ab*/
        break; /*0x98ab*/
      --n30000; /*0x98ad*/
    }
    while ( n30000 ); /*0x98b0*/
  }
  n369098752 = 369098752; /*0x98bc*/
  v17 = -16128; /*0x98c3*/
  if ( !ReFlashSpiCheckControllerId() ) /*0x98c7*/
  {
    n1694498816 = 1694498816; /*0x98e3*/
    n0x4000000 = 0x4000000; /*0x98ee*/
    n0x4000000_1 = 0x4000000; /*0x98f5*/
    n134283264 = 134283264; /*0x98fd*/
    HiiGetStringAndUpdate((__int64)&v17, 22, (__int64)v35, 36); /*0x9904*/
    if ( n637534208 == 637534208 ) /*0x9910*/
    {
      v10 = -16128; /*0x991c*/
      n256 = 256; /*0x9923*/
      n201326592 = 201326592; /*0x992a*/
      v12 = -1728053248; /*0x9935*/
      InternalSetMem16(buf, 0xAu, 0); /*0x993c*/
      HiiGetStringAndUpdate((__int64)&v10, 12, (__int64)buf, 10); /*0x9951*/
      v3 = *(int *)((char *)&buf[1] + 2) == 0; /*0x9956*/
    }
    else
    {
      v3 = n637534208 == 0; /*0x9912*/
    }
    if ( !v3 ) /*0x9959*/
      return 2; /*0x9959*/
  }
  v5 = -16128; /*0x9967*/
  n0x2000 = 0x2000; /*0x996f*/
  n201326592_1 = 201326592; /*0x9976*/
  n167772224 = 167772224; /*0x9982*/
  InternalSetMem16(buf_1, 0xAu, 0); /*0x998a*/
  HiiGetStringAndUpdate((__int64)&v5, 12, (__int64)buf_1, 10); /*0x99a0*/
  InternalSetMem16(buf_1, 0xAu, 0); /*0x99af*/
  n0x2000 = 2048; /*0x99c0*/
  HiiGetStringAndUpdate((__int64)&v5, 12, (__int64)buf_1, 10); /*0x99ce*/
  if ( *(int *)((char *)&buf_1[1] + 2) ) /*0x99d6*/
    return 2; /*0x995b*/
  v23 = -16128; /*0x99d8*/
  n369098752_1 = 369098752; /*0x99dc*/
  if ( ReFlashSpiCheckControllerId() /*0x9a1c*/
    || (n1694498816_1 = 1694498816,
        n0x4000000_2 = 0x4000000,
        n0x4000000_3 = 0x4000000,
        n151060480 = 151060480,
        HiiGetStringAndUpdate((__int64)&v23, 22, (__int64)v32, 21),
        !v33) )
  {
    if ( v34 ) /*0x9a21*/
      return 3; /*0x9a23*/
  }
  v14 = -16128; /*0x9a2a*/
  n167772160 = 167772160; /*0x9a31*/
  n1560281088 = 1560281088; /*0x9a3c*/
  InternalSetMem16(&buf_, 0xAu, 0); /*0x9a43*/
  HiiGetStringAndUpdate((__int64)&v14, 10, (__int64)&buf_, 10); /*0x9a56*/
  if ( v31 ) /*0x9a60*/
  {
    if ( ((v31 - 100663296) & 0xFEFFFFFF) != 0 || (n2 = 1, (ReFlashVerifyUpdate() & 0x8000000000000000uLL) != 0LL) ) /*0x9a78*/
      n2 = 2; /*0x9a7a*/
  }
  Assert_51((char *)0xFED40000LL); /*0x9a7f*/
  return n2; /*0x9a9e*/
}


// Function: DebugLibGetDebugMask @ 0x9aa8 (0x4e bytes)

__int64 DebugLibGetDebugMask()
{
  unsigned __int8 v0; // al
  char n3_1; // al
  char n3; // cl
  __int64 result; // rax

  v0 = __inbyte(0x70u); /*0x9aad*/
  __outbyte(0x70u, v0 & 0x80 | 0x4B); /*0x9ab2*/
  n3_1 = __inbyte(0x71u); /*0x9ab8*/
  n3 = n3_1; /*0x9ab9*/
  if ( (unsigned __int8)n3_1 > 3u ) /*0x9ac0*/
  {
    n3 = n3; /*0x9ac2*/
    if ( !n3 ) /*0x9aca*/
      n3 = MEMORY[0xFDAF0490] & 2 | 1; /*0x9ad6*/
  }
  if ( (unsigned __int8)(n3 - 1) > 0xFDu ) /*0x9ae0*/
    return 0; /*0x9af3*/
  result = 2147483718LL; /*0x9ae5*/
  if ( n3 == 1 ) /*0x9aef*/
    return 2147483652LL; /*0x9aef*/
  return result; /*0x9af2*/
}


// Function: Assert_32 @ 0x9af8 (0x34 bytes)

__int64 __fastcall Assert_32(_WORD *PcdVal)
{
  if ( ((unsigned __int8)PcdVal & 1) != 0 ) /*0x9b04*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLib.c", 0xB7u, "(Address & 1) == 0"); /*0x9b19*/
  *PcdVal = 1280; /*0x9b23*/
  return 1280; /*0x9b26*/
}


// Function: Assert_33 @ 0x9b2c (0x30 bytes)

unsigned __int32 __fastcall Assert_33(unsigned __int16 n1288)
{
  if ( (n1288 & 3) != 0 ) /*0x9b38*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 0xC1u, "(Port & 3) == 0"); /*0x9b4d*/
  return __indword(n1288); /*0x9b56*/
}


// Function: SetMem @ 0x9b5c (0x6e bytes)

void *__cdecl SetMem(void *Buffer, UINTN Length, UINT8 Value)
{
  if ( !Length ) /*0x9b6f*/
    return Buffer; /*0x9b71*/
  if ( !Buffer ) /*0x9b79*/
    DebugAssert("e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c", 0x35u, "Buffer != ((void *) 0)"); /*0x9b8c*/
  if ( Length > -(__int64)Buffer ) /*0x9b9a*/
    DebugAssert( /*0x9baf*/
      "e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
      0x36u,
      "Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)");
  return InternalIsZeroBuffer((char *)Buffer, Length, Value); /*0x9bc4*/
}


// Function: AssertCpuDeadLoop @ 0x9bcc (0x8c bytes)

__int64 AssertCpuDeadLoop()
{
  __int64 result; // rax
  __int64 v1; // rax

  result = qword_D9E8; /*0x9bd0*/
  if ( !qword_D9E8 ) /*0x9bda*/
  {
    v1 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_C700, 0, &qword_D9E8); /*0x9bf3*/
    if ( v1 < 0 ) /*0x9bfc*/
    {
      DebugPrint(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v1); /*0x9c0d*/
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 0x4Eu, "!EFI_ERROR (Status)"); /*0x9c25*/
    }
    result = qword_D9E8; /*0x9c2a*/
    if ( !qword_D9E8 ) /*0x9c34*/
    {
      DebugAssert("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 0x4Fu, "mPcd != ((void *) 0)"); /*0x9c47*/
      return qword_D9E8; /*0x9c4c*/
    }
  }
  return result; /*0x9c53*/
}


// Function: Assert_1 @ 0x9c58 (0x203 bytes)

void __fastcall Assert_1(
        char *SourceBuffer,
        unsigned __int64 n2,
        UINTN Length,
        __int64 (__fastcall *Assert_47)(_QWORD, _QWORD),
        void *DestinationBuffer)
{
  __int64 (__fastcall *Assert_47_1)(_QWORD, _QWORD); // rbx
  unsigned __int64 n2_2; // rbp
  char *SourceBuffer_2; // rsi
  char *SourceBuffer_5; // rbx
  unsigned __int64 v10; // rbp
  char *SourceBuffer_3; // rax
  unsigned __int64 n2a_1; // rsi
  char *SourceBuffera; // [rsp+30h] [rbp-48h]
  char *SourceBuffer_4; // [rsp+38h] [rbp-40h]
  unsigned __int64 n2a; // [rsp+40h] [rbp-38h]
  char *SourceBuffer_1; // [rsp+80h] [rbp+8h]
  unsigned __int64 n2_1; // [rsp+88h] [rbp+10h]

  n2_1 = n2; /*0x9c63*/
  SourceBuffer_1 = SourceBuffer; /*0x9c67*/
  Assert_47_1 = Assert_47; /*0x9c72*/
  n2_2 = n2; /*0x9c78*/
  SourceBuffer_2 = SourceBuffer; /*0x9c7b*/
  while ( 1 ) /*0x9c7e*/
  {
    if ( !SourceBuffer_2 ) /*0x9c81*/
      DebugAssert("e:\\hs\\MdeModulePkg\\Library\\BaseSortLib\\BaseSortLib.c", 0x3Au, "BufferToSort != ((void *) 0)"); /*0x9c94*/
    if ( !Assert_47_1 ) /*0x9c9c*/
      DebugAssert("e:\\hs\\MdeModulePkg\\Library\\BaseSortLib\\BaseSortLib.c", 0x3Bu, "CompareFunction != ((void *) 0)"); /*0x9caf*/
    if ( !DestinationBuffer ) /*0x9cbd*/
      DebugAssert("e:\\hs\\MdeModulePkg\\Library\\BaseSortLib\\BaseSortLib.c", 0x3Cu, "Buffer != ((void *) 0)"); /*0x9cd2*/
    if ( n2_2 < 2 || !Length ) /*0x9ce5*/
      break; /*0x9ce5*/
    SourceBuffer_5 = &SourceBuffer_2[Length * (n2_2 - 1)]; /*0x9d01*/
    v10 = n2_2 - 1; /*0x9d12*/
    SourceBuffer_3 = SourceBuffer_2; /*0x9d17*/
    SourceBuffera = SourceBuffer_2; /*0x9d1a*/
    n2a_1 = 0; /*0x9d1f*/
    SourceBuffer_4 = SourceBuffer_3; /*0x9d24*/
    do /*0x9d90*/
    {
      if ( Assert_47(SourceBuffer_3, SourceBuffer_5) <= 0 ) /*0x9d39*/
      {
        CopyMem(DestinationBuffer, SourceBuffera, Length); /*0x9d4b*/
        CopyMem(SourceBuffera, SourceBuffer_4, Length); /*0x9d5d*/
        CopyMem(SourceBuffer_4, DestinationBuffer, Length); /*0x9d72*/
        ++n2a_1; /*0x9d77*/
        SourceBuffera += Length; /*0x9d7a*/
      }
      SourceBuffer_3 = &SourceBuffer_4[Length]; /*0x9d84*/
      SourceBuffer_4 += Length; /*0x9d87*/
      --v10; /*0x9d8c*/
    }
    while ( v10 ); /*0x9d90*/
    n2a = n2a_1; /*0x9d9a*/
    CopyMem(DestinationBuffer, SourceBuffer_5, Length); /*0x9db5*/
    CopyMem(SourceBuffer_5, &SourceBuffer_1[Length * n2a_1], Length); /*0x9dd1*/
    CopyMem(&SourceBuffer_1[Length * n2a_1], DestinationBuffer, Length); /*0x9de4*/
    if ( n2a_1 >= 2 ) /*0x9df2*/
      Assert_1(SourceBuffer_1, n2a_1, Length, Assert_47, DestinationBuffer); /*0x9e12*/
    n2_2 = n2_1 - n2a_1 - 1; /*0x9e1a*/
    n2_1 = n2_2; /*0x9e1d*/
    if ( n2_2 < 2 ) /*0x9e29*/
      break; /*0x9e29*/
    Assert_47_1 = Assert_47; /*0x9e2f*/
    SourceBuffer_2 = &SourceBuffer_1[Length * (n2a_1 + 1)]; /*0x9e3b*/
    SourceBuffer_1 += Length * (n2a + 1); /*0x9e3e*/
  }
}


// Function: Assert_16 @ 0x9e5c (0x9d bytes)

void __fastcall Assert_16(char *SourceBuffer, unsigned __int64 n2, UINTN Length)
{
  void *DestinationBuffer; // rbx

  if ( !SourceBuffer ) /*0x9e7c*/
    DebugAssert("e:\\hs\\MdeModulePkg\\Library\\BaseSortLib\\BaseSortLib.c", 0x9Fu, "BufferToSort != ((void *) 0)"); /*0x9e91*/
  DestinationBuffer = AllocateZeroPool(4u); /*0x9ea3*/
  if ( !DestinationBuffer ) /*0x9ea9*/
    DebugAssert("e:\\hs\\MdeModulePkg\\Library\\BaseSortLib\\BaseSortLib.c", 0xA3u, "Buffer != ((void *) 0)"); /*0x9ebe*/
  Assert_1(SourceBuffer, n2, Length, (__int64 (__fastcall *)(_QWORD, _QWORD))Assert_47, DestinationBuffer); /*0x9ed8*/
  AllocatePoolWithAssert(); /*0x9ef4*/
}


// Function: Assert_50 @ 0x9efc (0x20 bytes)

__int64 __fastcall Assert_50(int n5)
{
  int n5_1; // ebx
  __int64 result; // rax

  if ( n5 ) /*0x9efe*/
  {
    n5_1 = n5; /*0x9f05*/
    do /*0x9f14*/
    {
      result = Assert_43(0x6Bu); /*0x9f0c*/
      --n5_1; /*0x9f11*/
    }
    while ( n5_1 ); /*0x9f14*/
  }
  return result; /*0x9f1b*/
}


// Function: HiiCheckUpdateState @ 0x9f1c (0x5c bytes)

char __fastcall HiiCheckUpdateState(char *a1, char a2)
{
  int n30000; // edi
  int n5; // esi

  n30000 = 30000; /*0x9f36*/
  while ( 1 ) /*0x9f3b*/
  {
    n5 = 5; /*0x9f3b*/
    do /*0x9f4d*/
    {
      Assert_43(0x6Bu); /*0x9f45*/
      --n5; /*0x9f4a*/
    }
    while ( n5 ); /*0x9f4d*/
    if ( !--n30000 ) /*0x9f52*/
      break; /*0x9f52*/
    if ( *a1 < 0 ) /*0x9f58*/
      return a2 & *a1; /*0x9f5f*/
  }
  return 0; /*0x9f72*/
}


// Function: Assert_48 @ 0x9f78 (0x5b bytes)

__int64 Assert_48()
{
  __int64 n7500; // rbx
  int n5; // edi
  __int64 result; // rax

  n7500 = 7500; /*0x9f8d*/
  do /*0x9fbb*/
  {
    n5 = 5; /*0x9f98*/
    do /*0x9faa*/
    {
      Assert_43(0x6Bu); /*0x9fa2*/
      --n5; /*0x9fa7*/
    }
    while ( n5 ); /*0x9faa*/
    result = MEMORY[0xFED40019]; /*0x9fac*/
    --n7500; /*0x9fb0*/
  }
  while ( !MEMORY[0xFED40019] && n7500 ); /*0x9fbb*/
  return result; /*0x9fcc*/
}


// Function: Assert_51 @ 0x9fd4 (0xab bytes)

unsigned __int64 __fastcall Assert_51(char *a1)
{
  int n7500; // [rsp+20h] [rbp-18h]

  n7500 = 7500; /*0x9fdd*/
  if ( !HiiCheckUpdateState(a1, 32) ) /*0x9fef*/
    return 0x8000000000000007uLL; /*0x9ffb*/
  *a1 = 32; /*0xa00c*/
  if ( !HiiCheckUpdateState(a1, 32) ) /*0xa019*/
    return 0; /*0xa019*/
  do /*0xa054*/
  {
    Assert_50(5); /*0xa02a*/
    --n7500; /*0xa035*/
  }
  while ( HiiCheckUpdateState(a1, 32) && n7500 ); /*0xa054*/
  if ( HiiCheckUpdateState(a1, 32) ) /*0xa060*/
    return 0x8000000000000007uLL; /*0xa06c*/
  else
    return 0; /*0xa078*/
}


// Function: HiiInitUpdateContext @ 0xa080 (0xa8 bytes)

unsigned __int64 HiiInitUpdateContext()
{
  __int64 v0; // rbx
  __int64 n2; // rbp
  __int64 n30000; // rdi
  int n5; // esi

  v0 = 0; /*0xa0a5*/
  if ( !HiiCheckUpdateState((char *)0xFED40000LL, 32) ) /*0xa0a0*/
    return 0x8000000000000013uLL; /*0xa0ab*/
  n2 = 2; /*0xa0b7*/
  do /*0xa0f7*/
  {
    n30000 = 30000; /*0xa0c2*/
    MEMORY[0xFED40018] = 64; /*0xa0c7*/
    do /*0xa0ec*/
    {
      --n30000; /*0xa0cb*/
      n5 = 5; /*0xa0ce*/
      do /*0xa0e0*/
      {
        Assert_43(0x6Bu); /*0xa0d8*/
        --n5; /*0xa0dd*/
      }
      while ( n5 ); /*0xa0e0*/
    }
    while ( (MEMORY[0xFED40018] & 0x40) == 0 && n30000 ); /*0xa0ec*/
    if ( n30000 ) /*0xa0f1*/
      break; /*0xa0f1*/
    --n2; /*0xa0f3*/
  }
  while ( n2 ); /*0xa0f7*/
  if ( !n30000 ) /*0xa106*/
    return 0x8000000000000007uLL; /*0xa106*/
  return v0; /*0xa121*/
}


// Function: HiiInternalApplyUpdate @ 0xa128 (0xf8 bytes)

unsigned __int64 __fastcall HiiInternalApplyUpdate(signed __int64 UnicodeString, _BYTE *a2, __int64 a3, char a4)
{
  __int64 v7; // rbx
  __int16 v8; // cx

  if ( !a3 ) /*0xa14c*/
    return -(__int64)(a4 != 0) & 0x8000000000000002uLL; /*0xa161*/
  if ( (MEMORY[0xFED40000] & 0x20) == 0 ) /*0xa16a*/
    return 0x8000000000000015uLL; /*0xa16a*/
  v7 = a3 - 1; /*0xa17e*/
  if ( !a4 ) /*0xa182*/
    v7 = a3; /*0xa182*/
LABEL_11:
  if ( v7 ) /*0xa1bd*/
  {
    v8 = Assert_48(); /*0xa18d*/
    if ( !v8 ) /*0xa193*/
      return 0x8000000000000012uLL; /*0xa214*/
    while ( v7 ) /*0xa19d*/
    {
      --v7; /*0xa1a1*/
      MEMORY[0xFED40024] = *a2++; /*0xa1a4*/
      if ( !--v8 ) /*0xa1b8*/
        goto LABEL_11; /*0xa1b8*/
    }
  }
  if ( a4 ) /*0xa1c2*/
  {
    if ( !HiiCheckUpdateState((char *)0xFED40018LL, 8) ) /*0xa1cd*/
      return 0x8000000000000015uLL; /*0xa1cd*/
    MEMORY[0xFED40024] = *a2; /*0xa1dc*/
    if ( HiiCheckUpdateState((char *)0xFED40018LL, 8) ) /*0xa1e5*/
      return 0x8000000000000015uLL; /*0xa176*/
    MEMORY[0xFED40018] = 32; /*0xa1f4*/
  }
  return 0; /*0xa20e*/
}


// Function: HiiInternalGetUnicodeString @ 0xa220 (0xc3 bytes)

unsigned __int64 __fastcall HiiInternalGetUnicodeString(signed __int64 UnicodeString, _BYTE *a2, _QWORD *a3)
{
  _BYTE *v4; // rdi
  _BYTE *v5; // rbx
  __int16 v6; // si

  v4 = &a2[*a3]; /*0xa23f*/
  v5 = a2; /*0xa242*/
  if ( a2 < v4 ) /*0xa24d*/
  {
LABEL_2:
    if ( HiiCheckUpdateState((char *)0xFED40018LL, 16) ) /*0xa254*/
    {
      v6 = Assert_48(); /*0xa262*/
      if ( !v6 ) /*0xa268*/
        return 0x8000000000000012uLL; /*0xa2d7*/
      while ( v5 < v4 ) /*0xa26d*/
      {
        if ( HiiCheckUpdateState((char *)0xFED40018LL, 16) ) /*0xa274*/
        {
          *v5++ = MEMORY[0xFED40024]; /*0xa286*/
          if ( --v6 ) /*0xa293*/
            continue; /*0xa293*/
        }
        if ( v5 < v4 ) /*0xa298*/
          goto LABEL_2; /*0xa298*/
        break; /*0xa298*/
      }
    }
  }
  *a3 += v5 - v4; /*0xa29a*/
  return -(__int64)(HiiCheckUpdateState((char *)0xFED40018LL, 16) != 0) & 0x8000000000000005uLL; /*0xa2d0*/
}


// Function: ReFlashSpiCheckControllerId @ 0xa2e4 (0x3c bytes)

char ReFlashSpiCheckControllerId()
{
  unsigned __int64 n0xC; // rdx

  n0xC = 0; /*0xa2f5*/
  while ( *(_WORD *)((char *)&unk_D128 + n0xC) != MEMORY[0xFED40F00] /*0xa30e*/
       || *(_WORD *)((char *)&unk_D128 + n0xC + 2) != MEMORY[0xFED40F02] )
  {
    n0xC += 4LL; /*0xa310*/
    if ( n0xC >= 0xC ) /*0xa318*/
      return 0; /*0xa31c*/
  }
  return 1; /*0xa31c*/
}


// Function: InternalSetMem16 @ 0xa37e (0x4f bytes)

int *__fastcall InternalSetMem16(int *buf, unsigned __int64 n4, int value)
{
  int *buf_1; // rdi
  unsigned __int64 n4_1; // rcx
  int value_1; // eax
  __int16 value_2; // bx
  int v7; // eax
  __int64 v8; // rdx
  char n4_2; // dl
  unsigned __int64 i; // rcx

  buf_1 = buf; /*0xa381*/
  n4_1 = n4; /*0xa384*/
  value_1 = value; /*0xa387*/
  BYTE1(value_1) = value; /*0xa38a*/
  value_2 = value_1; /*0xa38c*/
  v7 = value_1 << 16; /*0xa38f*/
  LOWORD(v7) = value_2; /*0xa393*/
  if ( n4 >= 4 ) /*0xa39a*/
  {
    v8 = (unsigned __int8)buf_1 & 3; /*0xa39f*/
    if ( ((unsigned __int8)buf_1 & 3) != 0 ) /*0xa3a3*/
    {
      memset(buf_1, value_2, 4 - v8); /*0xa3b2*/
      buf_1 = (int *)((char *)buf_1 + 4 - v8); /*0xa3b2*/
      n4_1 -= 4 - v8; /*0xa3b4*/
    }
    n4_2 = n4_1; /*0xa3b7*/
    for ( i = n4_1 >> 2; i; --i ) /*0xa3ba*/
      *buf_1++ = v7; /*0xa3be*/
    n4_1 = n4_2 & 3; /*0xa3c4*/
  }
  memset(buf_1, value_2, n4_1); /*0xa3c7*/
  return buf; /*0xa3ca*/
}


// Function: InternalCopyMemOverlap @ 0xa3d0 (0xb0 bytes)

char *__fastcall InternalCopyMemOverlap(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 } /*0xa3d3*/
  dst_1 = (unsigned __int64)dst; /*0xa3d9*/
  n8_1 = n8; /*0xa3dc*/
  v10 = 0; /*0xa3df*/
  n8_2 = &src[-dst_1]; /*0xa3e4*/
  if ( (unsigned __int64)src < dst_1 ) /*0xa3e7*/
  {
    n8_2 = (char *)(dst_1 - (_QWORD)src); /*0xa3ed*/
    if ( (unsigned __int64)&src[n8] >= dst_1 ) /*0xa3f3*/
    {
      src += n8; /*0xa3f5*/
      dst_1 += n8; /*0xa3f8*/
      v10 = 1; /*0xa3fc*/
    }
  }
  if ( n8 < 8 || (unsigned __int64)n8_2 < 8 ) /*0xa409*/
    goto LABEL_19; /*0xa409*/
  count = (unsigned __int8)src & 7; /*0xa411*/
  count_1 = dst_1 & 7; /*0xa415*/
  if ( v10 ) /*0xa41b*/
  {
    --src; /*0xa41d*/
    --dst_1; /*0xa420*/
  }
  if ( count == count_1 && count ) /*0xa42b*/
  {
    if ( !v10 ) /*0xa42f*/
      count = 8 - count; /*0xa434*/
    qmemcpy((void *)dst_1, src, count); /*0xa43d*/
    src += count; /*0xa43d*/
    dst_1 += count; /*0xa43d*/
    n8_1 = n8 - count; /*0xa43f*/
  }
  if ( v10 ) /*0xa444*/
  {
    src -= 7; /*0xa446*/
    dst_1 -= 7LL; /*0xa44a*/
  }
  n8_3 = n8_1; /*0xa44e*/
  v15 = n8_1 >> 3; /*0xa451*/
  qmemcpy((void *)dst_1, src, 8 * v15); /*0xa455*/
  src += 8 * v15; /*0xa455*/
  dst_1 += 8 * v15; /*0xa455*/
  n8_4 = n8_3 & 7; /*0xa458*/
  if ( n8_4 ) /*0xa45c*/
  {
    if ( v10 ) /*0xa460*/
    {
      src += 8; /*0xa462*/
      dst_1 += 8LL; /*0xa466*/
    }
    n8_1 = n8_4; /*0xa46a*/
LABEL_19:
    if ( v10 ) /*0xa46f*/
    {
      --src; /*0xa471*/
      --dst_1; /*0xa474*/
    }
    qmemcpy((void *)dst_1, src, n8_1); /*0xa477*/
  }
  __asm { popf } /*0xa479*/
  return dst; /*0xa47c*/
}