Newer
Older
AMI-Aptio-BIOS-Reversed / DxeCore / Library / Library.c
@Ajax Dong Ajax Dong 2 days ago 55 KB Init
/** @file
  Library and Utility Functions for DxeCore

  Source: DxeCore.efi (HR650X BIOS)
  Includes protocol/handle services, events, locks,
  CPU helpers, GCD support, and miscellaneous utilities.
  Originates from MdeModulePkg\Core\Dxe\Hand\Handle.c,
  Event\Event.c, Misc\*, and BaseLib sources.
*/

#include "../uefi_headers/Uefi.h"

//
// Function: CoreInstallProtocolInterface @ 0x4e74
//
signed __int64 __fastcall CoreInstallProtocolInterface(char **p__, char *dst, int a3, __int64 p, char a5)
{
  double v5; // xmm3_8
  __int64 v9; // rax
  __int64 v10; // rdx
  __int64 v11; // r8
  char *Info_19; // rsi
  char *_; // rdi
  signed __int64 v14; // rbx
  __int64 v15; // rdx
  __int64 p_1; // r8
  __int64 v17; // rdx
  __int64 v18; // r8
  char *v19; // r13
  char *__1; // rax
  __int64 v21; // r8
  __int64 v22; // rdx
  __int64 v23; // r8
  __int64 v24; // r8
  __int64 v25; // r8
  __int64 v26; // rdx
  __int64 v27; // r8
  __int64 v29; // [rsp+60h] [rbp+8h] BYREF

  if ( !p__ || !dst || a3 )
    return 0x8000000000000002uLL;
  v9 = CoreGetProtocolName(dst);
  if ( v9 )
    Assert_3(64, "InstallProtocolInterface: %a %p\n", v9, p);
  else
    Assert_3(64, "InstallProtocolInterface: %g %p\n", dst, p);
  Info_19 = 0;
  _ = 0;
  v14 = 0x8000000000000009uLL;
  if ( *p__ )
  {
    v14 = CoreInstallProtocolInterfaceNotify(*p__, (__int64)dst, &v29, _, 0, 1u);
    if ( v14 >= 0 )
      return 0x8000000000000002uLL;
  }
  DxeGetInfo_8((__int64)&unk_25AC0, v10, v11, v5);
  LOBYTE(v15) = 1;
  v19 = CoreFindProtocolEntry(dst, v15, p_1, v5);
  if ( v19 )
  {
    Info_19 = CoreSetTimer(4u, 0x58u, v18, v5);
    if ( !Info_19 )
    {
LABEL_11:
      v14 = 0x8000000000000009uLL;
      goto LABEL_20;
    }
    _ = *p__;
    if ( *p__ )
    {
      v14 = CoreIsHandleValid(*p__);
      if ( v14 < 0 )
      {
        Assert_3(0x80000000, "InstallProtocolInterface: input handle at 0x%x is invalid\n", (_DWORD)_);
        goto LABEL_20;
      }
    }
    else
    {
      __1 = CoreSetTimer(4u, 0x38u, v18, v5);
      _ = __1;
      if ( !__1 )
        goto LABEL_11;
      *(_QWORD *)__1 = 1818521192;
      Assert_74((_QWORD *)__1 + 3, v17, v18, v5);
      *((_QWORD *)_ + 6) = ++qword_26410;
      Assert_53(&off_25AD8, (_QWORD *)_ + 1, v21, v5);
    }
    if ( CoreFindProtocolInterface(_, dst, p, v5) )
      Assert_7(
        (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Hand\\Handle.c",
        474,
        (__int64)"CoreFindProtocolInterface (Handle, Protocol, Interface) == ((void *) 0)",
        v5);
    *(_QWORD *)Info_19 = 1667656048;
    *((_QWORD *)Info_19 + 3) = _;
    *((_QWORD *)Info_19 + 6) = v19;
    *((_QWORD *)Info_19 + 7) = p;
    Assert_74((_QWORD *)Info_19 + 8, v22, v23, v5);
    *((_QWORD *)Info_19 + 10) = 0;
    Assert_54((__int64 *)_ + 3, (__int64 *)Info_19 + 1, v24, v5);
    Assert_53((_QWORD *)v19 + 5, (_QWORD *)Info_19 + 4, v25, v5);
    if ( a5 )
      DxeNotify_2((__int64)v19, v17, v18, v5);
    v14 = 0;
  }
LABEL_20:
  DxeGetInfo_10((__int64)&unk_25AC0, v17, v18, v5);
  if ( v14 < 0 )
  {
    if ( Info_19 )
      Assert_55((unsigned __int64)Info_19, v26, v27, v5);
    Assert_3(0x80000000, "InstallProtocolInterface: %g %p failed with %r\n", dst, p, v14);
  }
  else
  {
    *p__ = _;
  }
  return v14;
}

//
// Function: CoreGetProtocolInterface @ 0x88dc
//
__int64 __fastcall CoreGetProtocolInterface(
        __int64 a1,
        __int64 p_n1718054249,
        __int64 ldri,
        PHYSICAL_ADDRESS ImageAddress,
        _QWORD *a5,
        char n3)
{
  double v6; // xmm2_8
  double v7; // xmm3_8
  PE_COFF_LOADER_IMAGE_CONTEXT *p___ImageBase; // rsi
  __int64 result; // rax
  __int64 n3772; // rcx
  const char *v14; // rax
  int n3772_1; // edx
  const char *v16; // rax
  int n11; // eax
  char v18; // r12
  unsigned int n0x1000; // eax
  unsigned __int64 v20; // rcx
  bool v21; // cf
  unsigned __int64 n232; // r8
  __int64 n4095; // r8
  unsigned __int64 v24; // r9
  unsigned __int64 v25; // rdx
  _BOOL8 v26; // rax
  unsigned __int64 v27; // rdx
  unsigned __int64 v28; // rdx
  __int64 ImageAddress_1; // rdx
  __int64 v30; // rdx
  signed __int64 Image; // rbx
  __int64 v32; // r8
  int v33; // ebp
  unsigned __int64 n232_1; // rdx
  signed __int64 v35; // rax
  char *v36; // rcx
  unsigned __int64 __ImageBase; // rcx
  __int16 n3772_2; // cx
  _QWORD *v39; // r14
  __int64 n12; // rdx
  signed __int64 v41; // rax
  char *v42; // rcx
  __int64 v43; // rdx
  char *v44; // [rsp+58h] [rbp+10h] BYREF

  p___ImageBase = (PE_COFF_LOADER_IMAGE_CONTEXT *)(ldri + 240);
  ZeroMemWrapper((char *)(ldri + 240), 0x90u, ldri, v7);
  *(_QWORD *)(ldri + 280) = p_n1718054249;
  *(_QWORD *)(ldri + 272) = DxeConfig_53;
  if ( !p___ImageBase )
    return 0x8000000000000002uLL;
  result = sub_16608((__int64 *)p___ImageBase);
  if ( result < 0 )
    return result;
  n3772 = *(unsigned __int16 *)(ldri + 360);
  if ( (_WORD)n3772 != 0x8664 && (_WORD)n3772 != 3772 && (_WORD)n3772 != 332 )
  {
    v14 = (const char *)sub_860C(n3772, 3772);
    Assert_3(0x80000000, "Image type %s can't be loaded ", v14);
    v16 = (const char *)sub_860C((unsigned __int16)n3772, n3772_1);
    Assert_3(0x80000000, "on %s UEFI system.\n", v16);
    return 0x8000000000000003uLL;
  }
  n11 = *(unsigned __int16 *)(ldri + 362);
  if ( n11 == 10 )
  {
    *(_DWORD *)(ldri + 336) = 1;
    *(_DWORD *)(ldri + 340) = 2;
  }
  else if ( n11 == 11 )
  {
    *(_DWORD *)(ldri + 336) = 3;
    *(_DWORD *)(ldri + 340) = 4;
  }
  else
  {
    if ( (unsigned int)(n11 - 12) > 1 )
    {
      *(_DWORD *)(ldri + 344) = 4;
      return 0x8000000000000003uLL;
    }
    *(_DWORD *)(ldri + 336) = 5;
    *(_DWORD *)(ldri + 340) = 6;
  }
  v18 = 0;
  if ( !ImageAddress )
  {
    n0x1000 = *(_DWORD *)(ldri + 296);
    if ( n0x1000 <= 0x1000 )
      v20 = *(_QWORD *)(ldri + 248);
    else
      v20 = *(_QWORD *)(ldri + 248) + n0x1000;
    v21 = p___ImageBase->ImageAddress < 0x100000;
    n232 = ((v20 & 0xFFF) != 0) + (v20 >> 12);
    *(_QWORD *)(ldri + 144) = n232;
    if ( v21 && !*(_BYTE *)(ldri + 364) )
      goto LABEL_23;
    result = GetInfo_2(2, *(unsigned int *)(ldri + 336), n232, p___ImageBase);
    if ( result >= 0 )
    {
LABEL_25:
      v18 = 1;
      goto LABEL_33;
    }
    if ( !*(_BYTE *)(ldri + 364) )
LABEL_23:
      result = GetInfo_2(0, *(unsigned int *)(ldri + 336), *(_QWORD *)(ldri + 144), p___ImageBase);
    if ( result < 0 )
      return result;
    goto LABEL_25;
  }
  if ( *(_BYTE *)(ldri + 364) && p___ImageBase->ImageAddress != ImageAddress )
    return 0x8000000000000002uLL;
  v24 = *(_QWORD *)(ldri + 144);
  n4095 = 4095;
  if ( v24 )
  {
    v25 = *(_QWORD *)(ldri + 248) + *(unsigned int *)(ldri + 296);
    v26 = (v25 & 0xFFF) != 0;
    v27 = v25 >> 12;
    if ( v24 < v26 + v27 )
    {
      *(_QWORD *)(ldri + 144) = v26 + v27;
      return 0x8000000000000005uLL;
    }
  }
  v28 = *(_QWORD *)(ldri + 248) + *(unsigned int *)(ldri + 296);
  p___ImageBase->ImageAddress = ImageAddress;
  *(_QWORD *)(ldri + 144) = (v28 >> 12) + ((v28 & 0xFFF) != 0);
LABEL_33:
  ImageAddress_1 = p___ImageBase->ImageAddress;
  *(_QWORD *)(ldri + 136) = p___ImageBase->ImageAddress;
  if ( !*(_BYTE *)(ldri + 365) )
    p___ImageBase->ImageAddress = (ImageAddress_1 + *(unsigned int *)(ldri + 296) - 1LL)
                                & ~(*(unsigned int *)(ldri + 296) - 1LL);
  Image = sub_16C9C((__int64 *)p___ImageBase, ImageAddress_1, n4095, v7);
  if ( Image < 0 )
    goto LABEL_42;
  v33 = n3 & 1;
  if ( (n3 & 1) != 0 && *(_WORD *)(ldri + 362) == 12 )
  {
    n232_1 = *(_QWORD *)(ldri + 352);
    v44 = 0;
    v35 = Assert_67(6u, n232_1, &v44, v7);
    v36 = v44;
    if ( v35 < 0 )
      v36 = 0;
    *(_QWORD *)(ldri + 288) = v36;
    if ( !v36 )
    {
      Image = 0x8000000000000009uLL;
LABEL_42:
      if ( v18 )
      {
        DxeConfig_35(p___ImageBase->ImageAddress, *(_QWORD *)(ldri + 144), v32, v7);
        p___ImageBase->ImageAddress = 0;
        *(_QWORD *)(ldri + 136) = 0;
      }
      __ImageBase = *(_QWORD *)(ldri + 288);
      if ( __ImageBase )
        Assert_55(__ImageBase, v30, v32, v7);
      return Image;
    }
  }
  Image = PeCoffLoadImage(p___ImageBase);
  if ( Image < 0 )
    goto LABEL_42;
  Assert_66(p___ImageBase->ImageAddress, *(_QWORD *)(ldri + 248), v32, v7);
  n3772_2 = *(_WORD *)(ldri + 360);
  *(_QWORD *)(ldri + 32) = *(_QWORD *)(ldri + 264);
  *(_WORD *)(ldri + 208) = n3772_2;
  if ( n3772_2 == 3772 )
  {
    v39 = (_QWORD *)(ldri + 216);
    Image = GetInfo_9(&dst__3, 0, (_QWORD *)(ldri + 216), v7);
    if ( Image < 0 || !*v39 )
    {
      Assert_3(-2147483644, "CoreLoadPeImage: There is no EBC interpreter for an EBC image.\n");
      goto LABEL_42;
    }
    Image = (*(__int64 (__fastcall **)(_QWORD, __int64 (__fastcall *)(__int64, __int64, __int64, double)))(*v39 + 16LL))(
              *v39,
              Assert_66);
    if ( Image < 0 )
      goto LABEL_42;
    Image = (*(__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, __int64))*v39)(
              *v39,
              *(_QWORD *)(ldri + 8),
              *(_QWORD *)(ldri + 264),
              ldri + 32);
    if ( Image < 0 )
      goto LABEL_42;
  }
  n12 = *(unsigned __int16 *)(ldri + 362);
  *(_QWORD *)(ldri + 104) = p___ImageBase->ImageAddress;
  *(_QWORD *)(ldri + 112) = *(_QWORD *)(ldri + 248);
  *(_DWORD *)(ldri + 120) = *(_DWORD *)(ldri + 336);
  *(_DWORD *)(ldri + 124) = *(_DWORD *)(ldri + 340);
  *(_QWORD *)(ldri + 16) = n12;
  if ( v33 && (_DWORD)n12 == 12 )
  {
    v44 = 0;
    v41 = Assert_67(6u, 0x30u, &v44, v7);
    v42 = v44;
    if ( v41 < 0 )
      v42 = 0;
    *(_QWORD *)(ldri + 224) = v42;
    if ( !v42 )
      goto LABEL_42;
    *(_QWORD *)v42 = *(_QWORD *)(ldri + 104);
    *(_QWORD *)(*(_QWORD *)(ldri + 224) + 8LL) = *(_QWORD *)(ldri + 112);
    *(_QWORD *)(*(_QWORD *)(ldri + 224) + 16LL) = *(_QWORD *)(ldri + 288);
    *(_QWORD *)(*(_QWORD *)(ldri + 224) + 24LL) = *(_QWORD *)(ldri + 8);
    Assert_53(off_22838, (_QWORD *)(*(_QWORD *)(ldri + 224) + 32LL), v32, v7);
    SataConfig(*(PE_COFF_LOADER_IMAGE_CONTEXT ***)(ldri + 224), v43, v6, v7);
  }
  if ( a5 )
    *a5 = *(_QWORD *)(ldri + 264);
  return 0;
}

//
// Function: CoreLocateProtocol @ 0x5344
//
__int64 __fastcall CoreLocateProtocol(_QWORD *_, char *dst, __int64 p, double a4)
{
  __int64 result; // rax
  __int64 v8; // rdx
  __int64 v9; // r8
  _QWORD *v10; // rax
  __int64 v11; // rdx
  __int64 v12; // r8
  __int64 v13; // rdi
  _QWORD *__ImageBase_1; // rax
  __int64 v15; // rdx
  __int64 v16; // r8
  _QWORD *__ImageBase; // rsi
  __int64 v18; // rdx
  __int64 v19; // r8
  __int64 v20; // rdx
  __int64 v21; // r8

  if ( !dst )
    return 0x8000000000000002uLL;
  result = sub_4B80(_);
  if ( result >= 0 )
  {
    DxeGetInfo_8((__int64)&unk_25AC0, v8, v9, a4);
    v10 = DxeConfig_52(_, dst, p, a4);
    if ( v10 )
    {
      v13 = DxeConfig_24(_, (__int64)v10, v12, a4);
      if ( v13 >= 0 )
      {
        v13 = 0x800000000000000EuLL;
        __ImageBase_1 = DxeNotify_0(_, dst, p, a4);
        __ImageBase = __ImageBase_1;
        if ( __ImageBase_1 )
        {
          _[6] = ++qword_26410;
          Assert_58(__ImageBase_1 + 1, v15, v16, a4);
          *__ImageBase = 0;
          Assert_55((unsigned __int64)__ImageBase, v18, v19, a4);
          v13 = 0;
        }
        if ( Assert_75(_ + 3, v15, v16, a4) )
        {
          *_ = 0;
          Assert_58(_ + 1, v11, v12, a4);
          Assert_55((unsigned __int64)_, v20, v21, a4);
        }
      }
    }
    else
    {
      v13 = 0x800000000000000EuLL;
    }
    DxeGetInfo_10((__int64)&unk_25AC0, v11, v12, a4);
    return v13;
  }
  return result;
}

//
// Function: CoreOpenProtocol @ 0x7c40
//
__int64 __fastcall CoreOpenProtocol(__int64 n3, __int64 n7, unsigned __int64 n232, _DWORD *a4)
{
  double v4; // xmm3_8
  int n7_1; // esi
  int n3_1; // ebx
  __int64 v9; // rbx
  unsigned __int64 Pool; // rdi
  unsigned __int64 n0xFFF; // rbp
  unsigned __int64 __ImageBase; // r8
  __int64 v13; // rdx
  char v15; // [rsp+50h] [rbp+8h] BYREF

  n7_1 = n7;
  n3_1 = n3;
  if ( (unsigned int)n3 >= 3 )
    return 0x8000000000000002uLL;
  if ( (unsigned int)(n7 - 14) <= 0x6FFFFFF1 || (_DWORD)n7 == 7 )
  {
    v9 = 0x8000000000000002uLL;
LABEL_22:
    if ( v9 >= 0 )
    {
      if ( byte_264B0 && (unsigned int)(n7_1 - 5) <= 1 )
        CoreBuildMemoryAttributesTable(n3, n7, n232, v4);
      v15 = 0;
      if ( qword_263D0 )
        (*(void (__fastcall **)(__int64, char *))qword_263D0)(qword_263D0, &v15);
    }
    return v9;
  }
  if ( !a4 )
    return 0x8000000000000002uLL;
  if ( (_DWORD)n3 == 2 && (*a4 & 0xFFFLL) != 0 )
    return 0x800000000000000EuLL;
  Pool = *(_QWORD *)a4;
  n0xFFF = -1;
  if ( (_DWORD)n3 == 2 )
  {
    if ( n232 - 1 > 0xFFFFFFFFFFFFELL || Pool >= Pool + (n232 << 12) - 1 )
      return 0x800000000000000EuLL;
  }
  else if ( (_DWORD)n3 == 1 )
  {
    n0xFFF = *(_QWORD *)a4;
  }
  DxeGetInfo_8((__int64)&unk_26340, n7, n232, v4);
  if ( n3_1 == 2 || (Pool = CoreAllocatePool(n0xFFF, n232, n7_1, 4096)) != 0 )
  {
    LOBYTE(__ImageBase) = 1;
    v9 = sub_7510(Pool, n232, __ImageBase, n7_1, 0, 0);
  }
  else
  {
    v9 = 0x8000000000000009uLL;
  }
  DxeGetInfo_10((__int64)&unk_26340, v13, __ImageBase, v4);
  if ( v9 >= 0 )
  {
    *(_QWORD *)a4 = Pool;
    goto LABEL_22;
  }
  return v9;
}

//
// Function: CoreRegisterProtocolNotify @ 0x9d80
//
unsigned __int64 __fastcall CoreRegisterProtocolNotify(_QWORD *_, _QWORD *n3772, __int64 i, double a4)
{
  __int64 Info_4; // rax
  __int64 v6; // rdx
  __int64 p; // r8
  _QWORD *Info; // rdi
  __int64 v9; // rbx
  __int64 (__fastcall *v10)(_QWORD *); // rax

  Info_4 = DxeGetInfo_4(_, n3772, i, a4);
  Info = (_QWORD *)Info_4;
  if ( !Info_4 )
    return 0x8000000000000002uLL;
  if ( *(_BYTE *)(Info_4 + 24) )
  {
    v10 = *(__int64 (__fastcall **)(_QWORD *))(Info_4 + 128);
    v9 = 0x8000000000000003uLL;
    if ( !v10 )
      return v9;
    v9 = v10(_);
  }
  else
  {
    v9 = 0;
  }
  if ( v9 >= 0 )
  {
    LOBYTE(v6) = 1;
    DxeConfig_3(Info, v6, p, a4);
  }
  return v9;
}

//
// Function: CoreReinstallProtocolInterface @ 0xa6e4
//
unsigned __int64 __fastcall CoreReinstallProtocolInterface(char *dst, __int64 a2, char **a3, double a4)
{
  __int64 v7; // rdx
  char *v8; // rbx
  __int64 p; // r8
  __int64 v10; // rdx
  char *v11; // rbp
  __int64 v12; // r8
  char *v13; // rax

  if ( !dst || !a2 || !a3 )
    return 0x8000000000000002uLL;
  DxeGetInfo_8((__int64)&unk_25AC0, a2, (__int64)a3, a4);
  LOBYTE(v7) = 1;
  v8 = 0;
  v11 = DxeConfig_42(dst, v7, p, a4);
  if ( v11 )
  {
    v13 = Assert_112(0x30u, v10, v12, a4);
    v8 = v13;
    if ( v13 )
    {
      *(_BYTE *)(a2 + 88) |= 2u;
      *((_QWORD *)v13 + 5) = v11 + 40;
      *(_QWORD *)v13 = 1853125232;
      *((_QWORD *)v13 + 1) = v11;
      *((_QWORD *)v13 + 4) = a2;
      Assert_53((_QWORD *)v11 + 7, (_QWORD *)v13 + 2, v12, a4);
    }
  }
  DxeGetInfo_10((__int64)&unk_25AC0, v10, v12, a4);
  if ( v8 )
    *a3 = v8;
  return -(__int64)(v8 == 0) & 0x8000000000000009uLL;
}

//
// Function: CoreUninstallProtocolInterface @ 0xa7c0
//
__int64 __fastcall CoreUninstallProtocolInterface(_QWORD *_, char *dst, __int64 p, __int64 a4)
{
  double v4; // xmm3_8
  __int64 result; // rax
  __int64 v10; // rdx
  __int64 v11; // r8
  _QWORD *v12; // rax
  __int64 v13; // rdx
  __int64 v14; // r8
  __int64 v15; // rbx
  _QWORD *v16; // rax
  __int64 v17; // rbx
  __int64 v18; // rdx
  __int64 v19; // r8
  __int64 v20; // rdx
  __int64 v21; // r8
  __int64 v22; // rdx
  __int64 v23; // r8

  result = sub_4B80(_);
  if ( result >= 0 )
  {
    if ( !v10 )
      return 0x8000000000000002uLL;
    DxeGetInfo_8((__int64)&unk_25AC0, v10, v11, v4);
    v12 = DxeConfig_52(_, dst, p, v4);
    if ( v12 )
    {
      v15 = DxeConfig_24(_, (__int64)v12, v14, v4);
      if ( v15 < 0 )
        goto LABEL_9;
      v16 = DxeNotify_0(_, dst, p, v4);
      if ( v16 )
      {
        v17 = v16[6];
        v16[7] = a4;
        Assert_53((_QWORD *)(v17 + 40), v16 + 4, v14, v4);
        _[6] = ++qword_26410;
        DxeGetInfo_10((__int64)&unk_25AC0, v18, v19, v4);
        DxeConfig_2(_, 0, 0, 1);
        DxeGetInfo_8((__int64)&unk_25AC0, v20, v21, v4);
        DxeNotify_2(v17, v22, v23, v4);
        v15 = 0;
        goto LABEL_9;
      }
    }
    v15 = 0x800000000000000EuLL;
LABEL_9:
    DxeGetInfo_10((__int64)&unk_25AC0, v13, v14, v4);
    return v15;
  }
  return result;
}

//
// Function: CoreGetHandleCount @ 0x1521c
//
char *__fastcall CoreGetHandleCount(__int64 a1, __int64 a2, __int64 a3, double a4)
{
  char *src; // rdi
  __int64 v5; // rbx
  _WORD *HobListWrapper; // rax
  __int64 v7; // r8
  _WORD *ConfigTableEntry; // rax
  __int64 v9; // rdx
  __int64 v10; // rcx
  __int64 v11; // r8
  char *v12; // rsi
  __int64 v13; // r12
  __int64 *v14; // r14
  unsigned __int64 v15; // rbp
  char *v16; // r15
  __int64 v17; // rdx
  __int64 v18; // rax
  _WORD *j; // rax
  __int64 v20; // r8
  _WORD *v21; // rax
  _DWORD *v22; // rcx
  __int64 v23; // r8
  int *v24; // rdx
  int v25; // eax
  char *src_1; // rax

  src = src_3;
  LODWORD(v5) = 0;
  HobListWrapper = (_WORD *)GetHobListWrapper(a1, a2, a3, a4);
  ConfigTableEntry = FindConfigTableEntry((__int64)&qword_226F0, HobListWrapper, v7, a4);
  if ( ConfigTableEntry )
  {
    v5 = *((unsigned int *)ConfigTableEntry + 6);
    if ( (_DWORD)v5 )
    {
      v12 = src + 88;
      v13 = (unsigned int)v5;
      v14 = (__int64 *)(ConfigTableEntry + 32);
      v15 = (unsigned __int64)(src + 48);
      v16 = (char *)(ConfigTableEntry + 24);
      do
      {
        *((_QWORD *)v12 - 10) = *(v14 - 4);
        Assert_15(v15 - 32, v9, v16 - 8, a4);
        Assert_15(v15, v17, v16, a4);
        v16 += 40;
        *((_QWORD *)v12 - 1) = *(v14 - 1);
        v15 += 96LL;
        v18 = *v14;
        v14 += 5;
        *((_DWORD *)v12 + 2) = 0;
        *(_QWORD *)v12 = v18;
        v12 += 96;
        --v13;
      }
      while ( v13 );
    }
    j = (_WORD *)GetHobListWrapper(v10, v9, v11, a4);
    v21 = FindConfigTableEntry((__int64)&qword_22490, j, v20, a4);
    if ( v21 && (_DWORD)v5 )
    {
      v22 = src + 96;
      v23 = v5;
      v24 = (int *)(v21 + 12);
      do
      {
        v25 = *v24++;
        *v22 = v25;
        v22 += 24;
        --v23;
      }
      while ( v23 );
    }
  }
  src_1 = src_3;
  *(_DWORD *)src_3 = v5;
  return src_1;
}

//
// Function: CoreConnectController @ 0x15774
//
__int64 __fastcall CoreConnectController(__int64 buf, unsigned __int16 n0x1F, __int64 n8, __int16 n0x1F_2)
{
  double v4; // xmm3_8
  unsigned __int16 n8_1; // r15
  char v8; // di
  int n0x1F_3; // r14d
  __int64 v11; // r8
  int v12; // ebx
  _WORD *v13; // rdi
  __int64 k; // rcx
  unsigned __int16 n0x1F_1; // di
  int n7; // ebx
  unsigned int i; // eax
  unsigned __int16 n3; // dx
  __int64 v20; // rax
  int v21; // ebx
  __int16 j; // bx
  __int64 v23; // rax
  __int64 v24; // rax

  n8_1 = n8;
  v8 = 32 - n8;
  n0x1F_3 = *(_DWORD *)(buf + 28) >> (32 - n8);
  Assert_97(buf, n8, n8, v4);
  if ( (_WORD)n0x1F_3 )
  {
    n0x1F_1 = 0;
    do
    {
      if ( n0x1F_1 >= 0x1Fu )
        break;
      n7 = *(_DWORD *)(buf + 28) >> 29;
      if ( (_WORD)n7 == 7 )
      {
        for ( i = 0x10000000; (i & *(_DWORD *)(buf + 28)) != 0; i >>= 1 )
          LOWORD(n7) = n7 + 1;
      }
      n3 = n7 - 3;
      if ( (unsigned __int16)n7 < 7u )
        n3 = 3;
      Assert_97(buf, n3, v11, v4);
      v20 = n0x1F_1++;
      *(_BYTE *)(v20 + buf + 4636) = n7;
      if ( n0x1F_1 == n0x1F_2 )
      {
        v21 = *(_DWORD *)(buf + 28) >> 30;
        Assert_97(buf, 2u, v11, v4);
        for ( j = v21 - 1; j >= 0; --j )
        {
          if ( n0x1F_1 >= 0x1Fu )
            break;
          v23 = n0x1F_1++;
          *(_BYTE *)(v23 + buf + 4636) = 0;
        }
      }
    }
    while ( n0x1F_1 < (unsigned __int16)n0x1F_3 );
    while ( n0x1F_1 < n0x1F && n0x1F_1 < 0x1Fu )
    {
      v24 = n0x1F_1++;
      *(_BYTE *)(v24 + buf + 4636) = 0;
    }
    return SetMem16Wrapper(buf, n0x1F, buf + 4636, 8u, buf + 12860);
  }
  else
  {
    v12 = *(_DWORD *)(buf + 28) >> v8;
    Assert_97(buf, n8_1, v11, v4);
    v13 = (_WORD *)(buf + 12860);
    for ( k = 256; k; --k )
      *v13++ = v12;
    SetMemWrapper(buf + 4636, n0x1F, 0, v4);
    return 0;
  }
}

//
// Function: CoreDisconnectController @ 0x15918
//
__int64 __fastcall CoreDisconnectController(__int64 buf, __int64 a2, __int64 i, double a4)
{
  int n0x1FE_1; // ebp
  __int64 v6; // r8
  int v7; // ebx
  __int64 result; // rax
  _WORD *v9; // rdi
  __int64 j; // rcx
  unsigned __int16 n0x1FE; // bx
  unsigned __int16 n0x13; // di
  unsigned int n0x800000; // ecx
  __int16 v14; // di
  int v15; // edi
  int v16; // edi
  __int64 v17; // rax
  __int64 v18; // rax

  n0x1FE_1 = *(_DWORD *)(buf + 28) >> 23;
  Assert_97(buf, 9u, i, a4);
  if ( (_WORD)n0x1FE_1 )
  {
    n0x1FE = 0;
    do
    {
      if ( n0x1FE >= 0x1FEu )
        break;
      n0x13 = *(_WORD *)(buf + 2 * ((unsigned __int64)*(unsigned int *)(buf + 28) >> 24) + 12860);
      if ( n0x13 >= 0x13u )
      {
        n0x800000 = 0x800000;
        do
        {
          if ( (*(_DWORD *)(buf + 28) & n0x800000) != 0 )
            n0x13 = *(_WORD *)(buf + 2LL * n0x13 + 2088);
          else
            n0x13 = *(_WORD *)(buf + 2LL * n0x13 + 50);
          n0x800000 >>= 1;
        }
        while ( n0x13 >= 0x13u );
      }
      Assert_97(buf, *(unsigned __int8 *)(n0x13 + buf + 4636), v6, a4);
      if ( n0x13 > 2u )
      {
        v18 = n0x1FE++;
        *(_BYTE *)(v18 + buf + 4126) = n0x13 - 2;
      }
      else
      {
        if ( n0x13 )
        {
          if ( n0x13 == 1 )
          {
            v15 = *(_DWORD *)(buf + 28) >> 28;
            Assert_97(buf, 4u, v6, a4);
            v14 = v15 + 3;
          }
          else
          {
            v16 = *(_DWORD *)(buf + 28) >> 23;
            Assert_97(buf, 9u, v6, a4);
            v14 = v16 + 20;
          }
        }
        else
        {
          v14 = 1;
        }
        while ( --v14 >= 0 && n0x1FE < 0x1FEu )
        {
          v17 = n0x1FE++;
          *(_BYTE *)(v17 + buf + 4126) = 0;
        }
      }
    }
    while ( n0x1FE < (unsigned __int16)n0x1FE_1 );
    SetMemWrapper(n0x1FE + buf + 4126, 510 - n0x1FE, 0, a4);
    return SetMem16Wrapper(buf, 0x1FEu, buf + 4126, 0xCu, buf + 4668);
  }
  else
  {
    v7 = *(_DWORD *)(buf + 28) >> 23;
    Assert_97(buf, 9u, v6, a4);
    SetMemWrapper(buf + 4126, 0x1FEu, 0, a4);
    result = (unsigned __int16)v7;
    v9 = (_WORD *)(buf + 4668);
    for ( j = 4096; j; --j )
      *v9++ = v7;
  }
  return result;
}

//
// Function: CoreLocateDevicePath @ 0x15dc8
//
unsigned __int64 __fastcall CoreLocateDevicePath(unsigned __int8 *a1, __int64 a2, unsigned __int64 buf, int n2)
{
  double v4; // xmm3_8
  int v9; // ebp
  int v10; // r14d
  unsigned __int8 *v12; // rsi
  __int64 v13; // r8
  int v14; // edi
  __int64 v15; // rdx
  __int64 i; // r8

  if ( !a1 )
    Assert_7(
      (__int64)"e:\\hs\\IntelFrameworkModulePkg\\Library\\BaseUefiTianoCustomDecompressLib\\BaseUefiTianoCustomDecompressLib.c",
      788,
      (__int64)"Source != ((void *) 0)",
      v4);
  if ( !a2 )
    Assert_7(
      (__int64)"e:\\hs\\IntelFrameworkModulePkg\\Library\\BaseUefiTianoCustomDecompressLib\\BaseUefiTianoCustomDecompressLib.c",
      789,
      (__int64)"Destination != ((void *) 0)",
      v4);
  if ( !buf )
    Assert_7(
      (__int64)"e:\\hs\\IntelFrameworkModulePkg\\Library\\BaseUefiTianoCustomDecompressLib\\BaseUefiTianoCustomDecompressLib.c",
      790,
      (__int64)"Scratch != ((void *) 0)",
      v4);
  v9 = *a1 + (a1[1] << 8) + (a1[2] << 16) + (a1[3] << 24);
  v10 = a1[4] + (a1[5] << 8) + (a1[6] << 16) + (a1[7] << 24);
  if ( !v10 )
    return 0;
  v12 = a1 + 8;
  SetMemWrapper(buf, 0x3440u, 0, v4);
  v14 = n2 - 1;
  if ( v14 )
  {
    if ( v14 == 1 )
      *(_BYTE *)(buf + 13372) = 5;
    else
      Assert_7(
        (__int64)"e:\\hs\\IntelFrameworkModulePkg\\Library\\BaseUefiTianoCustomDecompressLib\\BaseUefiTianoCustomDecompressLib.c",
        824,
        (__int64)"((BOOLEAN)(0==1))",
        v4);
  }
  else
  {
    *(_BYTE *)(buf + 13372) = 4;
  }
  *(_QWORD *)buf = v12;
  *(_QWORD *)(buf + 8) = a2;
  *(_DWORD *)(buf + 40) = v9;
  *(_DWORD *)(buf + 44) = v10;
  Assert_97(buf, 0x20u, v13, v4);
  sub_15AEC(buf, v15, i, v4);
  return -(__int64)(*(_WORD *)(buf + 48) != 0) & 0x8000000000000002uLL;
}

//
// Function: CoreOpenProtocolInformation @ 0x17f18
//
__int64 __fastcall CoreOpenProtocolInformation(__int64 n32, _QWORD *a2, double a3, double a4)
{
  double v4; // xmm1_8
  PE_COFF_LOADER_IMAGE_CONTEXT *Pe32Data; // rbx
  PE_COFF_LOADER_IMAGE_CONTEXT *Pe32Data_1; // rax
  bool v7; // zf
  __int16 n450; // ax
  signed __int64 v9; // rax
  void *EntryPoint_1; // rdi
  void *EntryPoint; // [rsp+40h] [rbp+18h] BYREF

  DumpCpuExceptionInfo(n32, a2, a3);
  Pe32Data = (PE_COFF_LOADER_IMAGE_CONTEXT *)(a2[84] & 0xFFFFFFFFFFFFFFFCuLL);
  if ( !Pe32Data )
    return Assert_5("!!!! Can't find image information. !!!!\n");
  while ( LOWORD(Pe32Data->ImageAddress) == 23117 )
  {
    Pe32Data_1 = (PE_COFF_LOADER_IMAGE_CONTEXT *)((char *)Pe32Data + LOWORD(Pe32Data->PeCoffHeaderOffset));
    if ( Pe32Data_1 > Pe32Data && (unsigned __int64)Pe32Data_1 < a2[84] )
    {
      v7 = LODWORD(Pe32Data_1->ImageAddress) == 17744;
      goto LABEL_13;
    }
LABEL_14:
    Pe32Data = (PE_COFF_LOADER_IMAGE_CONTEXT *)((char *)Pe32Data - 4);
    if ( !Pe32Data )
      goto LABEL_15;
  }
  if ( LOWORD(Pe32Data->ImageAddress) != 23126 )
    goto LABEL_14;
  n450 = WORD1(Pe32Data->ImageAddress);
  if ( n450 != 332 && n450 != 512 && n450 != 3772 && n450 != -31132 && n450 != -21916 )
  {
    v7 = n450 == 450;
LABEL_13:
    if ( v7 )
      goto LABEL_15;
    goto LABEL_14;
  }
LABEL_15:
  if ( !Pe32Data )
    return Assert_5("!!!! Can't find image information. !!!!\n");
  v9 = PeCoffGetEntryPoint(Pe32Data, &EntryPoint);
  EntryPoint_1 = EntryPoint;
  if ( v9 < 0 )
    EntryPoint_1 = 0;
  Assert_5("!!!! Find image ");
  if ( PeCoffGetImageInfo(Pe32Data) )
    Assert_5("%a", v4);
  else
    Assert_5("(No PDB) ");
  return Assert_5(" (ImageBase=%016lp, EntryPoint=%016p) !!!!\n", Pe32Data, EntryPoint_1);
}

//
// Function: CoreCreateEvent @ 0xe3fc
//
unsigned __int64 __fastcall CoreCreateEvent(__int64 i, __int64 n2, __int64 a3, double a4)
{
  int n2_1; // ebx
  __int64 v6; // rdx
  __int64 v7; // r8
  __int64 v8; // rax
  __int64 v9; // rbx
  __int64 v10; // rdx
  __int64 v11; // r8
  __int64 v12; // rdx
  __int64 v13; // r8
  __int64 v15; // [rsp+40h] [rbp+18h] BYREF

  v15 = a3;
  n2_1 = n2;
  if ( !i || *(_QWORD *)i != 1953396325 || (unsigned int)n2 > 2 || *(int *)(i + 8) >= 0 )
    return 0x8000000000000002uLL;
  DxeGetInfo_8((__int64)&unk_26230, n2, a3, a4);
  if ( *(_QWORD *)(i + 152) )
  {
    Assert_58((_QWORD *)(i + 152), v6, v7, a4);
    *(_QWORD *)(i + 152) = 0;
  }
  *(_QWORD *)(i + 168) = 0;
  *(_QWORD *)(i + 176) = 0;
  if ( n2_1 )
  {
    if ( n2_1 == 1 )
    {
      v8 = v15;
      if ( !v15 )
      {
        (*(void (__fastcall **)(__int64, __int64 *))(qword_263F8 + 16))(qword_263F8, &v15);
        v8 = v15;
      }
      *(_QWORD *)(i + 176) = v8;
    }
    DxeGetInfo_8((__int64)&unk_26218, v6, v7, a4);
    v9 = qword_26498;
    DxeGetInfo_10((__int64)&unk_26218, v10, v11, a4);
    v12 = v9 + v15;
    *(_QWORD *)(i + 168) = v9 + v15;
    DxeConfig_54((char *)i, v12, v13, a4);
    if ( !v15 )
      CheckEvent((_UNKNOWN **)i_7, v6, v7, a4);
  }
  DxeGetInfo_10((__int64)&unk_26230, v6, v7, a4);
  return 0;
}

//
// Function: CoreCloseEvent @ 0xe608
//
unsigned __int64 __fastcall CoreCloseEvent(int n4, unsigned __int64 n232, char **a3, double a4)
{
  __int64 v8; // r8
  __int64 v9; // rdx
  __int64 v10; // r8

  if ( (unsigned int)(n4 - 14) <= 0x6FFFFFF1 || n4 == 7 || !a3 )
    return 0x8000000000000002uLL;
  *a3 = 0;
  if ( n232 > 0xFFFFFFFFFFFFFFD7uLL
    || (DxeInit_2((__int64)&unk_26248, n232, (__int64)a3, a4) & 0x8000000000000000uLL) != 0LL )
  {
    return 0x8000000000000009uLL;
  }
  *a3 = DxeConfig_4(n4, n232, v8, a4);
  DxeGetInfo_10((__int64)&unk_26248, v9, v10, a4);
  return -(__int64)(*a3 == 0) & 0x8000000000000009uLL;
}

//
// Function: CoreSignalEvent @ 0xe6e8
//
unsigned __int64 __fastcall CoreSignalEvent(int n7, unsigned __int64 n232, __int64 a3, double a4)
{
  unsigned __int64 v7; // rbx
  __int64 v8; // rdx
  __int64 v9; // r8
  __int64 v10; // [rsp+40h] [rbp+18h] BYREF

  v10 = a3;
  if ( (DxeInit_2((__int64)&unk_26340, n232, a3, a4) & 0x8000000000000000uLL) != 0LL )
    return 0;
  v7 = Assert_10(n7, n232);
  DxeGetInfo_10((__int64)&unk_26340, v8, v9, a4);
  if ( v7 )
  {
    LOBYTE(v10) = 0;
    if ( qword_263D0 )
      (*(void (__fastcall **)(__int64, __int64 *))qword_263D0)(qword_263D0, &v10);
  }
  return v7;
}

//
// Function: CoreCheckEvent @ 0xea84
//
unsigned __int64 __fastcall CoreCheckEvent(unsigned __int64 __ImageBase, _DWORD *n232, __int64 a3, double a4)
{
  __int64 v6; // r8
  unsigned __int64 v7; // rbx
  __int64 v8; // rdx
  __int64 v9; // r8

  DxeGetInfo_8((__int64)&unk_26248, (__int64)n232, a3, a4);
  v7 = DxeConfig_6(__ImageBase, n232, v6, a4);
  DxeGetInfo_10((__int64)&unk_26248, v8, v9, a4);
  return v7;
}

//
// Function: CoreWaitForEvent @ 0xeb14
//
__int64 __fastcall CoreWaitForEvent(
        unsigned __int64 n12,
        unsigned __int64 __ImageBase,
        unsigned __int64 n232,
        double a4)
{
  unsigned __int64 __ImageBase_1; // r8
  __int64 v7; // rdx
  __int64 v8; // r8
  __int64 result; // rax
  int n12_1; // [rsp+40h] [rbp+8h] BYREF

  n12_1 = n12;
  DxeGetInfo_8((__int64)&unk_26340, __ImageBase, n232, a4);
  LOBYTE(__ImageBase_1) = 1;
  sub_7510(__ImageBase, n232, __ImageBase_1, 7, 0, 0);
  DxeGetInfo_10((__int64)&unk_26340, v7, v8, a4);
  result = qword_263D0;
  LOBYTE(n12_1) = 0;
  if ( qword_263D0 )
    return (*(__int64 (__fastcall **)(__int64, int *))qword_263D0)(qword_263D0, &n12_1);
  return result;
}

//
// Function: CoreSetTimer @ 0x13db0
//
char *__fastcall CoreSetTimer(unsigned int n4, unsigned __int64 n232, __int64 a3, double a4)
{
  signed __int64 v5; // rax
  __int64 v6; // r8
  char *buf; // rcx
  char *buf_1; // [rsp+40h] [rbp+18h] BYREF

  buf_1 = 0;
  v5 = Assert_67(n4, n232, &buf_1, a4);
  buf = buf_1;
  if ( v5 < 0 )
    buf = 0;
  if ( buf && n232 )
    return ZeroMemWrapper(buf, n232, v6, a4);
  return buf;
}

//
// Function: CoreStall @ 0x1a210
//
unsigned __int64 __fastcall CoreStall(__int64 a1, __int64 a2, __int64 a3, double a4)
{
  __int64 v4; // rdx
  __int64 v5; // rcx
  __int64 v6; // r8

  if ( CpuGetInfo(a1, a2, a3, a4) == 1 )
    return *(unsigned int *)(sub_1A1D4(v5, v4, v6, a4) + 32);
  else
    return __readmsr(0x802u);
}

//
// Function: CpuGetInfo @ 0x1a23c
//
__int64 __fastcall CpuGetInfo(__int64 a1, __int64 a2, __int64 a3, double a4)
{
  unsigned __int64 v5; // rax
  __int16 v6; // bx

  if ( !Assert_109(a1, a2, a3, a4) )
    return 1;
  v5 = __readmsr(0x1Bu);
  v6 = v5;
  if ( (v5 & 0x800) == 0 )
    Assert_7(
      (__int64)"e:\\hs\\UefiCpuPkg\\Library\\BaseXApicX2ApicLib\\BaseXApicX2ApicLib.c",
      343,
      (__int64)"ApicBaseMsr.Bits.EN != 0",
      a4);
  return ((v6 & 0x400) != 0) + 1LL;
}

//
// Function: CoreGetNextMonotonicCount @ 0x1a298
//
__int64 __fastcall CoreGetNextMonotonicCount(__int64 a1, __int64 a2, __int64 a3, double a4)
{
  unsigned int NextMonotonicCount_1; // ebx
  __int64 v5; // rdx
  __int64 v6; // rcx
  __int64 v7; // r8
  __int64 v8; // rdx
  __int64 v9; // rcx
  __int64 v10; // r8
  __int64 v11; // rdx
  __int64 v12; // rcx
  __int64 v13; // r8
  unsigned int NextMonotonicCount; // eax
  unsigned int NextMonotonicCount_2; // ecx
  unsigned int v16; // ecx
  unsigned int v18; // [rsp+40h] [rbp+8h] BYREF
  unsigned int p_n0xB; // [rsp+48h] [rbp+10h] BYREF
  unsigned int p_n0x100; // [rsp+50h] [rbp+18h] BYREF

  NextMonotonicCount_1 = CoreStall(a1, a2, a3, a4);
  if ( CpuGetInfo(v6, v5, v7, a4) == 1 )
  {
    if ( CpuGetInfo(v9, v8, v10, a4) == 1 )
    {
      CpuConfig_1(0, &p_n0xB, 0, 0, 0);
      if ( p_n0xB >= 0xB && (CpuConfig_0(0xBu, 0, 0, &v18, 0, &p_n0x100), (_WORD)v18) )
      {
        NextMonotonicCount = p_n0x100;
      }
      else
      {
        CpuConfig_1(1u, 0, &v18, 0, 0);
        NextMonotonicCount = HIBYTE(v18);
      }
    }
    else
    {
      NextMonotonicCount = CoreGetNextMonotonicCount(v12, v11, v13, a4);
    }
    NextMonotonicCount_2 = NextMonotonicCount_1;
    NextMonotonicCount_1 = NextMonotonicCount;
    v16 = HIBYTE(NextMonotonicCount_2);
    if ( NextMonotonicCount < 0x100 )
      return v16;
  }
  return NextMonotonicCount_1;
}

//
// Function: CpuConfig @ 0x1a5b0
//
__int64 __fastcall CpuConfig(unsigned int _RAX, _DWORD *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5)
{
  __int64 result; // rax

  _RAX = _RAX;
  __asm { cpuid }
  if ( a2 )
    *a2 = result;
  if ( a3 )
    *a3 = _RBX;
  if ( a4 )
    *a4 = _RCX;
  if ( a5 )
    *a5 = _RDX;
  return result;
}

//
// Function: CoreCalculateCrc32 @ 0x3620
//
__int64 __fastcall CalculateCrc32(unsigned __int64 __ImageBase, unsigned __int64 a2, __int64 a3, double a4)
{
  __int64 v7; // rdx
  __int64 Pages; // rsi
  __int64 v9; // r8
  __int64 v10; // rdx
  __int64 v11; // r8

  Assert_3(0x100000, "GCD:CoreSetMemorySpaceCapabilities(Base=%016lx,Length=%016lx)\n", __ImageBase, a2);
  Assert_3(0x100000, "  Capabilities  = %016lx\n", a3);
  Pages = CoreAllocatePages(37, 0, 0, __ImageBase, a2, a3, 0);
  if ( Pages >= 0 )
  {
    DxeGetInfo_8((__int64)&unk_26340, v7, v9, a4);
    sub_7510(__ImageBase, a2 >> 12, 0, 0, 1, a3 & 0x7FFFFFFFFFFFFFFFLL);
    DxeGetInfo_10((__int64)&unk_26340, v10, v11, a4);
  }
  return Pages;
}

//
// Function: FindConfigTableEntry @ 0x12b34
//
_WORD *__fastcall FindConfigTableEntry(__int64 a1, _WORD *j, __int64 a3, double a4)
{
  _WORD *NextHobWrapper; // rax
  __int64 v6; // r8
  _WORD *NextHobWrapper_1; // rbx

  while ( 1 )
  {
    NextHobWrapper = GetNextHobWrapper(4, j, a3, a4);
    NextHobWrapper_1 = NextHobWrapper;
    if ( !NextHobWrapper || Assert_103(a1, (__int64)(NextHobWrapper + 4), v6, a4) )
      break;
    j = (_WORD *)((char *)NextHobWrapper_1 + (unsigned __int16)NextHobWrapper_1[1]);
  }
  return NextHobWrapper_1;
}

//
// Function: GetNextDescriptor @ 0xdbe4
//
__int64 __fastcall GetNextDescriptor(__int64 a1, unsigned int *a2, __int64 a3, double a4)
{
  __int64 v5; // rbx

  v5 = a1;
  if ( *(_QWORD *)(a1 - 24) == 1112950367 )
    v5 = a1 - 24;
  else
    Assert_7(
      (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\FwVolBlock\\FwVolBlock.c",
      108,
      (__int64)"CR has Bad Signature",
      a4);
  *a2 = *(_DWORD *)(v5 + 104) & 0xFFFFFFDF;
  return 0;
}

//
// Function: InsertNewGcdEntry @ 0xdb1c
//
char *__fastcall InsertNewGcdEntry(__int64 a1, __int64 a2, __int64 _, double a4)
{
  char *src; // rdi
  unsigned __int64 v7; // rbx
  unsigned __int64 count; // rsi
  char *dst; // rax
  char *src_1; // rbx
  __int64 v11; // rdx
  __int64 v12; // r8

  *(_DWORD *)DXE_SERV__0 |= 1u;
  src = src_7;
  if ( (unsigned int)dword_2647C >= (unsigned __int64)qword_26490 )
  {
    count = 8 * qword_26490;
    dst = GetInfo_19(4u, 8 * qword_26490 + 4096, _, a4);
    src_1 = dst;
    if ( !dst )
      goto LABEL_10;
    MemConfig_1(dst, src, count, a4);
    Assert_55((unsigned __int64)src, v11, v12, a4);
    src = src_1;
    src_7 = src_1;
    v7 = qword_26490;
    qword_26490 += 512;
  }
  else
  {
    v7 = 0;
    if ( *(_QWORD *)src_7 )
    {
      do
        ++v7;
      while ( *(_QWORD *)&src_7[8 * v7] );
    }
    if ( v7 >= qword_26490 )
      Assert_7(
        (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\DebugImageInfo.c",
        197,
        (__int64)"Index < mMaxTableEntries",
        a4);
  }
  dst = GetInfo_19(4u, 0x18u, _, a4);
  *(_QWORD *)&src[8 * v7] = dst;
  if ( dst )
  {
    *(_DWORD *)dst = 1;
    *(_QWORD *)(*(_QWORD *)&src[8 * v7] + 8LL) = a2;
    dst = *(char **)&src[8 * v7];
    *((_QWORD *)dst + 2) = _;
    ++dword_2647C;
    *(_DWORD *)DXE_SERV__0 |= 2u;
  }
LABEL_10:
  *(_DWORD *)DXE_SERV__0 &= ~1u;
  return dst;
}

//
// Function: InitializeLock @ 0x9df8
//
__int64 __fastcall ReleaseLock(__int64 *p, __int64 a2)
{
  unsigned int v2; // ebx
  int n2; // eax
  bool v7; // sf
  _QWORD v8[3]; // [rsp+30h] [rbp-18h] BYREF
  char v9; // [rsp+60h] [rbp+18h] BYREF
  __int64 v10; // [rsp+68h] [rbp+20h] BYREF

  v2 = 0;
  v9 = 0;
  if ( qword_263D0 )
  {
    (*(void (__fastcall **)(__int64, char *))qword_263D0)(qword_263D0, &v9);
    if ( v9 )
      return 0;
  }
  if ( p == (__int64 *)p_0 )
  {
    n2 = 2;
  }
  else if ( !a2
         || (v10 = 0,
             v8[0] = a2,
             (*((__int64 (__fastcall **)(unsigned int *, _QWORD *, __int64 *))buf_0 + 23))(dst_2, v8, &v10) < 0)
         || (v7 = (*((__int64 (__fastcall **)(__int64, unsigned int *, _QWORD, _QWORD, _QWORD, int))buf_0 + 35))(
                    v10,
                    dst_2,
                    0,
                    0,
                    0,
                    4) < 0,
             n2 = 2,
             v7) )
  {
    n2 = 1;
  }
  LOBYTE(v2) = (n2 & n2) != 0;
  return v2;
}

//
// Function: EfiReleaseLock @ 0xad90
//
void __cdecl EfiReleaseLock(EFI_LOCK *Lock)
{
  __int64 v1; // rdx
  __int64 v2; // r8
  double v3; // xmm3_8
  _QWORD *v4; // rsi
  __int64 v5; // r14
  __int64 v7; // rbx

  v4 = (_QWORD *)v2;
  v5 = v1;
  if ( n0x10 == 4 && Lock && v1 )
  {
    do
LABEL_4:
      v7 = 0;
    while ( !Lock );
    while ( CloseEvent(*(_QWORD *)(v5 + 8 * v7), v1, v2, v3) == 0x8000000000000006uLL )
    {
      if ( ++v7 >= (unsigned __int64)Lock )
        goto LABEL_4;
    }
    if ( v4 )
      *v4 = v7;
  }
}

//
// Function: AcquireLock @ 0xae24
//
__int64 __fastcall AcquireLock(unsigned __int64 i, __int64 a2, __int64 a3, double a4)
{
  __int64 v6; // rdx
  __int64 v7; // r8
  __int64 v8; // rdx
  __int64 v9; // r8
  signed __int64 v10; // rax
  signed __int64 v11; // rbx

  if ( !i || *(_QWORD *)i != 1953396325 )
    return 0x8000000000000002uLL;
  if ( *(int *)(i + 8) < 0 )
    GetInfo_6(i, 0, 0, a4);
  DxeGetInfo_8((__int64)&unk_26088, a2, a3, a4);
  if ( *(_QWORD *)(i + 136) )
    Assert_58((_QWORD *)(i + 136), v6, v7, a4);
  if ( *(_QWORD *)(i + 72) )
    Assert_58((_QWORD *)(i + 72), v6, v7, a4);
  if ( *(_QWORD *)(i + 16) )
    Assert_58((_QWORD *)(i + 16), v6, v7, a4);
  DxeGetInfo_10((__int64)&unk_26088, v6, v7, a4);
  if ( (*(_BYTE *)(i + 88) & 2) != 0 )
    DxeConfig_46(i, v8, v9, a4);
  *(_QWORD *)i = 0;
  v10 = Assert_55(i, v8, v9, a4);
  v11 = v10;
  if ( v10 < 0 )
  {
    Assert_3(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v10);
    Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Event\\Event.c", 817, (__int64)"!EFI_ERROR (Status)", a4);
  }
  return v11;
}

//
// Function: EfiAcquireLock @ 0xb6f8
//
void __cdecl EfiAcquireLock(EFI_LOCK *Lock)
{
  char *buf; // rax
  __int64 v2; // rdx

  if ( (qword_260D0 & 1) != 0 )
  {
    Assert_3(0x400000, "SetPropertiesTableSectionAlignment - Clear\n");
    buf = buf_0;
    qword_260D0 &= ~1uLL;
    v2 = *((unsigned int *)buf_0 + 3);
    *((_DWORD *)buf_0 + 4) = 0;
    *((_QWORD *)buf + 7) = sub_7F40;
    (*((void (__fastcall **)(char *, __int64))buf + 43))(buf, v2);
  }
}

//
// Function: CpuFlushWrite @ 0xb50
//
void *__fastcall CpuFlushWrite(unsigned __int64 __ImageBase, unsigned __int64 count, __int64 a3, double a4)
{
  if ( !__ImageBase )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseDebugLibSerialPort\\DebugLib.c",
      179,
      (__int64)"Buffer != ((void *) 0)",
      a4);
  return SetMemWrapper(__ImageBase, count, 175, a4);
}

//
// Function: CpuGetInfo @ 0x950
//
__int64 __fastcall CpuGetInfo(unsigned int a1, _DWORD *p_n0xB, _DWORD *a3, _DWORD *a4, _DWORD *a5)
{
  __int64 v11; // [rsp-8h] [rbp-10h]

  v11 = a1;
  __asm { cpuid }
  if ( a4 )
    *a4 = _RCX;
  if ( p_n0xB )
    *p_n0xB = _RAX;
  if ( a3 )
    *a3 = _RBX;
  if ( a5 )
    *a5 = _RDX;
  return v11;
}

//
// Function: RawGetCpuInfo @ 0xa00
//
__int64 __fastcall RawGetCpuInfo(
        unsigned int n11,
        __int64 a2,
        _DWORD *a3,
        _DWORD *a4,
        _DWORD *a5,
        unsigned int *p_n0x100)
{
  __int64 n11_1; // [rsp-8h] [rbp-10h]

  n11_1 = n11;
  __asm { cpuid }
  if ( a5 )
    *a5 = _RCX;
  if ( a3 )
    *a3 = _RAX;
  if ( a4 )
    *a4 = _RBX;
  if ( p_n0x100 )
    *p_n0x100 = _RDX;
  return n11_1;
}

//
// Function: CoreRaiseTpl @ 0x1a5f0
//
int *__fastcall RaiseTpl(int *buf, int value, unsigned __int64 n4)
{
  int *buf_1; // rdi
  int value_1; // eax
  unsigned __int64 n4_1; // rcx
  __int16 value_2; // bx
  int v7; // eax
  __int64 v8; // rdx
  char n4_2; // dl
  unsigned __int64 i; // rcx

  buf_1 = buf;
  value_1 = value;
  n4_1 = n4;
  BYTE1(value_1) = value;
  value_2 = value_1;
  v7 = value_1 << 16;
  LOWORD(v7) = value_2;
  if ( n4 >= 4 )
  {
    v8 = (unsigned __int8)buf_1 & 3;
    if ( ((unsigned __int8)buf_1 & 3) != 0 )
    {
      memset(buf_1, value_2, 4 - v8);
      buf_1 = (int *)((char *)buf_1 + 4 - v8);
      n4_1 = n4 - (4 - v8);
    }
    n4_2 = n4_1;
    for ( i = n4_1 >> 2; i; --i )
      *buf_1++ = v7;
    n4_1 = n4_2 & 3;
  }
  memset(buf_1, value_2, n4_1);
  return buf;
}

//
// Function: CoreRestoreTpl @ 0x1a650
//
char *__fastcall RestoreTpl(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 }
  dst_1 = (unsigned __int64)dst;
  n8_1 = n8;
  v10 = 0;
  n8_2 = &src[-dst_1];
  if ( (unsigned __int64)src < dst_1 )
  {
    n8_2 = (char *)(dst_1 - (_QWORD)src);
    if ( (unsigned __int64)&src[n8] >= dst_1 )
    {
      src += n8;
      dst_1 += n8;
      v10 = 1;
    }
  }
  if ( n8 < 8 || (unsigned __int64)n8_2 < 8 )
    goto LABEL_19;
  count = (unsigned __int8)src & 7;
  count_1 = dst_1 & 7;
  if ( v10 )
  {
    --src;
    --dst_1;
  }
  if ( count == count_1 && count )
  {
    if ( !v10 )
      count = 8 - count;
    qmemcpy((void *)dst_1, src, count);
    src += count;
    dst_1 += count;
    n8_1 = n8 - count;
  }
  if ( v10 )
  {
    src -= 7;
    dst_1 -= 7LL;
  }
  n8_3 = n8_1;
  v15 = n8_1 >> 3;
  qmemcpy((void *)dst_1, src, 8 * v15);
  src += 8 * v15;
  dst_1 += 8 * v15;
  n8_4 = n8_3 & 7;
  if ( n8_4 )
  {
    if ( v10 )
    {
      src += 8;
      dst_1 += 8LL;
    }
    n8_1 = n8_4;
LABEL_19:
    if ( v10 )
    {
      --src;
      --dst_1;
    }
    qmemcpy((void *)dst_1, src, n8_1);
  }
  __asm { popf }
  return dst;
}

//
// Function: ValidateProtocolRecord @ 0x4b80
//
unsigned __int64 __fastcall CoreIsHandleValid(_QWORD *a1)
{
  if ( a1 )
    return -(__int64)(*a1 != 1818521192) & 0x8000000000000002uLL;
  else
    return 0x8000000000000002uLL;
}

//
// Function: IsProtocolInstalled @ 0x1d78
//
unsigned __int64 IsProtocolInstalled()
{
  return 0xA000000000000002uLL;
}

//
// Function: IsProtocolInstalledOnHandle @ 0x1d84
//
__int64 __fastcall IsProtocolInstalledOnHandle(__int64 a1)
{
  char *buf; // rax
  __int64 result; // rax
  unsigned int v4; // [rsp+30h] [rbp+8h] BYREF

  buf = buf_0;
  *(_DWORD *)(a1 + 16) = 0;
  v4 = 0;
  (*((void (__fastcall **)(__int64, _QWORD, unsigned int *))buf + 43))(a1, *(unsigned int *)(a1 + 12), &v4);
  result = v4;
  *(_DWORD *)(a1 + 16) = v4;
  return result;
}

//
// Function: AddProtocolToHandle @ 0x6118
//
signed __int64 __fastcall AddProtocolToHandle(
        _QWORD *_,
        __int64 *a2,
        __int64 a3,
        unsigned __int64 i,
        _QWORD *a5,
        char a6)
{
  signed __int64 k_1; // rax
  unsigned __int64 j; // rdi
  unsigned __int64 k; // rcx
  __int64 v13[5]; // [rsp+30h] [rbp-28h] BYREF

  k_1 = ValidateProtocolRecord(_);
  if ( k_1 >= 0 )
  {
    if ( a6 )
    {
      for ( j = 0; j < i; ++j )
      {
        k_1 = DxeConfig_5((_QWORD *)a5[j], (__int64)dst_3, v13, ::_, 0, 1u);
        if ( k_1 >= 0 )
        {
          k_1 = v13[0];
          if ( v13[0] )
          {
            if ( *(_QWORD **)(v13[0] + 32) == _ )
              k_1 = AddProtocolToHandle((_QWORD *)a5[j], a2, a3, i, a5, 0);
          }
        }
      }
    }
    else
    {
      k_1 = DxeConfig_5(_, (__int64)dst_3, v13, ::_, 0, 1u);
      if ( k_1 >= 0 && v13[0] )
      {
        k_1 = *a2;
        for ( k = 0; k < k_1; ++k )
        {
          if ( k >= i )
            break;
          if ( v13[0] == *(_QWORD *)(a3 + 8 * k) )
            return k_1;
        }
        if ( k_1 < i )
          *(_QWORD *)(a3 + 8 * k_1) = v13[0];
        *a2 = k_1 + 1;
        for ( k_1 = 0; k_1 < i; ++k_1 )
        {
          if ( (_QWORD *)a5[k_1] == _ )
            a5[k_1] = 0;
        }
      }
    }
  }
  return k_1;
}

//
// Function: RemoveProtocolFromHandle @ 0x6d80
//
_QWORD *__fastcall RemoveProtocolFromHandle(_BYTE *i, __int64 __ImageBase, __int64 a3, double a4)
{
  _QWORD *v4; // rdi
  _QWORD *result; // rax
  __int64 v7; // r8

  v4 = i + 8;
  result = (_QWORD *)Assert_58((_QWORD *)i + 1, __ImageBase, a3, a4);
  *v4 = 0;
  if ( i[24] )
    return Assert_53(&dst_1, v4, v7, a4);
  return result;
}

//
// Function: ReportStatusCode @ 0x146f0
//
EFI_STATUS __cdecl ReportStatusCode(EFI_STATUS_CODE_TYPE Type, EFI_STATUS_CODE_VALUE Value)
{
  __int64 v2; // r9
  __int64 v3; // rdi
  __int64 (__fastcall **v6)(_QWORD, _QWORD, _QWORD, __int64, __int64); // r10
  __int64 (__fastcall *v7)(void *, _QWORD, __int64 *); // r9
  __int64 v8; // rax
  __int64 v10; // [rsp+60h] [rbp+28h]

  v3 = v2;
  if ( (unsigned int)(unsigned __int8)Type - 1 > 2 )
    return 0x8000000000000003uLL;
  v6 = (__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, __int64, __int64))qword_26508;
  if ( qword_26508 )
    return (*v6)(Type, Value, 0, v3, v10);
  if ( !buf_0 )
    return 0x8000000000000003uLL;
  v7 = (__int64 (__fastcall *)(void *, _QWORD, __int64 *))*((_QWORD *)buf_0 + 40);
  if ( !v7 )
    return 0x8000000000000003uLL;
  v8 = v7(&unk_22410, 0, &qword_26508);
  v6 = (__int64 (__fastcall **)(_QWORD, _QWORD, _QWORD, __int64, __int64))qword_26508;
  if ( v8 < 0 )
    v6 = 0;
  qword_26508 = (__int64)v6;
  if ( v6 )
    return (*v6)(Type, Value, 0, v3, v10);
  else
    return 0x8000000000000003uLL;
}

//
// Function: GetGcdMemoryDescriptor @ 0xd7d0
//
__int64 __fastcall GetGcdMemoryDescriptor(int n2, char *dst, __int64 a3, unsigned __int64 *p_i, const char **p__)
{
  double v5; // xmm3_8
  __int64 result; // rax
  const char **p___1; // rbx
  __int64 v12; // rdx
  __int64 v13; // rcx
  __int64 v14; // r8
  __int64 *v15; // rax
  unsigned __int64 v16; // rcx
  unsigned __int64 n232; // [rsp+68h] [rbp+20h] BYREF

  if ( !p_i )
    return 0x8000000000000002uLL;
  p___1 = p__;
  if ( !p__ )
    return 0x8000000000000002uLL;
  *p_i = 0;
  n232 = 0;
  *p___1 = 0;
  v13 = DxeConfig_15(n2, dst, a3, &n232, 0);
  if ( v13 >= 0 || v13 == 0x8000000000000005uLL )
  {
    v15 = (__int64 *)Assert_112(n232, v12, v14, v5);
    *p___1 = (const char *)v15;
    if ( v15 )
    {
      result = DxeConfig_15(n2, dst, a3, &n232, v15);
      v16 = n232 >> 3;
      if ( result < 0 )
        v16 = 0;
      *p_i = v16;
    }
    else
    {
      return 0x8000000000000009uLL;
    }
  }
  else
  {
    if ( v13 != 0x8000000000000002uLL )
      return 0x800000000000000EuLL;
    return v13;
  }
  return result;
}

//
// Function: DumpGcdDebugInfo @ 0xd8c8
//
__int64 __fastcall DumpGcdDebugInfo(__int64 a1, __int64 a2, __int64 a3, double a4)
{
  __int64 v4; // r8
  __int64 v5; // rax
  int n88; // edx
  unsigned __int64 v7; // rbx
  unsigned __int64 n232; // rbp
  __int64 v9; // rax
  __int64 v10; // rax
  __int64 result; // rax
  unsigned __int64 __ImageBase; // [rsp+30h] [rbp+8h] BYREF

  __ImageBase = -1;
  if ( CoreOpenProtocol(1, 4, 0x401u, &__ImageBase) < 0 )
  {
    v5 = CoreOpenProtocol(0, 4, 0x401u, &__ImageBase);
    if ( v5 < 0 )
    {
      Assert_3(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v5);
      n88 = 88;
      return Assert_7(
               (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\DebugImageInfo.c",
               n88,
               (__int64)"!EFI_ERROR (Status)",
               a4);
    }
  }
  v7 = (__ImageBase + 0x3FFFFF) & 0xFFFFFFFFFFC00000uLL;
  n232 = ((v7 - __ImageBase) >> 12) + (((v7 - __ImageBase) & 0xFFF) != 0);
  if ( n232 )
  {
    v9 = DxeConfig_35(__ImageBase, n232, v4, a4);
    if ( v9 < 0 )
    {
      Assert_3(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v9);
      Assert_7(
        (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\DebugImageInfo.c",
        104,
        (__int64)"!EFI_ERROR (Status)",
        a4);
    }
  }
  if ( n232 != 1024 )
  {
    v10 = DxeConfig_35(v7 + 4096, 1024 - n232, v4, a4);
    if ( v10 < 0 )
    {
      Assert_3(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", v10);
      Assert_7(
        (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\DebugImageInfo.c",
        113,
        (__int64)"!EFI_ERROR (Status)",
        a4);
    }
  }
  qword_26488 = v7;
  if ( !v7 )
  {
    Assert_7(
      (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\DebugImageInfo.c",
      120,
      (__int64)"mDebugTable != ((void *) 0)",
      a4);
    v7 = qword_26488;
  }
  *(_DWORD *)(v7 + 16) = 0;
  *(_QWORD *)v7 = 0x5453595320494249LL;
  *(_QWORD *)(v7 + 8) = IBI_SYSTF_;
  result = DxeConfig_17((__int64)&qword_22600, DXE_SERV__0, v4, a4);
  if ( result < 0 )
  {
    Assert_3(0x80000000, "\nASSERT_EFI_ERROR (Status = %r)\n", result);
    n88 = 134;
    return Assert_7(
             (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Misc\\DebugImageInfo.c",
             n88,
             (__int64)"!EFI_ERROR (Status)",
             a4);
  }
  return result;
}

//
// Function: FvCacheRead @ 0x19524
//
__int64 __fastcall FvCacheRead(__int64 a1, unsigned __int8 *src, __int64 n0x14)
{
  unsigned int n0x1000000; // r10d
  unsigned __int8 *src_2; // rdi
  __int64 n7; // r14
  unsigned int v7; // r9d
  unsigned int n2; // r13d
  __int64 v9; // rbp
  unsigned int v10; // r12d
  unsigned __int8 *src_1; // r11
  unsigned __int64 v12; // r8
  int v13; // ecx
  unsigned int v15; // eax
  __int64 v16; // rsi
  __int64 v17; // r15
  unsigned int n0x1000000_4; // r10d
  __int64 v19; // rcx
  unsigned int n0x100_1; // ecx
  int v21; // edx
  unsigned int v22; // eax
  unsigned __int64 v23; // rcx
  __int64 v24; // rax
  unsigned int n0x100; // ebx
  int v26; // ebp
  unsigned int i; // esi
  int v28; // edx
  int v29; // ecx
  unsigned int v30; // eax
  int v31; // edx
  unsigned int n0x1000000_1; // r10d
  unsigned int n0x1000000_9; // r9d
  int n16; // esi
  int n3; // ebx
  unsigned int n0x1000000_16; // eax
  unsigned int n0x1000000_2; // r10d
  __int64 n1636; // rax
  unsigned int n4_1; // r1... [11560 chars total]

//
// Function: FvCacheWrite @ 0x19b34
//
__int64 __fastcall FvCacheWrite(__int64 a1, unsigned __int64 a2, char *src, unsigned __int64 *a4, int a5, _DWORD *p_n3)
{
  double v6; // xmm3_8
  unsigned __int64 n0x14_2; // rbp
  unsigned int v8; // esi
  unsigned __int64 v11; // r13
  __int64 v13; // rcx
  bool v14; // zf
  char v15; // al
  __int64 v16; // rcx
  int v17; // ecx
  int v18; // r8d
  _WORD *v19; // rdi
  __int64 i; // rcx
  unsigned int n0x14; // edi
  char *src_1; // r8
  int n2_1; // eax
  __int64 v24; // rax
  unsigned int n0x14_3; // r13d
  __int64 v26; // rcx
  int n2; // eax
  unsigned int n0x14_1; // eax
  unsigned int n0x14_4; // edi
  bool v31; // zf
  int v33; // [rsp+70h] [rbp+28h]

  n0x14_2 = *a4;
  v8 = 0;
  *a4 = 0;
  v11 = a2;
  sub_193F8(a1, a2);
  v14 = *(_DWORD *)(v13 + 92) == 274;
  *p_n3 = 0;
  while ( 1 )
  {
    if ( v14 )
    {
      v31 = *(_DWORD *)(a1 + 44) == 0;
      if ( !*(_DWORD *)(a1 + 44) )
        *p_n3 = 1;
      LOBYTE(v8) = !v31;
      return v8;
    }
    if ( *(_DWORD *)(a1 + 96) )
    {
      if ( n0x14_2 )
      {
        while ( *(_DWORD *)(a1 + 108) < 5u )
        {
          v15 = *src++;
          v16 = *(unsigned int *)(a1 + 108);
          ++*a4;
          *(_BYTE *)(v16 + a1 + 112) = v15;
          ++*(_DWORD *)(a1 + 108);
          if ( !--n0x14_2 )
            goto LABEL_7;
        }
      }
      else
      {
LABEL_7:
        if ( *(_DWORD *)(a1 + 108) < 5u )
          goto LABEL_43;
      }
      if ( *(_BYTE *)(a1 + 112) )
        return 1;
      v17 = *(unsigned __int8 *)(a1 + 116)
          | ((*(unsigned __int8 *)(a1 + 115)
            | ((*(unsigned __int8 *)(a1 + 114) | (*(unsigned __int8 *)(a1 + 113) << 8)) << 8)) << 8);
      *(_DWORD *)(a1 + 96) = 0;
      *(_DWORD *)(a1 + 40) = -1;
      *(_DWORD *)(a1 + 44) = v17;
      *(_DWORD *)(a1 + 108) = 0;
    }
    v18 = 0;
    v33 = 0;
    if ( *(_QWORD *)(a1 + 48) < v11 )
      goto LABEL_14;
    if ( *(_DWORD *)(a1 + 92) )
      break;
    if ( !*(_DWORD *)(a1 + 44) )
    {
      *p_n3 = 4;
      return 0;
    }
    v18 = 1;
    v33 = 1;
LABEL_14:
    if ( *(_DWORD *)(a1 + 100) )
    {
      v19 = *(_WORD **)(a1 + 16);
      for ( i = (unsigned int)((768 << (*(_BYTE *)a1 + *(_BYTE *)(a1 + 4))) + 1846); i; --i )
        *v19++ = 1024;
      *(_DWORD *)(a1 + 88) = 1;
      *(_DWORD *)(a1 + 84) = 1;
      *(_DWORD *)(a1 + 80) = 1;
      *(_DWORD *)(a1 + 76) = 1;
      *(_DWORD *)(a1 + 72) = 0;
      *(_DWORD *)(a1 + 100) = 0;
    }
    n0x14 = *(_DWORD *)(a1 + 108);
    if ( n0x14 )
    {
      n0x14_3 = 0;
      if ( n0x14 < 0x14 )
      {
        v26 = *(unsigned int *)(a1 + 108);
        do
        {
          if ( n0x14_3 >= n0x14_2 )
            break;
          ++n0x14;
          *(_BYTE *)(v26 + a1 + 112) = src[n0x14_3++];
          ++v26;
        }
        while ( n0x14 < 0x14 );
      }
      *(_DWORD *)(a1 + 108) = n0x14;
      if ( n0x14 < 0x14 || v18 )
      {
        n2 = FvCacheRead(a1, (unsigned __int8 *)(a1 + 112), n0x14);
        if ( !n2 )
        {
          *a4 += n0x14_3;
LABEL_43:
          *p_n3 = 3;
          return 0;
        }
        if ( v33 && n2 != 2 )
        {
LABEL_48:
          *p_n3 = 2;
          return 1;
        }
      }
      *(_QWORD *)(a1 + 32) = a1 + 112;
      if ( (unsigned int)sub_19484(a1, a2, a1 + 112) )
        return 1;
      n0x14_1 = *(_DWORD *)(a1 + 32) - a1 - 112;
      if ( n0x14 < n0x14_1 )
        return 11;
      n0x14_4 = n0x14 - n0x14_1;
      if ( n0x14_3 < n0x14_4 )
        return 11;
      *(_DWORD *)(a1 + 108) = 0;
      v24 = n0x14_3 - n0x14_4;
      v11 = a2;
      src += v24;
    }
    else
    {
      if ( n0x14_2 < 0x14 || v18 )
      {
        n2_1 = FvCacheRead(a1, (unsigned __int8 *)src, n0x14_2);
        if ( !n2_1 )
        {
          CopyMemWrapper((char *)(a1 + 112), src, n0x14_2, v6);
          *a4 += n0x14_2;
          *(_DWORD *)(a1 + 108) = n0x14_2;
          goto LABEL_43;
        }
        if ( v33 && n2_1 != 2 )
          goto LABEL_48;
        src_1 = src;
      }
      else
      {
        src_1 = &src[n0x14_2 - 20];
      }
      *(_QWORD *)(a1 + 32) = src;
      if ( (unsigned int)sub_19484(a1, v11, (unsigned __int64)src_1) )
        return 1;
      v24 = *(_QWORD *)(a1 + 32) - (_QWORD)src;
      src = *(char **)(a1 + 32);
    }
    *a4 += v24;
    n0x14_2 -= v24;
    v14 = *(_DWORD *)(a1 + 92) == 274;
  }
  *p_n3 = 2;
  return 1;
}

//
// Function: GetSectionFromFv @ 0x19edc
//
// local variable allocation has failed, the output may be wrong!
EFI_STATUS __cdecl GetSectionFromFv(
        const EFI_GUID *NameGuid,
        EFI_SECTION_TYPE SectionType,
        UINTN SectionInstance,
        void **Buffer,
        UINTN *Size)
{
  double v5; // xmm3_8
  _DWORD *SectionType_1; // r14
  int Data2; // eax
  unsigned int v12; // ecx

  SectionType_1 = (_DWORD *)SectionType;
  if ( (NameGuid->Data1 & 0xFFFFFF) == 0xFFFFFF )
  {
    if ( !Assert_103((__int64)src_6, (__int64)NameGuid->Data4, SectionInstance, v5) )
      return 0x8000000000000002uLL;
    *(_WORD *)Buffer = *(_WORD *)&NameGuid[1].Data4[2];
    *(_DWORD *)SectionInstance = 0;
    Data2 = *(unsigned __int16 *)NameGuid[1].Data4;
    v12 = *(_DWORD *)&NameGuid->Data2;
  }
  else
  {
    if ( !Assert_103((__int64)src_6, (__int64)&NameGuid->Data2, SectionInstance, v5) )
      return 0x8000000000000002uLL;
    *(_WORD *)Buffer = NameGuid[1].Data3;
    *(_DWORD *)SectionInstance = 0;
    Data2 = NameGuid[1].Data2;
    v12 = NameGuid->Data1 & 0xFFFFFF;
  }
  *SectionType_1 = v12 - Data2;
  return 0;
}