Newer
Older
AMI-Aptio-BIOS-Reversed / SystemInventory / SystemInventory_sub_3488.c
@Ajax Dong Ajax Dong 2 days ago 14 KB Init
__int64 __fastcall sub_3488(__int64 a1, __int64 a2, __int64 a3, char a4)
{
  double v4; // xmm3_8
  __int64 v5; // rdi
  __int64 v6; // r14
  __int64 v7; // r15
  char v8; // r12
  unsigned __int64 v9; // r13
  __int64 v10; // rbx
  __int64 i_1; // rax
  __int64 i_4; // rbx
  __int64 v13; // rbx
  __int64 v14; // rbx
  __int64 i_5; // rbx
  __int64 v16; // rdx
  unsigned __int16 n0xFF_1; // bx
  char v18; // al
  unsigned __int16 n0xFF; // r14
  _BYTE *v20; // rdi
  char n0xFF_2; // cl
  __int64 v22; // r9
  __int64 v23; // rdx
  __int64 v24; // rdx
  char v25; // al
  unsigned __int16 n0xFF_3; // di
  unsigned __int16 i_7; // cx
  int i_2; // r15d
  int i_8; // edi
  unsigned __int8 v30; // r12
  __int64 v31; // rbx
  __int64 v32; // r14
  unsigned __int16 v33; // bx
  __int64 v34; // rdx
  __int64 v35; // r9
  unsigned __int16 i; // cx
  int i_3; // r14d
  unsigned __int8 v38; // r15
  __int64 v39; // rbx
  __int64 v40; // rdi
  unsigned __int16 v41; // bx
  __int64 v42; // rdx
  __int64 v43; // r9
  int v44; // [rsp+28h] [rbp-D8h]
  _WORD v45[2]; // [rsp+44h] [rbp-BCh] BYREF
  int i_6; // [rsp+48h] [rbp-B8h]
  __int64 v47; // [rsp+50h] [rbp-B0h] BYREF
  __int64 v48; // [rsp+58h] [rbp-A8h] BYREF
  unsigned __int64 v49; // [rsp+60h] [rbp-A0h] BYREF
  _BYTE v50[16]; // [rsp+70h] [rbp-90h] BYREF
  __int64 v51; // [rsp+80h] [rbp-80h]
  _BYTE v52[64]; // [rsp+88h] [rbp-78h] BYREF
  _BYTE v53[8]; // [rsp+C8h] [rbp-38h] BYREF
  __int64 v54; // [rsp+D0h] [rbp-30h] BYREF
  __int64 v55; // [rsp+D8h] [rbp-28h] BYREF
  _QWORD v56[3]; // [rsp+E0h] [rbp-20h] BYREF
  char v57; // [rsp+FBh] [rbp-5h]
  _BYTE v58[65600]; // [rsp+100h] [rbp+0h] BYREF

  v5 = a3; /*0x34b5*/
  v6 = a2; /*0x34b8*/
  v7 = a1; /*0x34bb*/
  v8 = a4; /*0x34ca*/
  sub_65B0(v58, 0, 0x10000); /*0x34cd*/
  v9 = 0; /*0x34ef*/
  v10 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(qword_96A8 + 320))(&unk_9460, 0, &qword_9690); /*0x34f2*/
  if ( v10 >= 0 )
  {
    i_1 = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(qword_96A8 + 312))( /*0x3554*/
            2,
            &unk_9400,
            0,
            &v49,
            &v47);
    i_4 = i_1; /*0x355a*/
    if ( i_1 >= 0 )
    {
      if ( v49 )
      {
        do
        {
          sub_63C(v50, 140); /*0x35aa*/
          v57 = 1; /*0x35c7*/
          v13 = (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *, _QWORD, _QWORD, int))(qword_96A8 + 280))( /*0x35e5*/
                  *(_QWORD *)(v47 + 8 * v9),
                  &unk_9400,
                  &v48,
                  0,
                  0,
                  2);
          if ( v13 >= 0 )
          {
            v14 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD, __int64, _BYTE *))(v48 + 48))(v48, 0, 0, 64, v52); /*0x3668*/
            if ( v14 >= 0 )
            {
              v51 = *(_QWORD *)(v47 + 8 * v9); /*0x36bf*/
              i_1 = (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64 *, __int64 *, _QWORD *))(v48 + 112))( /*0x36c6*/
                      v48,
                      v53,
                      &v54,
                      &v55,
                      v56);
              i_5 = i_1; /*0x36c9*/
              if ( i_1 >= 0 )
              {
                if ( v54 == v7 && v55 == v6 && v56[0] == v5 )
                {
                  (*(void (__fastcall **)(_BYTE *, __int64, _QWORD))(qword_96D8 + 360))(v58, 0x10000, 0); /*0x3728*/
                  LOBYTE(v16) = -126; /*0x3733*/
                  n0xFF_1 = 0; /*0x3743*/
                  if ( sub_2EA4(v50, v16, v58, v45) >= 0 )
                  {
                    v18 = sub_7F8(); /*0x374e*/
                    n0xFF = v45[0]; /*0x3753*/
                    if ( v18 && (unsigned __int8)sub_804(2) )
                      sub_740(2, "CheckVpdAndUpdateToBmc: RDBG VPD type 0x82 , Data Length = %x\n", n0xFF);
                    if ( n0xFF ) /*0x3783*/
                    {
                      do /*0x37be*/
                      {
                        if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x3795*/
                          sub_740(0x80000000LL, "%x ", (unsigned __int8)v58[n0xFF_1]); /*0x37b1*/
                        ++n0xFF_1; /*0x37b6*/
                      }
                      while ( n0xFF_1 < n0xFF ); /*0x37be*/
                      v8 = a4; /*0x37c0*/
                    }
                    if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x37d3*/
                      sub_740(0x80000000LL, "\n"); /*0x37e6*/
                    v20 = (_BYTE *)sub_1D2C((unsigned __int8)(n0xFF + 5)); /*0x37f7*/
                    n0xFF_2 = n0xFF; /*0x37fa*/
                    *v20 = 11; /*0x3806*/
                    v20[1] = v8; /*0x3809*/
                    v20[3] = -126; /*0x380d*/
                    if ( n0xFF > 0xFFu ) /*0x381a*/
                      n0xFF_2 = -1; /*0x381a*/
                    v20[4] = n0xFF_2; /*0x381d*/
                    (*(void (__fastcall **)(_BYTE *, _BYTE *, _QWORD))(qword_96D8 + 352))(v20 + 5, v58, n0xFF); /*0x382b*/
                    LOBYTE(v22) = 87; /*0x3837*/
                    byte_9699 = 1; /*0x383a*/
                    LOBYTE(v23) = 46; /*0x384a*/
                    LOBYTE(v44) = n0xFF + 5; /*0x3864*/
                    (*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, _BYTE *, int, void *, char *))(qword_9690 + 16))( /*0x3870*/
                      qword_9690,
                      v23,
                      0,
                      v22,
                      v20,
                      v44,
                      &unk_9720,
                      &byte_9699);
                    (*(void (__fastcall **)(_BYTE *))(qword_96D8 + 72))(v20); /*0x387d*/
                    n0xFF_1 = 0; /*0x3880*/
                  }
                  (*(void (__fastcall **)(_BYTE *, __int64, _QWORD))(qword_96D8 + 360))(v58, 0x10000, 0); /*0x3895*/
                  LOBYTE(v24) = -112; /*0x38a0*/
                  i_1 = sub_2EA4(v50, v24, v58, v45); /*0x38ab*/
                  if ( i_1 >= 0 )
                  {
                    v25 = sub_7F8(); /*0x38b9*/
                    n0xFF_3 = v45[0]; /*0x38be*/
                    if ( v25 && (unsigned __int8)sub_804(2) )
                      sub_740(2, "CheckVpdAndUpdateToBmc: RDBG VPD type 0x90/0x91 , Data Length = %x\n", n0xFF_3);
                    if ( n0xFF_3 ) /*0x38f3*/
                    {
                      do /*0x392d*/
                      {
                        if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x3905*/
                          sub_740(0x80000000LL, "%x ", (unsigned __int8)v58[n0xFF_1]); /*0x3921*/
                        ++n0xFF_1; /*0x3926*/
                      }
                      while ( n0xFF_1 < n0xFF_3 ); /*0x392d*/
                      v8 = a4; /*0x392f*/
                    }
                    i_1 = sub_7F8(); /*0x3936*/
                    if ( (_BYTE)i_1 ) /*0x393f*/
                    {
                      i_1 = sub_804(0x80000000LL); /*0x3944*/
                      if ( (_BYTE)i_1 ) /*0x394b*/
                        i_1 = sub_740(0x80000000LL, "\n"); /*0x3957*/
                    }
                    i_7 = 0; /*0x3960*/
                    i_2 = n0xFF_3 - 1; /*0x3963*/
                    i_6 = i_2; /*0x396b*/
                    if ( i_2 > 0 )
                    {
                      while ( v58[i_7] != 80 || v58[i_7 + 1] != 78 ) /*0x3988*/
                      {
                        i_1 = ++i_7; /*0x398d*/
                        if ( i_7 >= i_2 ) /*0x3993*/
                          goto LABEL_74; /*0x3993*/
                      }
                      i_8 = i_7; /*0x399b*/
                      v30 = v58[i_7 + 2] + 5; /*0x39a6*/
                      v31 = (unsigned int)i_7 + 2; /*0x39aa*/
                      v32 = sub_1D2C(v30); /*0x39b5*/
                      *(_BYTE *)v32 = 11; /*0x39bb*/
                      *(_BYTE *)(v32 + 1) = a4; /*0x39c4*/
                      *(_WORD *)(v32 + 2) = 20048; /*0x39cc*/
                      *(_BYTE *)(v32 + 4) = v58[v31]; /*0x39da*/
                      (*(void (__fastcall **)(__int64, _BYTE *, _QWORD))(qword_96D8 + 352))( /*0x39ef*/
                        v32 + 5,
                        &v58[i_8 + 3],
                        (unsigned __int8)v58[v31]);
                      v33 = 0; /*0x39fb*/
                      if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(2) )
                        sub_740(2, "CheckVpdAndUpdateToBmc: RDBG VPD PN Size = %x, IpmiVpdData= %a , \n", v30, v4);
                      if ( v30 ) /*0x3a2d*/
                      {
                        do /*0x3a66*/
                        {
                          if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x3a3f*/
                            sub_740(0x80000000LL, "%x ", *(unsigned __int8 *)(v33 + v32)); /*0x3a5a*/
                          ++v33; /*0x3a5f*/
                        }
                        while ( v33 < v30 ); /*0x3a66*/
                        i_2 = i_6; /*0x3a68*/
                      }
                      if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x3a7b*/
                        sub_740(0x80000000LL, "\n"); /*0x3a8e*/
                      LOBYTE(v35) = 87; /*0x3a98*/
                      byte_9699 = 1; /*0x3a9b*/
                      LOBYTE(v34) = 46; /*0x3aab*/
                      LOBYTE(v44) = v30; /*0x3ac5*/
                      (*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, __int64, int, void *, char *))(qword_9690 + 16))( /*0x3ad2*/
                        qword_9690,
                        v34,
                        0,
                        v35,
                        v32,
                        v44,
                        &unk_9720,
                        &byte_9699);
                      i_1 = (*(__int64 (__fastcall **)(__int64))(qword_96D8 + 72))(v32); /*0x3adf*/
                      v8 = a4; /*0x3ae2*/
                    }
LABEL_74:
                    for ( i = 0; i < i_2; i_1 = ++i ) /*0x3af4*/
                    {
                      i_1 = i; /*0x3af6*/
                      if ( v58[i] == 83 && v58[i + 1] == 78 ) /*0x3b05*/
                        break; /*0x3b05*/
                    }
                    i_3 = i; /*0x3b12*/
                    if ( i != i_2 )
                    {
                      v38 = v58[i + 2] + 5; /*0x3b28*/
                      v39 = (unsigned int)i + 2; /*0x3b2c*/
                      v40 = sub_1D2C(v38); /*0x3b3c*/
                      *(_BYTE *)v40 = 11; /*0x3b43*/
                      *(_BYTE *)(v40 + 1) = v8; /*0x3b46*/
                      *(_WORD *)(v40 + 2) = 20051; /*0x3b4a*/
                      *(_BYTE *)(v40 + 4) = v58[v39]; /*0x3b54*/
                      (*(void (__fastcall **)(__int64, _BYTE *, _QWORD))(qword_96D8 + 352))( /*0x3b6f*/
                        v40 + 5,
                        &v58[i_3 + 3],
                        (unsigned __int8)v58[v39]);
                      v41 = 0; /*0x3b7b*/
                      if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(2) )
                        sub_740(2, "CheckVpdAndUpdateToBmc: RDBG VPD SN Size = %x, IpmiVpdData= %a , \n", v38, v4);
                      if ( v38 ) /*0x3bb1*/
                      {
                        do /*0x3bee*/
                        {
                          if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x3bc6*/
                            sub_740(0x80000000LL, "%x ", *(unsigned __int8 *)(v41 + v40)); /*0x3be1*/
                          ++v41; /*0x3be6*/
                        }
                        while ( v41 < v38 ); /*0x3bee*/
                        v8 = a4; /*0x3bf5*/
                      }
                      if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x3c0a*/
                        sub_740(0x80000000LL, "\n"); /*0x3c1d*/
                      LOBYTE(v43) = 87; /*0x3c27*/
                      byte_9699 = 1; /*0x3c2a*/
                      LOBYTE(v42) = 46; /*0x3c3a*/
                      LOBYTE(v44) = v38; /*0x3c54*/
                      (*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, __int64, int, void *, char *))(qword_9690 + 16))( /*0x3c61*/
                        qword_9690,
                        v42,
                        0,
                        v43,
                        v40,
                        v44,
                        &unk_9720,
                        &byte_9699);
                      i_1 = (*(__int64 (__fastcall **)(__int64))(qword_96D8 + 72))(v40); /*0x3c6e*/
                    }
                    v7 = a1; /*0x3c71*/
                  }
                }
              }
              else
              {
                i_1 = sub_7F8(); /*0x36d1*/
                if ( (_BYTE)i_1 )
                {
                  i_1 = sub_804(0x80000000LL); /*0x36e1*/
                  if ( (_BYTE)i_1 )
                    i_1 = sub_740(0x80000000LL, "CheckVpdAndUpdateToBmc: error reading Pci Locattion = %r\n", i_5);
                }
              }
            }
            else
            {
              i_1 = sub_7F8(); /*0x3670*/
              if ( (_BYTE)i_1 )
              {
                i_1 = sub_804(0x80000000LL); /*0x367c*/
                if ( (_BYTE)i_1 )
                  i_1 = sub_740(0x80000000LL, "CheckVpdAndUpdateToBmc: error reading Pci Config space. Code=%r\n", v14);
              }
            }
          }
          else
          {
            i_1 = sub_7F8(); /*0x35ed*/
            if ( (_BYTE)i_1 )
            {
              i_1 = sub_804(0x80000000LL); /*0x35f9*/
              if ( (_BYTE)i_1 )
                i_1 = sub_740(
                        0x80000000LL,
                        "CheckVpdAndUpdateToBmc: Error openning handle index %d. Code=%r\n",
                        v9,
                        v13);
            }
          }
          v5 = a3; /*0x3619*/
          ++v9; /*0x3620*/
          v6 = a2; /*0x3623*/
        }
        while ( v9 < v49 );
      }
    }
    else
    {
      i_1 = sub_7F8(); /*0x3562*/
      if ( (_BYTE)i_1 )
      {
        i_1 = sub_804(0x80000000LL); /*0x3576*/
        if ( (_BYTE)i_1 )
          return sub_740(0x80000000LL, "CheckVpdAndUpdateToBmc: unable to find any PCI devices. Code=%r\n", i_4);
      }
    }
  }
  else
  {
    i_1 = sub_7F8(); /*0x34fa*/
    if ( (_BYTE)i_1 ) /*0x3501*/
    {
      i_1 = sub_804(64); /*0x350d*/
      if ( (_BYTE)i_1 ) /*0x3514*/
        return sub_740(64, "CheckVpdAndUpdateToBmc Locating IPMI Dxe Protocol Status - %r\n", v10); /*0x3526*/
    }
  }
  return i_1; /*0x3635*/
}