Newer
Older
AMI-Aptio-BIOS-Reversed / SystemInventory / SystemInventory_sub_5110.c
@Ajax Dong Ajax Dong 2 days ago 11 KB Init
__int64 sub_5110()
{
  unsigned __int8 v0; // r13
  __int64 result; // rax
  unsigned __int64 i; // r15
  __int64 v3; // rdx
  __int64 v4; // rcx
  __int64 v5; // r8
  __int64 v6; // r9
  __int64 v7; // rdi
  unsigned __int8 v8; // r14
  __int64 v9; // rbx
  unsigned __int8 v10; // bl
  char v11; // r9
  __int64 v12; // rsi
  __int64 v13; // rdx
  __int64 v14; // rcx
  __int64 v15; // rdx
  __int64 v16; // rcx
  __int64 v17; // rdx
  __int64 v18; // rcx
  __int64 v19; // rcx
  __int64 v20; // rcx
  __int64 v21; // rbx
  unsigned __int16 v22; // ax
  const char *[System_Inventory]_Pci_Device_is_found_in_Pcie_Slot_is_of_Riser; // rdx
  __int64 v24; // [rsp+20h] [rbp-A9h]
  __int64 v25; // [rsp+28h] [rbp-A1h]
  _DWORD v26[2]; // [rsp+30h] [rbp-99h]
  char v27; // [rsp+38h] [rbp-91h]
  _DWORD v28[3]; // [rsp+40h] [rbp-89h]
  __int16 v29; // [rsp+4Ch] [rbp-7Dh]
  char v30; // [rsp+4Eh] [rbp-7Bh]
  _DWORD v31[6]; // [rsp+50h] [rbp-79h]
  __int16 v32; // [rsp+68h] [rbp-61h]
  char v33; // [rsp+6Ah] [rbp-5Fh]
  __int64 v34; // [rsp+70h] [rbp-59h] BYREF
  __int64 v35; // [rsp+78h] [rbp-51h] BYREF
  unsigned __int64 i_1; // [rsp+80h] [rbp-49h] BYREF
  __int64 v37; // [rsp+88h] [rbp-41h] BYREF
  _BYTE v38[144]; // [rsp+90h] [rbp-39h] BYREF
  unsigned __int8 v39; // [rsp+130h] [rbp+67h] BYREF
  __int128 v40; // [rsp+138h] [rbp+6Fh] BYREF
  __int64 v41; // [rsp+148h] [rbp+7Fh] BYREF

  v29 = -1; /*0x5129*/
  v32 = -1; /*0x5133*/
  v28[0] = 536937216; /*0x5156*/
  v0 = 0; /*0x515e*/
  v28[1] = 54526211; /*0x5161*/
  v28[2] = 16998401; /*0x516e*/
  v30 = -1; /*0x5179*/
  v31[0] = 65792; /*0x517d*/
  v31[1] = 20972033; /*0x5184*/
  v31[2] = 33636353; /*0x518b*/
  v31[3] = 1610809664; /*0x5192*/
  v31[4] = 23068929; /*0x5199*/
  v31[5] = 50421762; /*0x51a0*/
  v33 = -1; /*0x51a7*/
  v26[0] = 536936736; /*0x51ab*/
  v26[1] = -65023; /*0x51b3*/
  v27 = -1; /*0x51bb*/
  v37 = 0; /*0x51c0*/
  result = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(qword_96A8 + 312))( /*0x51c4*/
             2,
             &unk_9400,
             0,
             &i_1,
             &v35);
  if ( result >= 0 ) /*0x51cd*/
  {
    for ( i = 0; i < i_1; ++i ) /*0x51da*/
    {
      if ( (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(qword_96A8 + 152))( /*0x5203*/
             *(_QWORD *)(v35 + 8 * i),
             &unk_9400,
             &v34) >= 0 )
      {
        (*(void (__fastcall **)(__int64, __int64, _QWORD))(v34 + 48))(v34, 2, 0); /*0x5226*/
        if ( (v38[30] & 0x7F) == 1 ) /*0x5230*/
        {
          (*(void (__fastcall **)(__int64, _BYTE *, __int128 *, char *, __int64 *))(v34 + 112))( /*0x5252*/
            v34,
            v38,
            &v40,
            (char *)&v40 + 8,
            &v41);
          if ( (unsigned __int8)((__int64 (*)(void))sub_7F8)() && (unsigned __int8)sub_804(64) ) /*0x5261*/
            sub_740( /*0x5285*/
              64,
              "[System Inventory] Pci Device found in root bridge Bus = %x Dev = %x Fun  = %x\n",
              (_DWORD)v40,
              DWORD2(v40),
              v41);
          LOBYTE(v5) = v41; /*0x528a*/
          LOBYTE(v6) = 16; /*0x528e*/
          LOBYTE(v3) = BYTE8(v40); /*0x5291*/
          LOBYTE(v4) = v40; /*0x5294*/
          v7 = sub_28CC(v4, v3, v5, v6); /*0x529c*/
          if ( (unsigned __int8)((__int64 (*)(void))sub_7F8)() && (unsigned __int8)sub_804(64) ) /*0x52ab*/
            sub_740(64, "[System Inventory] PciExpReg %x\n", v7); /*0x52c1*/
          if ( (unsigned __int8)((__int64 (*)(void))sub_7F8)() && (unsigned __int8)sub_804(64) ) /*0x52d2*/
            sub_740(64, "PciExpReg->SlotStatus.Bits.PresenceDetect = %x\n", (*(unsigned __int16 *)(v7 + 26) >> 6) & 1); /*0x52f2*/
          if ( (unsigned __int8)((__int64 (*)(void))sub_7F8)() && (unsigned __int8)sub_804(64) ) /*0x5303*/
            sub_740(64, "PciExpReg->SlotCapability.Bits.PhysicalSlotNumber = %x\n", *(_DWORD *)(v7 + 20) >> 19); /*0x531e*/
          if ( (*(_BYTE *)(v7 + 26) & 0x40) != 0 ) /*0x5327*/
          {
            (*(void (__fastcall **)(__int64, _QWORD, __int64, __int64, unsigned __int8 *))(v34 + 48))( /*0x5347*/
              v34,
              0,
              26,
              1,
              &v39);
            v8 = v39; /*0x5360*/
            v9 = (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *))(qword_96A8 + 152))( /*0x536e*/
                   *(_QWORD *)(v35 + 8 * i),
                   &unk_9470,
                   &v37);
            if ( (unsigned __int8)((__int64 (*)(void))sub_7F8)() && (unsigned __int8)sub_804(64) ) /*0x537d*/
              sub_740(64, "Locate DevicePathProtocol Status - %r\n", v9); /*0x5393*/
            if ( (unsigned __int8)sub_7EC() && v9 < 0 ) /*0x53a4*/
            {
              if ( (unsigned __int8)((__int64 (*)(void))sub_7F8)() && (unsigned __int8)sub_804(0x80000000LL) ) /*0x53b4*/
                sub_740(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", v9); /*0x53cc*/
              sub_788("e:\\hs\\LenovoServerPkg\\SystemInventory\\SystemInventory.c", 1231, "!EFI_ERROR (Status)"); /*0x53e4*/
            }
            if ( (*(_DWORD *)(v7 + 20) & 0xFFF80000) != 0 ) /*0x53f0*/
            {
              v10 = 0; /*0x53f6*/
              while ( (unsigned __int16)sub_2500(((32LL * v8) | v10 & 0x1F) << 15) == 0xFFFF ) /*0x541e*/
              {
                if ( ++v10 > 0x1Fu ) /*0x5425*/
                  goto LABEL_48; /*0x5425*/
              }
              v11 = *(_DWORD *)(v7 + 20) >> 19; /*0x543e*/
              v12 = 19LL * v0; /*0x5441*/
              *(_BYTE *)(v12 + qword_9680 + 2275) = v11; /*0x544f*/
              sub_3488(v8, v10, 0, v11); /*0x545a*/
              v13 = 0; /*0x546a*/
              v14 = 0; /*0x5471*/
              do /*0x54a5*/
              {
                if ( __PAIR128__(*((unsigned __int8 *)v28 + v14 + 1), *((unsigned __int8 *)v28 + v14)) == v40 /*0x5493*/
                  && *((unsigned __int8 *)v28 + v14 + 2) == v41 )
                {
                  if ( (unsigned __int8)sub_7F8(v14, v13, v41, *((_QWORD *)&v40 + 1)) && (unsigned __int8)sub_804(64) ) /*0x56f0*/
                  {
                    [System_Inventory]_Pci_Device_is_found_in_Pcie_Slot_is_of_Riser = "[System Inventory] Pci Device is f" /*0x56f9*/
                                                                                      "ound in Pcie Slot is of Riser Type"
                                                                                      " - %d, Location Bus = %x Dev = %x Fun  = %x\n";
LABEL_53:
                    LODWORD(v25) = 0; /*0x5700*/
                    LODWORD(v24) = v10; /*0x5712*/
                    sub_740(64, [System_Inventory]_Pci_Device_is_found_in_Pcie_Slot_is_of_Riser, 0, v8, v24, v25); /*0x5716*/
                  }
                  goto LABEL_54; /*0x5716*/
                }
                ++v13; /*0x5499*/
                v14 = 3 * v13; /*0x549c*/
              }
              while ( *((_BYTE *)v28 + 3 * v13 + 2) != 0xFF ); /*0x54a5*/
              v15 = 0; /*0x54a7*/
              v16 = 0; /*0x54aa*/
              while ( __PAIR128__(*((unsigned __int8 *)v31 + v16 + 1), *((unsigned __int8 *)v31 + v16)) != v40 /*0x54c9*/
                   || *((unsigned __int8 *)v31 + v16 + 2) != v41 )
              {
                ++v15; /*0x54cf*/
                v16 = 3 * v15; /*0x54d2*/
                if ( *((_BYTE *)v31 + 3 * v15 + 2) == 0xFF ) /*0x54db*/
                {
                  v17 = 0; /*0x54dd*/
                  v18 = 0; /*0x54e0*/
                  while ( __PAIR128__(*((unsigned __int8 *)v26 + v18 + 1), *((unsigned __int8 *)v26 + v18)) != v40 /*0x54ff*/
                       || *((unsigned __int8 *)v26 + v18 + 2) != v41 )
                  {
                    ++v17; /*0x5505*/
                    v18 = 3 * v17; /*0x5508*/
                    if ( *((_BYTE *)v26 + 3 * v17 + 2) == 0xFF ) /*0x5511*/
                    {
                      if ( (unsigned __int8)sub_7F8(v18, v17, v41, *((_QWORD *)&v40 + 1)) ) /*0x5513*/
                      {
                        if ( (unsigned __int8)sub_804(64) ) /*0x5523*/
                          sub_740( /*0x5542*/
                            64,
                            "[System Inventory] Pci Device found is in Onboard Slot, Location Bus = %x Dev = %x Fun  = %x\n",
                            v8,
                            v10,
                            0);
                      }
                      goto LABEL_47; /*0x5542*/
                    }
                  }
                  if ( (unsigned __int8)sub_7F8(v18, v17, v41, *((_QWORD *)&v40 + 1)) && (unsigned __int8)sub_804(64) ) /*0x5761*/
                    sub_740( /*0x5780*/
                      64,
                      "[System Inventory] Pci Device found is a MEZZ card, Location Bus = %x Dev = %x Fun  = %x\n",
                      v8,
                      v10,
                      0);
                  *(_BYTE *)(v12 + qword_9680 + 2276) = 9; /*0x578c*/
                  goto LABEL_47; /*0x5794*/
                }
              }
              if ( (unsigned __int8)sub_7F8(v16, v15, v41, *((_QWORD *)&v40 + 1)) && (unsigned __int8)sub_804(64) ) /*0x573f*/
              {
                [System_Inventory]_Pci_Device_is_found_in_Pcie_Slot_is_of_Riser = "[System Inventory] Pci Device is found" /*0x5748*/
                                                                                  " in NVME Slot is of Riser Type - %d, L"
                                                                                  "ocation Bus = %x Dev = %x Fun  = %x\n";
                goto LABEL_53; /*0x574f*/
              }
LABEL_54:
              *(_BYTE *)(v12 + qword_9680 + 2276) = 0; /*0x571b*/
LABEL_47:
              *(_BYTE *)(v12 + qword_9680 + 2277) = v8; /*0x5547*/
              v19 = qword_9680; /*0x5558*/
              *(_BYTE *)(v12 + qword_9680 + 2278) &= 7u; /*0x5562*/
              *(_BYTE *)(v12 + v19 + 2278) |= 8 * v10; /*0x556a*/
              *(_BYTE *)(v12 + qword_9680 + 2278) &= 0xF8u; /*0x557e*/
              v20 = ((32 * v8) | v10 & 0x1Fu) << 15; /*0x558f*/
              v21 = (unsigned int)v20; /*0x5592*/
              *(_WORD *)(v12 + qword_9680 + 2279) = sub_2500(v20); /*0x55a0*/
              *(_WORD *)(v12 + qword_9680 + 2281) = sub_2500((unsigned int)v21 | 2LL); /*0x55ba*/
              *(_WORD *)(v12 + qword_9680 + 2283) = sub_2500((unsigned int)v21 | 0x2CLL); /*0x55d4*/
              *(_WORD *)(v12 + qword_9680 + 2285) = sub_2500((unsigned int)v21 | 0x2ELL); /*0x55ee*/
              *(_BYTE *)(v12 + qword_9680 + 2287) = sub_24F0((unsigned int)v21 | 9LL); /*0x560e*/
              *(_BYTE *)(v12 + qword_9680 + 2288) = sub_24F0((unsigned int)v21 | 0xALL); /*0x5628*/
              *(_BYTE *)(v12 + qword_9680 + 2289) = sub_24F0(v21 | 0xB); /*0x563b*/
              v22 = sub_2500(((v41 & 7 | (8 * (BYTE8(v40) & 0x1F | (32LL * (unsigned __int8)v40)))) << 12) | 0xA2); /*0x566d*/
              ++v0; /*0x5684*/
              *(_BYTE *)(v12 + qword_9680 + 2290) = v22 & 0xF; /*0x5687*/
              *(_BYTE *)(v12 + qword_9680 + 2291) = (v22 >> 4) & 0x3F; /*0x5695*/
            }
          }
        }
      }
LABEL_48:
      ; /*0x56a1*/
    }
    *(_BYTE *)(qword_9680 + 2274) = 4; /*0x56b5*/
    (*(void (__fastcall **)(__int64))(qword_96A8 + 72))(v35); /*0x56c7*/
    return 0; /*0x56ca*/
  }
  return result; /*0x56cc*/
}