Newer
Older
AMI-Aptio-BIOS-Reversed / DxeCore / Gcd / Gcd.c
@Ajax Dong Ajax Dong 2 days ago 22 KB Init
/** @file
  GCD (Global Coherency Domain) Services for DxeCore

  Source: DxeCore.efi (HR650X BIOS)
  Decompiled from MdeModulePkg\Core\Dxe\Gcd\Gcd.c
*/

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

//
// Function: CoreConvertSpaceInner @ 0x3cbc
//
unsigned __int64 __fastcall CoreConvertSpaceInner(unsigned __int64 *a1, _QWORD *a2, unsigned __int64 a3, _WORD *i)
{
  unsigned __int64 v5; // r8
  __int16 n2; // cx
  unsigned __int64 v8; // r10
  _WORD *j; // rax
  unsigned __int64 v10; // rbx
  unsigned __int64 v11; // rdx
  _QWORD *v12; // rcx
  unsigned __int64 v14; // rax
  _QWORD v15[2]; // [rsp+20h] [rbp-10h] BYREF
  unsigned __int64 v16; // [rsp+50h] [rbp+20h] BYREF
  _QWORD *v17; // [rsp+58h] [rbp+28h]
  _WORD *ia; // [rsp+68h] [rbp+38h]

  ia = i;
  v17 = a2;
  v5 = *a1;
  v15[0] = *a2;
  v16 = v5;
  n2 = *i;
  v8 = v15[0] + v5;
  for ( j = i; ; n2 = *j )
  {
    if ( n2 == -1 )
      return 0;
    if ( n2 == 2 )
    {
      v10 = *((_QWORD *)j + 3);
      v11 = v10 + *((_QWORD *)j + 4);
      if ( v11 > v5 && v10 < v8 )
        break;
    }
    j = (_WORD *)((char *)j + (unsigned __int16)j[1]);
  }
  if ( v11 < v8 )
  {
    v16 = v10 + *((_QWORD *)j + 4);
    v15[0] = v8 - v11;
    if ( v8 - v11 >= a3 )
    {
      if ( (CoreConvertSpaceInner(&v16, v15, a3, i) & 0x8000000000000000uLL) == 0LL )
      {
LABEL_10:
        v12 = v17;
        *a1 = v16;
        *v12 = v15[0];
        return 0;
      }
      i = ia;
    }
  }
  v14 = *a1;
  v16 = v14;
  if ( v10 > v14 )
  {
    v15[0] = v10 - v14;
    if ( v10 - v14 >= a3 && (CoreConvertSpaceInner(&v16, v15, a3, i) & 0x8000000000000000uLL) == 0LL )
      goto LABEL_10;
  }
  return 0x800000000000000EuLL;
}

//
// Function: CoreAddMemorySpace @ 0x62b4
//
unsigned __int64 __fastcall CoreAddMemorySpace(_QWORD *_, __int64 *a2, char *__ImageBase, double a4)
{
  double v4; // xmm2_8
  unsigned int v5; // r12d
  _QWORD *__1; // r13
  __int64 v8; // rdx
  __int64 v9; // r8
  unsigned __int64 i; // rbx
  __int64 v11; // rdx
  char *__ImageBase_1; // rdi
  __int64 v13; // r8
  char *p___1; // r14
  _QWORD *__2; // rax
  __int64 v17; // r15
  __int64 (__fastcall **Unknown_4)(_QWORD, _QWORD *, _QWORD **); // rsi
  unsigned __int64 i_2; // rsi
  unsigned __int64 i_1; // r15
  unsigned int v21; // eax
  __int64 v22; // rdx
  __int64 v23; // r8
  __int64 (__fastcall **Unknown_5)(_QWORD, _QWORD **); // rsi
  unsigned __int64 p_i_2; // r15
  unsigned __int64 i_3; // r12
  unsigned __int64 p_i_3; // rsi
  __int64 v28; // rdx
  __int64 v29; // r8
  __int64 p_i_4; // rdx
  unsigned __int64 p_i_6; // r8
  __int64 v32; // r10
  unsigned __int64 p_i_5; // rcx
  unsigned int v34; // r9d
  __int64 v35; // rax
  char p_i_7; // al
  __int64 v37; // r14
  __int64 v38; // r13
  __int64 v39; // rbx
  _QWORD *__4; // r9
  unsigned __int64 Unknown_1; // rsi
  __int64 v42; // rdx
  __int64 v43; // rcx
  __int64 (__fastcall **v44)(_QWORD, const char *, __int64 *); // r8
  __int64 v45; // rax
  unsigned __int64 Unknown_3; // rbx
  __int64 (__fastcall **v47)(char *, __int64, _QWORD); // rax
  const char *Unknown_2; // r12
  char *__5; // rax
  __int64 v50; // rdx
  __int64 v51; // r8
  __int64 v52; // rbx
  __int64 v53; // rdx
  __int64 __ImageBase_2; // r8
  char *p__; // [rsp+40h] [rbp-30h] BYREF
  _QWORD *_a; // [rsp+48h] [rbp-28h] BYREF
  unsigned int p_i_1[2]; // [rsp+50h] [rbp-20h] BYREF
  __int64 Unknown; // [rsp+58h] [rbp-18h] BYREF
  char *__3; // [rsp+60h] [rbp-10h] BYREF
  unsigned __int64 p_i; // [rsp+C8h] [rbp+58h] BYREF

  v5 = 0;
  *(_QWORD *)p_i_1 = 0;
  __1 = _;
  p__ = 0;
  p_i = 0;
  Unknown = 0;
  __3 = 0;
  if ( sub_D7D0(2, dst_3, 0, (unsigned __int64 *)p_i_1, (const char **)&p__) < 0 )
    return 0x800000000000000EuLL;
  i = *(_QWORD *)p_i_1;
  if ( !*(_QWORD *)p_i_1 )
    return 0x800000000000000EuLL;
  __ImageBase_1 = Assert_112(8LL * *(_QWORD *)p_i_1, v8, v9, a4);
  if ( !__ImageBase_1 )
  {
    Assert_55((unsigned __int64)p__, v11, v13, a4);
    return 0x8000000000000009uLL;
  }
  p___1 = p__;
  if ( a2 )
  {
    __2 = (_QWORD *)*a2;
    v17 = 0;
    if ( *a2 )
    {
      do
      {
        sub_6118(__2, (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 0);
        __2 = (_QWORD *)a2[++v17];
      }
      while ( __2 );
      __1 = _;
    }
  }
  if ( GetInfo_9((__int64)&unk_22730, 0, &Unknown, a4) >= 0 )
  {
    Unknown_4 = (__int64 (__fastcall **)(_QWORD, _QWORD *, _QWORD **))Unknown;
    if ( Unknown )
    {
      for ( _a = 0;
            (*Unknown_4)(Unknown_4, __1, &_a) >= 0;
            sub_6118(_a, (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 1) )
      {
        ;
      }
    }
  }
  while ( 1 )
  {
    i_2 = 0;
    i_1 = i;
    if ( !i )
      break;
    do
    {
      if ( DxeConfig_5(*(_QWORD **)&p___1[8 * i_2], (__int64)&qword_22560, &Unknown, ::_, 0, 1u) >= 0 )
      {
        if ( Unknown )
        {
          v21 = (*(__int64 (__fastcall **)(__int64))Unknown)(Unknown);
          if ( i_1 == i || v21 > v5 )
          {
            v5 = v21;
            i_1 = i_2;
          }
        }
      }
      ++i_2;
    }
    while ( i_2 < i );
    if ( i_1 == i )
      break;
    v5 = 0;
    sub_6118(*(_QWORD **)&p___1[8 * i_1], (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 0);
  }
  if ( DxeConfig_5(_, (__int64)&qword_225B0, &Unknown, ::_, 0, 1u) >= 0 )
  {
    Unknown_5 = (__int64 (__fastcall **)(_QWORD, _QWORD **))Unknown;
    if ( Unknown )
    {
      for ( _a = 0; (*Unknown_5)(Unknown_5, &_a) >= 0; sub_6118(
                                                         _a,
                                                         (__int64 *)&p_i,
                                                         (__int64)__ImageBase_1,
                                                         i,
                                                         p___1,
                                                         1) )
        ;
    }
  }
  p_i_2 = p_i;
  i_3 = 0;
  p_i_3 = p_i;
  if ( i )
  {
    do
      sub_6118(*(_QWORD **)&p___1[8 * i_3++], (__int64 *)&p_i, (__int64)__ImageBase_1, i, p___1, 0);
    while ( i_3 < i );
    p_i_2 = p_i;
  }
  Assert_55((unsigned __int64)p___1, v22, v23, a4);
  sub_D7D0(2, dst_3, 0, &p_i, (const char **)&__3);
  Assert_55((unsigned __int64)__3, v28, v29, a4);
  if ( p_i > i )
  {
    Assert_55((unsigned __int64)__ImageBase_1, p_i_4, p_i_6, a4);
    return 0x8000000000000006uLL;
  }
  if ( p_i_3 < p_i_2 )
  {
    do
    {
      v32 = *(_QWORD *)&__ImageBase_1[8 * p_i_3];
      p_i_6 = p_i_3 + 1;
      p_i_4 = p_i_3;
      p_i_5 = p_i_3 + 1;
      v34 = *(_DWORD *)(v32 + 24);
      if ( p_i_3 + 1 < p_i_2 )
      {
        do
        {
          v35 = *(_QWORD *)&__ImageBase_1[8 * p_i_5];
          if ( *(_DWORD *)(v35 + 24) > v34 )
          {
            v34 = *(_DWORD *)(v35 + 24);
            p_i_4 = p_i_5;
          }
          ++p_i_5;
        }
        while ( p_i_5 < p_i_2 );
        if ( p_i_3 != p_i_4 )
        {
          *(_QWORD *)&__ImageBase_1[8 * p_i_3] = *(_QWORD *)&__ImageBase_1[8 * p_i_4];
          *(_QWORD *)&__ImageBase_1[8 * p_i_4] = v32;
        }
      }
      ++p_i_3;
    }
    while ( p_i_6 < p_i_2 );
  }
  LOBYTE(p_i_3) = 0;
  LODWORD(p__) = p_i_3;
LABEL_42:
  while ( 1 )
  {
    p_i_7 = 0;
    v37 = 0;
    LOBYTE(p_i) = 0;
    if ( !p_i_2 )
      break;
    while ( !p_i_7 )
    {
      v38 = *(_QWORD *)&__ImageBase_1[8 * v37];
      if ( v38 )
      {
        Assert_14(*(_QWORD *)(v38 + 40), "DB:Support:", 0, 0, 0);
        v39 = (*(__int64 (__fastcall **)(__int64, _QWORD *, char *))v38)(v38, _, __ImageBase);
        Assert_95(*(_QWORD *)(v38 + 40), "DB:Support:", 0, 0);
        if ( v39 < 0 )
        {
          p_i_7 = p_i;
        }
        else
        {
          __4 = ::_;
          *(_QWORD *)&__ImageBase_1[8 * v37] = 0;
          Unknown_1 = 0;
          LOBYTE(p_i) = 1;
          if ( DxeConfig_5(_, (__int64)&qword_22550, (__int64 *)p_i_1, __4, 0, 1u) < 0
            || (v45 = sub_626C(v43, v42, (__int64)v44, a4)) == 0
            || (LOBYTE(v44) = 1,
                LOBYTE(v42) = 1,
                Unknown = (*(__int64 (__fastcall **)(_QWORD, __int64, _QWORD))(v45 + 8))(*(_QWORD *)p_i_1, v42, v44),
                (Unknown_1 = Unknown) == 0) )
          {
            Unknown = (__int64)L"Unknown";
          }
          Unknown_3 = 0;
          if ( __ImageBase )
          {
            v47 = (__int64 (__fastcall **)(char *, __int64, _QWORD))sub_626C(v43, v42, (__int64)v44, a4);
            if ( !v47
              || (LOBYTE(v44) = 1,
                  LOBYTE(v42) = 1,
                  Unknown_3 = (*v47)(__ImageBase, v42, v44),
                  (Unknown_2 = (const char *)Unknown_3) == 0) )
            {
              Unknown_2 = (const char *)L"Unknown";
            }
            __5 = (char *)L";";
          }
          else
          {
            __5 = (char *)&unk_1DE1C;
            Unknown_2 = (const char *)&unk_1DE1C;
          }
          __3 = __5;
          Assert_46(v38, v42, v44, a4);
          Assert_3(4, "%a.Start(%p)[%s%s%s]=", v4, *(const void **)(v38 + 8), (const char *)Unknown, __3, Unknown_2);
          if ( Unknown_1 )
            Assert_55(Unknown_1, v50, v51, a4);
          if ( Unknown_3 )
            Assert_55(Unknown_3, v50, v51, a4);
          Assert_14(*(_QWORD *)(v38 + 40), "DB:Start:", 0, 0, 0);
          v52 = (*(__int64 (__fastcall **)(__int64, _QWORD *, char *))(v38 + 8))(v38, _, __ImageBase);
          Assert_95(*(_QWORD *)(v38 + 40), "DB:Start:", 0, 0);
          Assert_3(4, "%r\n", v52);
          p_i_7 = 1;
          LODWORD(p_i_3) = (unsigned __int8)p__;
          if ( v52 >= 0 )
            LODWORD(p_i_3) = 1;
          LODWORD(p__) = p_i_3;
        }
      }
      if ( ++v37 >= p_i_2 )
      {
        if ( p_i_7 )
          goto LABEL_42;
        goto LABEL_66;
      }
    }
  }
LABEL_66:
  Assert_55((unsigned __int64)__ImageBase_1, p_i_4, p_i_6, a4);
  if ( (_BYTE)p_i_3 || __ImageBase && Assert_51((__int64)__ImageBase, v53, __ImageBase_2, a4) )
    return 0;
  else
    return 0x800000000000000EuLL;
}

//
// Function: CoreSetMemorySpace @ 0x72c0
//
void __fastcall CoreSetMemorySpace(unsigned int n7, unsigned __int64 __ImageBase, __int64 a3, __int64 a4)
{
  double v4; // xmm3_8
  __int64 v9; // rdx
  __int64 v10; // rcx
  __int64 v11; // r8
  __int64 v12; // rdx
  __int64 v13; // r8
  __int64 v14; // r8
  int n15; // edx
  unsigned __int64 i_1; // rsi
  char *DXE_SERV___2; // rax
  __int64 v18; // rbx
  __int64 n7_1; // rdx
  unsigned int n232_2; // ecx
  __int64 v21; // rdi
  __int64 *v22; // r14
  __int64 v23; // rdx
  bool v24; // cf
  __int64 v25; // rsi
  char *DXE_SERV__; // rax
  __int64 v27; // rdi
  bool v28; // cc
  unsigned int n232; // ecx
  __int64 v30; // rax
  __int64 v31; // rbx
  int v32; // r9d
  __int64 *v33; // rcx
  __int64 v34; // rax
  char *DXE_SERV___1; // r8
  bool v36; // zf
  unsigned __int64 i; // rdi
  unsigned int n232_1; // ecx
  __int64 v39; // rax
  __int64 v40; // rbx
  char v41; // [rsp+10h] [rbp+10h] BYREF

  if ( (__ImageBase & 0xFFF) == 0 && n7 - 15 > 0x6FFFFFF0 )
  {
    DxeGetInfo_8((__int64)&unk_26340, __ImageBase, a3, v4);
    DxeConfig_14(n7, __ImageBase, (a3 << 12) + __ImageBase - 1, a4);
    DxeDriverEntry_2(v10, v9, v11, v4);
    DxeGetInfo_10((__int64)&unk_26340, v12, v13, v4);
    v41 = 0;
    if ( qword_263D0 )
      (*(void (__fastcall **)(__int64, char *))qword_263D0)(qword_263D0, &v41);
    if ( !byte_26439 )
    {
      n15 = *(_DWORD *)DXE_SERV__;
      i_1 = 0;
      if ( *(_DWORD *)DXE_SERV__ == 15 )
      {
LABEL_15:
        v25 = 0;
        if ( n15 != 15 )
        {
          DXE_SERV__ = DXE_SERV__;
          v27 = 0;
          v28 = *(_DWORD *)DXE_SERV__ <= 0xFu;
          do
          {
            if ( v28 )
            {
              n232 = *(_DWORD *)&DXE_SERV__[v27 + 4];
              if ( n232 )
              {
                v30 = *(int *)DXE_SERV__;
                v31 = 6 * v30;
                DxeConfig_35(qword_25B90[6 * v30], n232, v14, v4);
                qword_25B90[v31 + 3] = *(unsigned int *)&DXE_SERV__[v27 + 4];
                *(_DWORD *)&DXE_SERV__[v27 + 4] = 0;
              }
            }
            ++v25;
            v27 = 8 * v25;
            DXE_SERV__ = &DXE_SERV__[8 * v25];
            v28 = *(_DWORD *)DXE_SERV__ <= 0xFu;
          }
          while ( *(_DWORD *)DXE_SERV__ != 15 );
          n15 = *(_DWORD *)DXE_SERV__;
        }
        v32 = 0;
        v33 = qword_25B98;
        do
        {
          v34 = 0;
          if ( n15 != 15 )
          {
            DXE_SERV___1 = DXE_SERV__;
            do
            {
              if ( v32 == *(_DWORD *)DXE_SERV___1 )
                v33[3] = v34;
              ++v34;
              DXE_SERV___1 = &DXE_SERV__[8 * v34];
            }
            while ( *(_DWORD *)DXE_SERV___1 != 15 );
          }
          v36 = *v33 == -1;
          v33[1] = 0;
          if ( v36 )
            *v33 = _ImageBase_1;
          ++v32;
          v33 += 6;
        }
        while ( (__int64)v33 < (__int64)&unk_25E68 );
        byte_26439 = 1;
        return;
      }
      DXE_SERV___2 = DXE_SERV__;
      v18 = 0;
      while ( 1 )
      {
        n7_1 = *(int *)DXE_SERV___2;
        if ( (unsigned int)n7_1 <= 0xF )
        {
          n232_2 = *(_DWORD *)&DXE_SERV__[v18 + 4];
          if ( n232_2 )
          {
            v21 = 6 * n7_1;
            v22 = &qword_25B90[6 * n7_1];
            if ( GetInfo_2(0, n7_1, n232_2, v22) < 0 )
            {
              for ( i = 0; i < i_1; ++i )
              {
                if ( *(_DWORD *)&DXE_SERV__[8 * i] <= 0xFu )
                {
                  n232_1 = *(_DWORD *)&DXE_SERV__[8 * i + 4];
                  if ( n232_1 )
                  {
                    v39 = *(int *)&DXE_SERV__[8 * i];
                    v40 = 6 * v39;
                    DxeConfig_35(qword_25B90[6 * v39], n232_1, v14, v4);
                    qword_25B90[v40 + 1] = -1;
                    qword_25B90[v40] = 0;
                  }
                }
              }
              return;
            }
            v23 = *v22;
            v24 = *v22 < _ImageBase_1;
            qword_25B90[v21 + 1] = ((unsigned __int64)*(unsigned int *)&DXE_SERV__[v18 + 4] << 12) + *v22 - 1;
            if ( v24 )
              _ImageBase_1 = v23 - 1;
          }
        }
        ++i_1;
        v18 = 8 * i_1;
        DXE_SERV___2 = &DXE_SERV__[8 * i_1];
        if ( *(_DWORD *)DXE_SERV___2 == 15 )
        {
          n15 = *(_DWORD *)DXE_SERV__;
          goto LABEL_15;
        }
      }
    }
  }
}

//
// Function: SetMemWrapper @ 0x127bc
//
void *__fastcall SetMemWrapper(unsigned __int64 buf, unsigned __int64 count, char value, double a4)
{
  void *buf_1; // rax

  buf_1 = (void *)buf;
  if ( count )
  {
    if ( count - 1 > ~buf )
      Assert_7(
        (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMemWrapper.c",
        54,
        (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)",
        a4);
    return sub_3E0((void *)buf, count, value);
  }
  return buf_1;
}

//
// Function: CopyMemWrapper @ 0x12820
//
char *__fastcall CopyMemWrapper(char *dst, char *src, unsigned __int64 count, double a4)
{
  char *dst_1; // rax
  unsigned __int64 v8; // rbp

  dst_1 = dst;
  if ( count )
  {
    v8 = count - 1;
    if ( count - 1 > ~(unsigned __int64)dst )
      Assert_7(
        (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
        56,
        (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)",
        a4);
    if ( v8 > ~(unsigned __int64)src )
      Assert_7(
        (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
        57,
        (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)",
        a4);
    if ( dst == src )
      return dst;
    else
      return sub_400(dst, src, count);
  }
  return dst_1;
}

//
// Function: ZeroMemWrapper @ 0x128bc
//
char *__fastcall ZeroMemWrapper(char *buf, unsigned __int64 a2, __int64 a3, double a4)
{
  if ( !buf )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
      53,
      (__int64)"Buffer != ((void *) 0)",
      a4);
  if ( a2 > -(__int64)buf )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
      54,
      (__int64)"Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)",
      a4);
  return sub_450(buf, a2);
}

//
// Function: CompareMemWrapper @ 0x129d0
//
unsigned __int64 __fastcall CompareMemWrapper(__int64 i, __int64 i_1, __int64 a3, double a4)
{
  if ( !a3 || i == i_1 )
    return 0;
  if ( !i )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      60,
      (__int64)"DestinationBuffer != ((void *) 0)",
      a4);
  if ( !i_1 )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      61,
      (__int64)"SourceBuffer != ((void *) 0)",
      a4);
  if ( a3 - 1 > (unsigned __int64)~i )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      62,
      (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)",
      a4);
  if ( a3 - 1 > (unsigned __int64)~i_1 )
    Assert_7(
      (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CompareMemWrapper.c",
      63,
      (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)",
      a4);
  return sub_470((_BYTE *)i, (_BYTE *)i_1, a3);
}

//
// Function: GetHobListWrapper @ 0x12aa8
//
__int64 __fastcall GetHobListWrapper(__int64 a1, __int64 a2, __int64 a3, double a4)
{
  __int64 ImageHandle; // rax

  ImageHandle = ImageHandle;
  if ( !ImageHandle )
  {
    Assert_7((__int64)"e:\\hs\\MdePkg\\Library\\DxeCoreHobLib\\HobLib.c", 44, (__int64)"gHobList != ((void *) 0)", a4);
    return ImageHandle;
  }
  return ImageHandle;
}

//
// Function: GetNextHobWrapper @ 0x12adc
//
_WORD *__fastcall GetNextHobWrapper(__int16 a1, _WORD *a2, __int64 a3, double a4)
{
  _WORD *v4; // rbx

  v4 = a2;
  if ( !a2 )
    Assert_7((__int64)"e:\\hs\\MdePkg\\Library\\DxeCoreHobLib\\HobLib.c", 74, (__int64)"HobStart != ((void *) 0)", a4);
  while ( 1 )
  {
    if ( *v4 == 0xFFFF )
      return 0;
    if ( *v4 == a1 )
      break;
    v4 = (_WORD *)((char *)v4 + (unsigned __int16)v4[1]);
  }
  return v4;
}

//
// Function: SetMem16Wrapper @ 0x153f8
//
__int64 __fastcall SetMem16Wrapper(
        __int64 buf,
        unsigned __int16 n0x3FB,
        __int64 a3,
        unsigned __int16 n0x10,
        __int64 a5)
{
  double v5; // xmm3_8
  _WORD *v6; // rdi
  unsigned __int16 n0x10_1; // r15
  __int64 v8; // r11
  unsigned __int16 n0x3FB_1; // r10
  __int64 i; // rcx
  unsigned __int16 n0x3FB_2; // di
  __int64 v12; // rax
  unsigned __int16 n0x10_2; // r8
  __int64 v14; // r9
  int v15; // edi
  __int16 v16; // dx
  char v17; // si
  unsigned __int16 n0x10_3; // di
  __int64 n0x10_7; // rdx
  char v20; // al
  __int64 n0x10_4; // rax
  __int16 v23; // dx
  char n0x10_5; // r14
  unsigned __int16 v25; // dx
  _WORD *v26; // rbx
  unsigned __int64 v27; // rdi
  unsigned __int16 n0x3FB_3; // bx
  unsigned __int16 v29; // r12
  unsigned __int16 v30; // r9
  __int64 n0x10_6; // r8
  unsigned __int16 v32; // di
  __int64 v33; // r11
  unsigned __int16 v34; // r10
  __int64 v35; // rax
  unsigned __int16 *v36; // rcx
  __int16 v37; // r8
  unsigned __int16 v38; // ax
  __int64 v39; // rcx
  unsigned __int16 v40; // [rsp+20h] [rbp-51h]
  char v41; // [rsp+28h] [rbp-49h]
  _WORD v42[20]; // [rsp+30h] [rbp-41h] BYREF
  _DWORD v43[8]; // [rsp+58h] [rbp-19h]
  __int16 v44; // [rsp+7Ah] [rbp+9h]

  v6 = v42;
  n0x10_1 = n0x10;
  v8 = a3;
  n0x3FB_1 = n0x3FB;
  for ( i = 17; i; --i )
    *v6++ = 0;
  n0x3FB_2 = 0;
  if ( n0x3FB )
  {
    while ( *(_BYTE *)(n0x3FB_2 + a3) <= 0x10u )
    {
      v12 = *(unsigned __int8 *)(n0x3FB_2++ + a3);
      ++v42[v12];
      if ( n0x3FB_2 >= n0x3FB )
        goto LABEL_7;
    }
    return 0xFFFF;
  }
LABEL_7:
  v43[0] = 0;
  n0x10_2 = 1;
  v14 = 0;
  do
  {
    v15 = n0x10_2++;
    v16 = *(_WORD *)((char *)v43 + v14 * 2 + 2) + (v42[v14 + 1] << (16 - v15));
    ++v14;
    *((_WORD *)v43 + v15 + 1) = v16;
  }
  while ( n0x10_2 <= 0x10u );
  if ( v44 )
    return 0xFFFF;
  v42[0] = 0;
  v17 = 16 - n0x10_1;
  n0x10_3 = 1;
  if ( !n0x10_1 )
    goto LABEL_14;
  do
  {
    n0x10_7 = n0x10_3;
    v20 = n0x10_3++;
    *((_WORD *)v43 + n0x10_7) >>= v17;
    v42[n0x10_7] = 1 << (n0x10_1 - v20);
  }
  while ( n0x10_3 <= n0x10_1 );
  while ( n0x10_3 <= 0x10u )
  {
LABEL_14:
    n0x10_4 = n0x10_3;
    v23 = 1 << (16 - n0x10_3++);
    v42[n0x10_4] = v23;
  }
  n0x10_5 = n0x10_1;
  v25 = *((_WORD *)v43 + n0x10_1 + 1) >> v17;
  if ( v25 )
  {
    if ( v25 < (unsigned __int16)(1 << n0x10_1) )
    {
      v26 = (_WORD *)(a5 + 2LL * v25);
      v27 = 2LL * ((unsigned __int16)(1 << n0x10_1) - v25);
      if ( v27 )
      {
        if ( !v26 )
          Assert_7(
            (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
            58,
            (__int64)"Buffer != ((void *) 0)",
            v5);
        if ( v27 - 1 > -1 - (__int64)v26 )
          Assert_7(
            (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
            59,
            (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer)",
            v5);
        if ( ((unsigned __int8)v26 & 1) != 0 )
          Assert_7(
            (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
            60,
            (__int64)"(((UINTN)Buffer) & (sizeof (Value) - 1)) == 0",
            v5);
        if ( (v27 & 1) != 0 )
          Assert_7(
            (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\SetMem16Wrapper.c",
            61,
            (__int64)"(Length & (sizeof (Value) - 1)) == 0",
            v5);
        sub_9E0(v26, v27 >> 1, 0);
        n0x3FB_1 = n0x3FB;
        v8 = a3;
      }
    }
  }
  n0x3FB_3 = n0x3FB_1;
  v29 = 1 << n0x10_1;
  v40 = 1 << n0x10_1;
  v30 = 0;
  if ( !n0x3FB_1 )
    return 0;
  v41 = 16 - n0x10_1;
  while ( 1 )
  {
    n0x10_6 = *(unsigned __int8 *)(v30 + v8);
    if ( (unsigned __int16)(*(unsigned __int8 *)(v30 + v8) - 1) <= 0xFu )
      break;
LABEL_48:
    if ( ++v30 >= n0x3FB_1 )
      return 0;
  }
  v32 = *((_WORD *)v43 + n0x10_6);
  v33 = *(unsigned __int8 *)(v30 + v8);
  v34 = v32 + v42[n0x10_6];
  if ( (unsigned __int16)n0x10_6 > n0x10_1 )
  {
    v36 = (unsigned __int16 *)(a5 + 2 * ((unsigned __int64)v32 >> v17));
    v37 = n0x10_6 - n0x10_1;
    if ( v37 )
    {
      do
      {
        if ( !*v36 && n0x3FB_3 < 0x3FBu )
        {
          *(_WORD *)(buf + 2LL * n0x3FB_3 + 50) = 0;
          *(_WORD *)(buf + 2LL * n0x3FB_3 + 2088) = 0;
          *v36 = n0x3FB_3++;
        }
        v38 = *v36;
        if ( *v36 < 0x3FBu )
        {
          v39 = buf + 2088;
          if ( ((unsigned __int16)(1 << (15 - n0x10_5)) & v32) == 0 )
            v39 = buf + 50;
          v36 = (unsigned __int16 *)(v39 + 2LL * v38);
        }
        v32 *= 2;
        --v37;
      }
      while ( v37 );
      n0x10_1 = n0x10;
      v29 = v40;
      v17 = v41;
    }
    *v36 = v30;
    goto LABEL_47;
  }
  if ( v32 >= v34 )
  {
LABEL_47:
    *((_WORD *)v43 + v33) = v34;
    n0x3FB_1 = n0x3FB;
    v8 = a3;
    goto LABEL_48;
  }
  while ( v32 < v29 )
  {
    v35 = v32++;
    *(_WORD *)(a5 + 2 * v35) = v30;
    if ( v32 >= v34 )
      goto LABEL_47;
  }
  return 0xFFFF;
}