Newer
Older
AMI-Aptio-BIOS-Reversed / LenovoServerPkg / SetupDefaults / SetupDefaultLoad / SetupDefaultLoadVmdNvme.c
@Ajax Dong Ajax Dong 2 days ago 19 KB Recovering names (cleanups)
char BuildNvmeSlotInfoEntry(char n7, char a2, char a3, char a4, char a5, char a6, char a7)
{
  char result; // al
  __int64 v9; // rdx

  result = 0; /*0x1919*/
  switch ( n7 ) /*0x1926*/
  {
    case 0: /*0x1926*/
      if ( !a4 ) /*0x19c6*/
        return result; /*0x19c6*/
      result = byte_7530; /*0x19c8*/
      goto LABEL_25; /*0x19c8*/
    case 1: /*0x1926*/
      if ( !a4 ) /*0x19b9*/
        return result; /*0x19b9*/
      result = byte_7535; /*0x19bb*/
      goto LABEL_25; /*0x19c1*/
    case 2: /*0x1926*/
      if ( !a5 ) /*0x19ac*/
        return result; /*0x19ac*/
      result = byte_753A; /*0x19ae*/
      goto LABEL_25; /*0x19b4*/
    case 3: /*0x1926*/
      if ( !a5 ) /*0x199e*/
        return result; /*0x199e*/
      result = byte_753F; /*0x19a0*/
      goto LABEL_25; /*0x19a6*/
    case 4: /*0x1926*/
      if ( !a6 ) /*0x1990*/
        return result; /*0x1990*/
      result = byte_7558; /*0x1992*/
      goto LABEL_25; /*0x1998*/
    case 5: /*0x1926*/
      if ( !a6 ) /*0x1982*/
        return result; /*0x1982*/
      result = byte_755D; /*0x1984*/
      goto LABEL_25; /*0x198a*/
    case 6: /*0x1926*/
      if ( !a7 ) /*0x1974*/
        return result; /*0x1974*/
      result = byte_7562; /*0x1976*/
      goto LABEL_25; /*0x197c*/
  }
  if ( n7 == 7 && a7 ) /*0x1962*/
  {
    result = byte_7567; /*0x1968*/
LABEL_25:
    v9 = (unsigned __int8)byte_7D91; /*0x19ce*/
    byte_7D60[2 * (unsigned __int8)byte_7D91 + 1] = a3 + n7 - a2; /*0x19e2*/
    byte_7D60[2 * v9 + 2] = result; /*0x19e7*/
    byte_7D91 = v9 + 1; /*0x19ee*/
  }
  return result; /*0x19f9*/
}

char __fastcall BuildNvmeSlotInfoEntry2(unsigned __int8 a1, char a2, char a3, __int64 a4, char a5, char a6, char a7)
{
  char result; // al
  int v10; // ecx
  int v11; // ecx
  __int64 v12; // rdx

  result = 0; /*0x1a00*/
  if ( a1 ) /*0x1a0b*/
  {
    v10 = a1 - 1; /*0x1a0d*/
    if ( v10 ) /*0x1a10*/
    {
      v11 = v10 - 1; /*0x1a12*/
      if ( v11 ) /*0x1a15*/
      {
        if ( v11 != 1 ) /*0x1a1a*/
          return result; /*0x1a1a*/
        if ( a7 == 1 ) /*0x1a24*/
        {
          if ( !a6 ) /*0x1a2a*/
            return result; /*0x1a2a*/
          result = byte_7521; /*0x1a2c*/
        }
        else
        {
          if ( !a6 ) /*0x1a38*/
            return result; /*0x1a38*/
          result = byte_7503; /*0x1a3a*/
        }
      }
      else if ( a7 == 1 ) /*0x1a47*/
      {
        if ( !a6 ) /*0x1a4d*/
          return result; /*0x1a4d*/
        result = byte_751C; /*0x1a4f*/
      }
      else
      {
        if ( !a6 ) /*0x1a5b*/
          return result; /*0x1a5b*/
        result = byte_74FE; /*0x1a5d*/
      }
    }
    else
    {
      if ( !a5 ) /*0x1a69*/
        return result; /*0x1a69*/
      result = byte_74F9; /*0x1a6b*/
    }
  }
  else
  {
    if ( !a5 ) /*0x1a77*/
      return result; /*0x1a77*/
    result = byte_74F4; /*0x1a79*/
  }
  v12 = (unsigned __int8)byte_7D91; /*0x1a7f*/
  byte_7D60[2 * (unsigned __int8)byte_7D91 + 1] = a3 + a1 - a2; /*0x1a93*/
  byte_7D60[2 * v12 + 2] = result; /*0x1a98*/
  byte_7D91 = v12 + 1; /*0x1a9f*/
  return result; /*0x1aa5*/
}

__int64 __fastcall OemCollectNvmeVmdSlotInfo(int a1)
{
  unsigned __int8 v1; // si
  __int64 v2; // rdx
  __int64 v3; // rcx
  __int64 v4; // r8
  __int64 v5; // r9
  unsigned __int8 v6; // r12
  unsigned __int8 v7; // r15
  bool v8; // zf
  unsigned __int8 v9; // r13
  char n8; // di
  char n4; // bl
  __int64 v12; // r9
  char n7; // cl
  char v14; // cl
  unsigned __int8 n4_1; // r11
  char v16; // r14
  char v17; // si
  char v18; // r11
  unsigned __int8 n4_2; // r11
  char v20; // r12
  char v21; // di
  char v22; // r11
  char n8_2; // cl
  char v24; // cl
  char v25; // r14
  char v26; // si
  char v27; // r11
  __int64 result; // rax
  unsigned __int8 v29; // [rsp+40h] [rbp-18h]
  unsigned __int8 v30; // [rsp+41h] [rbp-17h]
  unsigned __int8 v31; // [rsp+42h] [rbp-16h]
  unsigned __int8 n4_3; // [rsp+43h] [rbp-15h] BYREF
  _DWORD v33[5]; // [rsp+44h] [rbp-14h] BYREF
  int v34; // [rsp+A0h] [rbp+48h] BYREF
  unsigned __int8 v35; // [rsp+A8h] [rbp+50h] BYREF
  unsigned __int8 n8_1; // [rsp+B0h] [rbp+58h] BYREF
  char v37; // [rsp+B8h] [rbp+60h] BYREF

  v1 = 0; /*0x1abc*/
  v37 = -1; /*0x1abe*/
  n8_1 = 0; /*0x1ac6*/
  n4_3 = 0; /*0x1ace*/
  LOBYTE(v34) = -1; /*0x1adf*/
  if ( GetSocketConfig(a1, (unsigned int)&n8_1, (unsigned int)&v37, (unsigned int)&n4_3, (__int64)&v34) < 0 )
    return DebugPrint(
             0x80000000LL,
             "[OemCollectNvmeVmdSlotInfo]: Get BP type failed!! Skip update the NVME slot info in VMD menu! \n");
  v6 = v37; /*0x1af1*/
  v7 = v34; /*0x1af5*/
  if ( v37 == -1 && (_BYTE)v34 == 0xFF )
    return DebugPrint(
             0x80000000LL,
             "[OemCollectNvmeVmdSlotInfo]: Get BP type failed!! Skip update the NVME slot info in VMD menu! \n");
  SendBmcCommand(v3, v2, v4, v5); /*0x1b08*/
  v34 = 0; /*0x1b11*/
  GetGpioPadConfig(16973832, &v34); /*0x1b19*/
  v8 = v34 == 0; /*0x1b1e*/
  v34 = 0; /*0x1b2a*/
  v29 = v8; /*0x1b2d*/
  GetGpioPadConfig(16973833, &v34); /*0x1b31*/
  v8 = v34 == 0; /*0x1b36*/
  v34 = 0; /*0x1b42*/
  v30 = v8; /*0x1b45*/
  GetGpioPadConfig(16973834, &v34); /*0x1b49*/
  v8 = v34 == 0; /*0x1b4e*/
  v34 = 0; /*0x1b5a*/
  v31 = v8; /*0x1b5d*/
  GetGpioPadConfig(16973835, &v34); /*0x1b61*/
  v9 = v34 == 0; /*0x1b71*/
  DetectInterposerCardInstall(&v34, &v35); /*0x1b75*/
  n8 = n8_1; /*0x1b7a*/
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: OnBoardNvmeBaseIndexNumber = %x\n", n8_1);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: OnBoardNvmeBaseSlotNumber = %x\n", v6);
  n4 = n4_3; /*0x1ba9*/
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: RiserNvmeBaseIndexNumber = %x\n", n4_3);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: RiserNvmeBaseSlotNumber = %x\n", v7);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: IsOnBoardNVME67Present = %x\n", v9);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: IsOnBoardNVME45Present = %x\n", v31);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: IsOnBoardNVME23Present = %x\n", v30);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: IsOnBoardNVME01Present = %x\n", v29);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: FirstInterPoserCardInstall = %x\n", (unsigned __int8)v34);
  DebugPrint(0x80000000LL, "[OemCollectNvmeVmdSlotInfo]: SecondInterPoserCardInstallx = %x\n", v35);
  byte_7D91 = 0; /*0x1c4d*/
  GetGpioPadConfig(17170432, v33); /*0x1c59*/
  if ( v33[0] == 1 ) /*0x1c62*/
  {
    if ( v9 ) /*0x1c6b*/
    {
      n7 = n8; /*0x1c6d*/
      if ( (unsigned __int8)n8 >= 8u ) /*0x1c74*/
        goto LABEL_25; /*0x1c74*/
      do /*0x1ca6*/
      {
        BuildNvmeSlotInfoEntry(n7, n8, v6, v29, v30, v31, v9); /*0x1c9c*/
        n7 = v14 + 1; /*0x1ca1*/
      }
      while ( (unsigned __int8)n7 < 8u ); /*0x1ca6*/
    }
    else
    {
      n4_1 = n4; /*0x1cad*/
      if ( (unsigned __int8)n4 >= 4u ) /*0x1cb3*/
        goto LABEL_25; /*0x1cb3*/
      v16 = v34; /*0x1cb9*/
      v17 = v35; /*0x1cbd*/
      do /*0x1ce4*/
      {
        BuildNvmeSlotInfoEntry2(n4_1, n4, v7, v12, v16, v17, 1); /*0x1cd8*/
        n4_1 = v18 + 1; /*0x1cdd*/
      }
      while ( n4_1 < 4u ); /*0x1ce4*/
    }
  }
  return 0;
}



char SendVmdCommandToBmc()
{
  __int64 v0; // rax
  __int64 v1; // r8
  _BYTE *v2; // rdx
  unsigned __int16 v3; // ax
  __int64 v4; // rdx
  __int64 v5; // r9
  unsigned __int8 i; // bl
  __int64 v7; // r9
  __int64 v8; // rdx
  int v10; // [rsp+28h] [rbp-D8h]
  _BYTE v11[6688]; // [rsp+40h] [rbp-C0h] BYREF
  char n2; // [rsp+1A70h] [rbp+1970h] BYREF
  unsigned __int16 v13; // [rsp+1A78h] [rbp+1978h] BYREF
  __int16 v14; // [rsp+1A80h] [rbp+1980h] BYREF
  __int64 n6668; // [rsp+1A88h] [rbp+1988h] BYREF

  if ( qword_7920 /*0x1058*/
    || (v0 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(qword_79B8 + 320))(&unk_7450, 0, &qword_7920),
        v0 >= 0) )
  {
    n6668 = 6668; /*0x106c*/
    v0 = (*(__int64 (__fastcall **)(const __int16 *, void *, _QWORD, __int64 *, _BYTE *))(qword_79C0 + 72))( /*0x109b*/
           L"SocketIioConfig",
           &unk_7470,
           0,
           &n6668,
           v11);
    if ( v0 >= 0 ) /*0x10a1*/
    {
      OemCollectNvmeVmdSlotInfo(); /*0x10a7*/
      v13 = 0; /*0x10ac*/
      n6668 = 49; /*0x10bb*/
      if ( byte_7D91 && byte_7D60 ) /*0x10d0*/
      {
        v1 = (unsigned __int8)byte_7D60; /*0x10d2*/
        v2 = &unk_7D61; /*0x10d6*/
        v3 = v13; /*0x10dd*/
        do /*0x1126*/
        {
          if ( v2[1] <= 0x17u /*0x110e*/
            && *v2 <= 0xBu
            && v11[((unsigned __int64)(unsigned __int8)v2[1] >> 2) + 4266] == 1
            && v11[(unsigned __int8)v2[1] + 4278] == 1 )
          {
            v3 |= 1 << (*v2 & 0xF); /*0x1113*/
            v13 = v3; /*0x1117*/
          }
          v2 += 2; /*0x111e*/
          --v1; /*0x1122*/
        }
        while ( v1 ); /*0x1126*/
      }
      else
      {
        v3 = v13; /*0x112a*/
      }
      DebugPrint(64, "SendVmdCommandToBp %x to BMC\
", v3); /*0x1141*/
      for ( i = 0; i < 0xAu; ++i ) /*0x1146*/
      {
        n2 = 0; /*0x114f*/
        LOBYTE(v5) = 96; /*0x115b*/
        LOBYTE(v10) = 2; /*0x116b*/
        LOBYTE(v4) = 46; /*0x1178*/
        v0 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64, unsigned __int16 *, int, _QWORD, char *))(qword_7920 + 16))( /*0x1184*/
               qword_7920,
               v4,
               0,
               v5,
               &v13,
               v10,
               0,
               &n2);
        if ( v0 >= 0 ) /*0x118a*/
        {
          (*(void (__fastcall **)(__int64))(qword_79B8 + 248))(5000); /*0x1198*/
          v14 = 0; /*0x119e*/
          LOBYTE(v7) = 97; /*0x11b2*/
          n2 = 2; /*0x11bc*/
          LOBYTE(v8) = 46; /*0x11d2*/
          LOBYTE(v10) = 0; /*0x11d4*/
          v0 = (*(__int64 (__fastcall **)(__int64, __int64, _QWORD, __int64, _QWORD, int, __int16 *, char *))(qword_7920 + 16))( /*0x11e2*/
                 qword_7920,
                 v8,
                 0,
                 v7,
                 0,
                 v10,
                 &v14,
                 &n2);
          if ( v0 < 0 ) /*0x11e8*/
            break; /*0x11e8*/
          LOBYTE(v0) = v13; /*0x11ea*/
          if ( (_BYTE)v14 == (_BYTE)v13 ) /*0x11f6*/
          {
            LOBYTE(v0) = HIBYTE(v13); /*0x11f8*/
            if ( HIBYTE(v14) == HIBYTE(v13) ) /*0x1204*/
              break; /*0x1204*/
          }
        }
      }
    }
  }
  else
  {
    qword_7920 = 0; /*0x105a*/
  }
  return v0; /*0x1211*/
}


__int64 __fastcall UpdateVmdNvmeConfig(unsigned __int8 a1)
{
  int v1; // ebx
  __int64 v2; // rdx
  __int64 n4; // r8
  __int64 v4; // r9
  __int64 v5; // rdi
  __int64 v6; // rsi
  __int64 v7; // rbx
  char n2_4; // al
  __int64 v9; // rax
  char n2_2; // cl
  char n2_1; // al
  __int64 v12; // rax
  char v13; // cl
  __int64 v14; // rax
  char v15; // dl
  unsigned __int8 v17; // [rsp+30h] [rbp-D0h] BYREF
  char n8; // [rsp+31h] [rbp-CFh]
  char n2; // [rsp+32h] [rbp-CEh] BYREF
  char v20; // [rsp+33h] [rbp-CDh]
  char v21; // [rsp+34h] [rbp-CCh]
  char n2_3; // [rsp+35h] [rbp-CBh]
  char v23; // [rsp+36h] [rbp-CAh]
  char v24; // [rsp+37h] [rbp-C9h]
  char v25; // [rsp+38h] [rbp-C8h]
  char v26; // [rsp+39h] [rbp-C7h]
  _BYTE v27[72]; // [rsp+140h] [rbp+40h] BYREF
  char n15; // [rsp+188h] [rbp+88h]
  _BYTE v29[11]; // [rsp+310h] [rbp+210h] BYREF
  char n3; // [rsp+31Bh] [rbp+21Bh]
  _BYTE v31[52]; // [rsp+3F0h] [rbp+2F0h] BYREF
  char n7; // [rsp+424h] [rbp+324h]
  char v33; // [rsp+426h] [rbp+326h]
  char v34; // [rsp+428h] [rbp+328h]
  char v35; // [rsp+42Ah] [rbp+32Ah]
  char v36; // [rsp+42Ch] [rbp+32Ch]
  char v37; // [rsp+42Eh] [rbp+32Eh]
  char v38; // [rsp+430h] [rbp+330h]
  char n2_5; // [rsp+477h] [rbp+377h]
  char v40; // [rsp+50Ah] [rbp+40Ah]
  _BYTE v41[304]; // [rsp+720h] [rbp+620h] BYREF
  _BYTE v42[352]; // [rsp+850h] [rbp+750h] BYREF
  _BYTE v43[528]; // [rsp+9B0h] [rbp+8B0h] BYREF
  _BYTE v44[1504]; // [rsp+BC0h] [rbp+AC0h] BYREF
  char v45[6688]; // [rsp+11A0h] [rbp+10A0h] BYREF
  char v46; // [rsp+2BD0h] [rbp+2AD0h] BYREF
  __int64 n301; // [rsp+2BD8h] [rbp+2AD8h] BYREF

  n301 = 0; /*0xa83*/
  v1 = a1; /*0xa90*/
  v17 = a1; /*0xa98*/
  n8 = 0; /*0xa9c*/
  SetMemZero(&n2, 256); /*0xaa1*/
  v5 = 0; /*0xaa6*/
  v6 = 0; /*0xaa8*/
  if ( !(_BYTE)v1 ) /*0xaae*/
  {
    n8 = 8; /*0xf22*/
    n301 = 301; /*0xf48*/
    v7 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xf5d*/
           L"SocketProcessorCoreConfig",
           &unk_7410,
           &v46,
           &n301,
           v41);
    if ( v7 >= 0 ) /*0xf63*/
    {
      n2 = v41[5] == 0; /*0xf72*/
      v20 = v41[7]; /*0xf77*/
    }
    n301 = 462; /*0xf7f*/
    v6 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xfb5*/
           L"SocketPowerManagementConfig",
           &unk_7430,
           &v46,
           &n301,
           v27);
    if ( v6 >= 0 ) /*0xfbb*/
    {
      v21 = v27[4]; /*0xfc0*/
      n2_3 = v27[24]; /*0xfc7*/
      v23 = v27[46]; /*0xfce*/
      v24 = v27[49]; /*0xfd5*/
      v25 = v27[48]; /*0xfdc*/
      v26 = v27[63]; /*0xfe3*/
    }
    goto LABEL_53; /*0xfe3*/
  }
  switch ( v1 )
  {
    case 1:
      n8 = 5; /*0xde5*/
      n301 = 341; /*0xe0b*/
      v12 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xe1d*/
              L"SocketMpLinkConfig",
              &unk_74A0,
              &v46,
              &n301,
              v42);
      v13 = v20; /*0xe20*/
      v7 = v12; /*0xe2c*/
      n301 = 514; /*0xe2f*/
      if ( v12 >= 0 ) /*0xe52*/
        v13 = v42[21]; /*0xe52*/
      v20 = v13; /*0xe68*/
      v14 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xe73*/
              L"SocketMemoryConfig",
              &unk_73E0,
              &v46,
              &n301,
              v43);
      v15 = v23; /*0xe76*/
      v6 = v14; /*0xe9a*/
      n301 = 224; /*0xe9d*/
      if ( v14 >= 0 ) /*0xea8*/
        v15 = v43[168]; /*0xea8*/
      v23 = v15; /*0xeb2*/
      v5 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xecd*/
             L"SocketCommonRcConfig",
             &unk_74B0,
             &v46,
             &n301,
             v29);
      if ( v5 >= 0 )
      {
        n2 = v29[9]; /*0xee4*/
        if ( n3 == 3 )
          v21 = 1; /*0xef2*/
        else
          v21 = n3 != 0 ? v21 : 0;
        n2_3 = v29[10]; /*0xf07*/
        n301 = 224; /*0xf0b*/
      }
      goto LABEL_53; /*0xf16*/
    case 2:
      n8 = 2; /*0xd06*/
      n301 = 462; /*0xd2c*/
      v5 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xd41*/
             L"SocketPowerManagementConfig",
             &unk_7430,
             &v46,
             &n301,
             v27);
      if ( v5 >= 0 ) /*0xd47*/
      {
        if ( n15 ) /*0xd51*/
        {
          if ( n15 == 7 ) /*0xd5d*/
          {
            n2 = 1; /*0xd5f*/
          }
          else if ( n15 == 8 ) /*0xd69*/
          {
            n2 = 2; /*0xd6b*/
          }
          else
          {
            n2_1 = n2; /*0xd72*/
            if ( n15 == 15 ) /*0xd7f*/
              n2_1 = 3; /*0xd7f*/
            n2 = n2_1; /*0xd82*/
          }
        }
        else
        {
          n2 = 0; /*0xd53*/
        }
      }
      n301 = 814; /*0xd8d*/
      v7 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xdc3*/
             L"Setup",
             &unk_7568,
             &v46,
             &n301,
             v31);
      if ( v7 < 0 ) /*0xdc9*/
        return v5; /*0xdc9*/
      v20 = v40; /*0xdd5*/
      goto LABEL_53; /*0xdd9*/
    case 3:
      n8 = 5; /*0xc38*/
      n301 = 6668; /*0xc5e*/
      v9 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, char *))(qword_7940 + 72))( /*0xc70*/
             L"SocketIioConfig",
             &unk_7470,
             &v46,
             &n301,
             v45);
      n2_2 = n2; /*0xc73*/
      v5 = v9; /*0xc7f*/
      n301 = 1495; /*0xc82*/
      if ( v9 >= 0 ) /*0xca5*/
        n2_2 = v45[0]; /*0xca5*/
      n2 = n2_2; /*0xcbb*/
      v7 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xcc9*/
             L"PchRcConfiguration",
             &unk_73B0,
             &v46,
             &n301,
             v44);
      if ( v7 < 0 ) /*0xccf*/
        return v5; /*0xccf*/
      v20 = v44[196]; /*0xcdb*/
      v21 = v44[197]; /*0xce5*/
      n2_3 = v44[82]; /*0xcef*/
      v23 = v44[83]; /*0xcf9*/
      goto LABEL_53; /*0xcfd*/
    case 4:
      n8 = 0; /*0xc27*/
      return SendBmcMultiByteCommand((char *)&v17, v2, n4, v4); /*0x1000*/
    case 5:
      n8 = 8; /*0xb49*/
      n301 = 814; /*0xb6f*/
      v5 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xb84*/
             L"Setup",
             &unk_7568,
             &v46,
             &n301,
             v31);
      if ( v5 < 0 ) /*0xb8a*/
        return v5; /*0xb8a*/
      LOBYTE(v2) = n7; /*0xb96*/
      v20 = v37; /*0xb9c*/
      v21 = v38; /*0xba6*/
      v23 = v36; /*0xbb0*/
      v24 = v33 - 7; /*0xbbd*/
      v25 = v34 - 1; /*0xbc9*/
      if ( n7 == 3 ) /*0xbd4*/
      {
        n2_3 = 0; /*0xbd6*/
      }
      else
      {
        n4 = 4; /*0xbdd*/
        switch ( n7 ) /*0xbe6*/
        {
          case 4: /*0xbe6*/
            n2_3 = 1; /*0xbe8*/
            break;
          case 5: /*0xbe6*/
            n2_3 = 2; /*0xbf4*/
            break;
          case 6: /*0xbe6*/
            n2_3 = 3; /*0xc00*/
            break;
          default:
            n2_4 = n2_3; /*0xc06*/
            if ( n7 == 7 ) /*0xc0e*/
              n2_4 = 4; /*0xc0e*/
            n2_3 = n2_4; /*0xc12*/
            break;
        }
      }
      v26 = v35 != 1; /*0xc1d*/
      break;
    case 6:
      n8 = 1; /*0xaed*/
      n301 = 814; /*0xb12*/
      v7 = (*(__int64 (__fastcall **)(const __int16 *, void *, char *, __int64 *, _BYTE *))(qword_7940 + 72))( /*0xb27*/
             L"Setup",
             &unk_7568,
             &v46,
             &n301,
             v31);
      if ( v7 < 0 ) /*0xb2d*/
        return v5; /*0xb2d*/
      n2 = n2_5; /*0xb39*/
LABEL_53:
      if ( v7 < 0 || v6 < 0 ) /*0xfef*/
        return v5; /*0xfef*/
      break;
  }
  if ( v5 >= 0 ) /*0xff4*/
    return SendBmcMultiByteCommand((char *)&v17, v2, n4, v4); /*0xff4*/
  return v5; /*0x100e*/
}


unsigned __int64 __fastcall ParseVmdNvmeConfig(unsigned __int8 *a1)
{
  __int64 v1; // rdx
  int v4; // ecx
  int v5; // ecx
  int v6; // ecx
  int v7; // ecx
  int v8; // ecx
  unsigned __int8 n2; // cl
  char n2_3; // al
  __int64 n301_1; // r9
  _BYTE *v12; // rax
  void *v13; // rdx
  const __int16 *SocketProcessorCoreConfig; // rcx
  unsigned __int8 n4_2; // cl
  char n4_1; // al
  unsigned __int8 v17; // al
  __int64 n301; // rdi
  unsigned __int8 n3_1; // cl
  char n7_1; // al
  unsigned __int8 v21; // al
  bool v22; // zf
  _BYTE v23[72]; // [rsp+30h] [rbp-D0h] BYREF
  char n7; // [rsp+78h] [rbp-88h]
  _BYTE v25[11]; // [rsp+200h] [rbp+100h] BYREF
  char n3; // [rsp+20Bh] [rbp+10Bh]
  _BYTE v27[52]; // [rsp+2E0h] [rbp+1E0h] BYREF
  char n4; // [rsp+314h] [rbp+214h]
  char v29; // [rsp+316h] [rbp+216h]
  char v30; // [rsp+318h] [rbp+218h]
  char v31; // [rsp+31Ah] [rbp+21Ah]
  unsigned __int8 v32; // [rsp+31Ch] [rbp+21Ch]
  unsigned __int8 v33; // [rsp+31Eh] [rbp+21Eh]
  unsigned __int8 v... [10043 chars total]