Newer
Older
AMI-Aptio-BIOS-Reversed / SystemInventory / SystemInventory_sub_3FE4.c
@Ajax Dong Ajax Dong 2 days ago 11 KB Init
__int64 sub_3FE4()
{
  unsigned __int8 v0; // r13
  __int64 result; // rax
  unsigned __int64 i_1; // rsi
  __int64 v3; // rbx
  __int64 j_1; // rbx
  __int64 v5; // rdi
  __int64 v6; // rdi
  __int64 j; // rcx
  char n17; // al
  __int64 v9; // rbx
  _WORD *v10; // r15
  __int64 v11; // rbx
  unsigned __int8 v12; // cl
  __int64 v13; // rdx
  __int64 v14; // rbx
  int v15; // r12d
  int v16; // edi
  __int64 v17; // rsi
  unsigned __int16 *v18; // rdi
  __int64 n16; // rbx
  __int64 n3; // r14
  __int64 v21; // rax
  __int64 v22; // rax
  int v23; // eax
  __int64 v24; // rbx
  char v25; // cl
  unsigned __int64 n0x40; // rax
  _WORD *v27; // rdx
  __int64 v28; // rcx
  __int64 v29; // [rsp+30h] [rbp-59h] BYREF
  _BYTE v30[8]; // [rsp+38h] [rbp-51h] BYREF
  __int64 v31; // [rsp+40h] [rbp-49h] BYREF
  __int64 v32; // [rsp+48h] [rbp-41h] BYREF
  __int64 v33; // [rsp+50h] [rbp-39h] BYREF
  __int64 v34; // [rsp+58h] [rbp-31h] BYREF
  __int64 v35; // [rsp+60h] [rbp-29h] BYREF
  __int64 j_3; // [rsp+68h] [rbp-21h] BYREF
  __int64 j_2; // [rsp+70h] [rbp-19h]
  unsigned __int64 i; // [rsp+78h] [rbp-11h]
  unsigned __int64 i_2; // [rsp+80h] [rbp-9h] BYREF
  __int64 v40; // [rsp+88h] [rbp-1h] BYREF
  _BYTE v41[8]; // [rsp+90h] [rbp+7h] BYREF
  _BYTE v42[72]; // [rsp+98h] [rbp+Fh] BYREF
  unsigned __int16 v43; // [rsp+F0h] [rbp+67h] BYREF
  unsigned int v44; // [rsp+F8h] [rbp+6Fh]
  int v45; // [rsp+100h] [rbp+77h] BYREF
  int n512; // [rsp+108h] [rbp+7Fh] BYREF

  v44 = 0; /*0x401e*/
  v31 = 0; /*0x4026*/
  v0 = 0; /*0x402a*/
  v43 = 0; /*0x402d*/
  result = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(qword_96A8 + 312))( /*0x4032*/
             2,
             &unk_93E0,
             0,
             &i_2,
             &v35);
  if ( result >= 0 ) /*0x403b*/
  {
    result = (*(__int64 (__fastcall **)(void *, _QWORD, _BYTE *))(qword_96A8 + 320))(&unk_9410, 0, v41); /*0x4055*/
    if ( result >= 0 ) /*0x405e*/
    {
      i_1 = 0; /*0x4064*/
      for ( i = 0; i_1 < i_2; i = i_1 ) /*0x406f*/
      {
        v3 = (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(qword_96A8 + 152))( /*0x409f*/
               *(_QWORD *)(v35 + 8 * i_1),
               &unk_9470,
               &j_3);
        if ( (unsigned __int8)sub_7EC() && v3 < 0 ) /*0x40ae*/
        {
          if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x40bc*/
            sub_740(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", v3); /*0x40d2*/
          sub_788("e:\\hs\\LenovoServerPkg\\SystemInventory\\SystemInventory.c", 1393, "!EFI_ERROR (Status)"); /*0x40ea*/
        }
        j_1 = j_3; /*0x40fa*/
        if ( (*(__int64 (__fastcall **)(void *, __int64 *, __int64 *))(qword_96A8 + 184))(&unk_9400, &j_3, &v40) >= 0 ) /*0x4112*/
        {
          v5 = (*(__int64 (__fastcall **)(__int64, void *, __int64 *))(qword_96A8 + 152))(v40, &unk_9400, &v31); /*0x4134*/
          if ( (unsigned __int8)sub_7EC() && v5 < 0 ) /*0x4143*/
          {
            if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x4151*/
              sub_740(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", v5); /*0x4167*/
            sub_788("e:\\hs\\LenovoServerPkg\\SystemInventory\\SystemInventory.c", 1404, "!EFI_ERROR (Status)"); /*0x417f*/
          }
          v6 = (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64 *, __int64 *, __int64 *))(v31 + 112))( /*0x41a3*/
                 v31,
                 v42,
                 &v29,
                 &v34,
                 &v33);
          if ( (unsigned __int8)sub_7EC() && v6 < 0 ) /*0x41b2*/
          {
            if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x41c0*/
              sub_740(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", v6); /*0x41d6*/
            sub_788("e:\\hs\\LenovoServerPkg\\SystemInventory\\SystemInventory.c", 1407, "!EFI_ERROR (Status)"); /*0x41ee*/
          }
          if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x41ff*/
            sub_740(0x80000000LL, "Bus = %x, Dev = %x, Func = %x\n", v29, v34, v33); /*0x4223*/
          (*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, unsigned __int16 *))(v31 + 48))(v31, 1, 0, 1, &v43); /*0x4241*/
          if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x4250*/
            sub_740(0x80000000LL, "VendorID = %x\n", v43); /*0x4268*/
          for ( j = j_1; !(unsigned __int8)sub_1EF0(j); j = j_1 ) /*0x426d*/
          {
            if ( (unsigned __int8)sub_1DB8(j_1) == 1 && (unsigned __int8)sub_1DF0(j_1) == 1 ) /*0x4291*/
            {
              j_2 = j_1; /*0x42a3*/
              goto LABEL_36; /*0x42a7*/
            }
            j_1 = sub_1E6C(j_1); /*0x429b*/
          }
          j_1 = j_2; /*0x42a9*/
LABEL_36:
          if ( j_1 ) /*0x42b0*/
          {
            if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x42c2*/
              sub_740( /*0x42df*/
                0x80000000LL,
                "PciDevicePath->Device = %x, PciDevicePath->Function = %x.\n",
                *(unsigned __int8 *)(j_1 + 5),
                *(unsigned __int8 *)(j_1 + 4));
            if ( (n17 = *(_BYTE *)(j_1 + 5), n17 == 17) && *(_BYTE *)(j_1 + 4) == 5 || n17 == 23 && !*(_BYTE *)(j_1 + 4) ) /*0x42f9*/
            {
              v9 = (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(qword_96D8 + 152))( /*0x4323*/
                     *(_QWORD *)(v35 + 8 * i_1),
                     &unk_93E0,
                     &v32);
              if ( (unsigned __int8)sub_7EC() && v9 < 0 ) /*0x4332*/
              {
                if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x4340*/
                  sub_740(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", v9); /*0x4356*/
                sub_788("e:\\hs\\LenovoServerPkg\\SystemInventory\\SystemInventory.c", 1437, "!EFI_ERROR (Status)"); /*0x436e*/
              }
              if ( (*(__int64 (__fastcall **)(__int64, int *, _BYTE *))(v32 + 40))(v32, &v45, v30) >= 0 ) /*0x4388*/
              {
                n512 = 512; /*0x4395*/
                v10 = (_WORD *)sub_1D2C(512); /*0x43ab*/
                v11 = (*(__int64 (__fastcall **)(__int64, _WORD *, int *))(v32 + 24))(v32, v10, &n512); /*0x43b2*/
                if ( (unsigned __int8)sub_7EC() && v11 < 0 ) /*0x43c1*/
                {
                  if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x43cf*/
                    sub_740(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", v11); /*0x43e5*/
                  sub_788("e:\\hs\\LenovoServerPkg\\SystemInventory\\SystemInventory.c", 1456, "!EFI_ERROR (Status)"); /*0x43fd*/
                }
                (*(void (__fastcall **)(__int64, int *, _BYTE *))(v32 + 40))(v32, &v45, v30); /*0x4411*/
                v12 = 0; /*0x4423*/
                while ( 1 ) /*0x4429*/
                {
                  v13 = 3LL * v12; /*0x4429*/
                  if ( v29 == byte_94C0[6 * v12] /*0x4453*/
                    && v34 == byte_94C0[6 * v12 + 1]
                    && v33 == byte_94C0[6 * v12 + 2]
                    && v45 == byte_94C0[6 * v12 + 3] )
                  {
                    break; /*0x4453*/
                  }
                  if ( ++v12 >= 0xEu ) /*0x445a*/
                    goto LABEL_65; /*0x445a*/
                }
                v44 = byte_94C0[6 * v12 + 4]; /*0x446a*/
LABEL_65:
                if ( (__int16)*v10 >= 0 ) /*0x4471*/
                {
                  v14 = (unsigned int)sub_2518(((v33 & 7 | (8 * (v34 & 0x1F | (32LL * (unsigned __int8)v29)))) << 12) | 0x24); /*0x44b2*/
                  if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x44c0*/
                    sub_740( /*0x44e8*/
                      0x80000000LL,
                      "RDBG Inventory Bus %x, Dev %x, Func %x , SidpbaorAhciBaseAddr = %x\n",
                      v29,
                      v34,
                      v33,
                      v14);
                  v15 = (*(_DWORD *)((unsigned int)((v45 + 2) << 7) + v14 + 40) >> 4) & 0xF; /*0x4504*/
                  if ( (v10[83] & 0x400) != 0 ) /*0x4510*/
                  {
                    v17 = (unsigned __int16)v10[100]; /*0x454d*/
                    v18 = v10 + 101; /*0x4555*/
                    n16 = 16; /*0x455c*/
                    n3 = 3; /*0x4561*/
                    do /*0x457f*/
                    {
                      v17 |= sub_BD4(*v18++, n16); /*0x4570*/
                      n16 += 16; /*0x4577*/
                      --n3; /*0x457b*/
                    }
                    while ( n3 ); /*0x457f*/
                    v21 = sub_C28(v17, 1000, 0); /*0x458e*/
                    v22 = sub_C20(v21, 512); /*0x459b*/
                    v23 = sub_C28(v22, 1000, 0); /*0x45a8*/
                    i_1 = i; /*0x45ad*/
                    v16 = v23; /*0x45b1*/
                  }
                  else
                  {
                    v16 = ((((unsigned __int16)v10[60] + ((unsigned __int16)v10[61] << 16)) / 1000) << 9) / 1000; /*0x4548*/
                  }
                  v24 = 75LL * v0; /*0x45bc*/
                  if ( v10[217] == 1 ) /*0x45cf*/
                  {
                    *(_BYTE *)(v24 + qword_9680 + 2421) = 1; /*0x45d1*/
                    if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(64) ) /*0x45e6*/
                      sub_740( /*0x45f6*/
                        64,
                        "[System Inventory] Hard Disk %d is found in slot %d is of type SSD\n",
                        (unsigned int)v0 + 1,
                        v44);
                  }
                  else
                  {
                    *(_BYTE *)(v24 + qword_9680 + 2421) = 0; /*0x45f8*/
                    if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(64) ) /*0x460e*/
                      sub_740( /*0x462e*/
                        64,
                        "[System Inventory] Hard Disk %d is found in slot %d is of type HDD\n",
                        (unsigned int)v0 + 1,
                        v44);
                  }
                  v25 = v44; /*0x463a*/
                  *(_BYTE *)(v24 + qword_9680 + 2352) = v0; /*0x463d*/
                  *(_DWORD *)(v24 + qword_9680 + 2417) = v16; /*0x464c*/
                  *(_BYTE *)(v24 + qword_9680 + 2422) = 3; /*0x465e*/
                  *(_BYTE *)(v24 + qword_9680 + 2424) = v15; /*0x466d*/
                  *(_BYTE *)(v24 + qword_9680 + 2425) = v25; /*0x467c*/
                  n0x40 = sub_9F0(v10 + 27); /*0x4686*/
                  v27 = v10 + 27; /*0x4692*/
                  v28 = v24 + qword_9680 + 2353; /*0x469c*/
                  if ( n0x40 <= 0x40 ) /*0x46a3*/
                    sub_814(v28, v27); /*0x46b2*/
                  else
                    sub_8D8(v28, v27, 62); /*0x46ab*/
                  sub_2720(v24 + qword_9680 + 2353, 64); /*0x46cf*/
                  sub_275C(v24 + qword_9680 + 2353, 64); /*0x46e7*/
                  if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(64) ) /*0x46f7*/
                    sub_740(64, "[System Inventory] Drive Size = %d MB\n", *(_DWORD *)(v24 + qword_9680 + 2417)); /*0x4718*/
                  if ( (unsigned __int8)sub_7F8() && (unsigned __int8)sub_804(64) ) /*0x4729*/
                    sub_740(64, "[System Inventory] Link Speed = %d\n", *(unsigned __int8 *)(v24 + qword_9680 + 2424)); /*0x474c*/
                  (*(void (__fastcall **)(_WORD *))(qword_96A8 + 72))(v10); /*0x475b*/
                  ++v0; /*0x476a*/
                }
                else
                {
                  (*(void (__fastcall **)(_WORD *, __int64, __int64, __int64))(qword_96A8 + 72))(v10, v13, v33, v34); /*0x447d*/
                }
              }
            }
          }
        }
        ++i_1; /*0x476d*/
      }
      result = qword_9680; /*0x477e*/
      *(_BYTE *)(qword_9680 + 2351) = v0; /*0x4785*/
      if ( v35 ) /*0x4793*/
        return (*(__int64 (**)(void))(qword_96A8 + 72))(); /*0x479c*/
    }
  }
  return result; /*0x479f*/
}