Newer
Older
AMI-Aptio-BIOS-Reversed / IntelPhyCard / sub_E14_decomp.txt
@Ajax Dong Ajax Dong 2 days ago 13 KB Init
__int64 sub_E14()
{
  __int64 v0; // rax
  __int16 v1; // ax
  __int64 v2; // rdx
  unsigned int v3; // edi
  int v4; // eax
  int v5; // ebx
  __int64 v6; // rcx
  __int64 v7; // r8
  __int64 v8; // r9
  unsigned __int16 v9; // ax
  unsigned __int8 v10; // dl
  unsigned int v11; // ebx
  __int64 result; // rax
  int v13; // r12d
  int v14; // r15d
  int v15; // r14d
  int v16; // ebx
  unsigned __int16 v17; // si
  unsigned __int8 *v18; // rbx
  unsigned __int16 n4_1; // di
  __int64 n4; // r14
  __int64 v21; // rcx
  __int64 v22; // r8
  __int64 v23; // rax
  unsigned __int8 v24; // r12
  unsigned __int8 v25; // al
  unsigned __int16 v26; // r15
  __int64 v27; // r13
  bool v28; // al
  __int64 v29; // rdi
  __int64 v30; // rcx
  __int64 v31; // r8
  __int64 v32; // rdx
  char v33; // al
  __int16 v34; // kr08_2
  __int64 v35; // r8
  __int64 v36; // r9
  char v37; // r10
  void (*funcs_1386)(void); // rax
  char v39; // bl
  __int64 v40; // rdx
  unsigned __int16 n0x20; // si
  __int64 v42; // r14
  __int64 v43; // rax
  __int64 v44; // rdi
  __int64 v45; // rbx
  __int64 v46; // rdx
  int n4096; // r12d
  unsigned int n4096_1; // r15d
  __int64 v49; // rdi
  unsigned int v50; // edx
  unsigned int v51; // r12d
  __int64 v52; // rax
  __int64 v53; // rcx
  char v54; // r8
  const char *Write_success_%X_n; // rdx
  void (*funcs_157E)(void); // rax
  char v57; // bl
  __int64 v58; // r9
  __int64 v59; // rbx
  int v60; // [rsp+28h] [rbp-D8h]
  __int64 v61; // [rsp+40h] [rbp-C0h] BYREF
  unsigned __int8 v62; // [rsp+48h] [rbp-B8h]
  char v63; // [rsp+49h] [rbp-B7h]
  char v64[2]; // [rsp+4Ah] [rbp-B6h] BYREF
  unsigned __int16 v65; // [rsp+4Ch] [rbp-B4h]
  _BYTE v66[4]; // [rsp+50h] [rbp-B0h] BYREF
  char v67[4]; // [rsp+54h] [rbp-ACh] BYREF
  __int16 v68; // [rsp+58h] [rbp-A8h] BYREF
  int v69; // [rsp+5Ah] [rbp-A6h]
  __int64 v70; // [rsp+60h] [rbp-A0h] BYREF
  _DWORD v71[4]; // [rsp+68h] [rbp-98h] BYREF
  int v72; // [rsp+78h] [rbp-88h]
  int v73; // [rsp+7Ch] [rbp-84h]
  int v74; // [rsp+80h] [rbp-80h]
  int v75; // [rsp+84h] [rbp-7Ch]
  int v76; // [rsp+88h] [rbp-78h]
  int v77; // [rsp+8Ch] [rbp-74h]
  __int128 v78; // [rsp+90h] [rbp-70h] BYREF
  _QWORD v79[40]; // [rsp+A0h] [rbp-60h] BYREF
  __int64 v80; // [rsp+1F0h] [rbp+F0h] BYREF
  __int64 v81; // [rsp+1F8h] [rbp+F8h] BYREF
  unsigned __int8 v82; // [rsp+200h] [rbp+100h]
  unsigned __int8 v83; // [rsp+208h] [rbp+108h]

  v0 = sub_1AD8(); /*0xe30*/
  v1 = (*(__int64 (__fastcall **)(__int64))(v0 + 16))(189); /*0xe3a*/
  v2 = qword_4A20; /*0xe3d*/
  v65 = v1 + 8; /*0xe50*/
  *(_DWORD *)(qword_4A20 + 180) = 0; /*0xe55*/
  if ( *(_DWORD *)(v2 + 184) == 267429210 /*0xe7f*/
    && (*(_DWORD *)(v2 + 180) = 8236, v4 = *(_DWORD *)(v2 + 184), (v4 & 0xFFFF0000) != 0) )
  {
    v3 = (unsigned __int16)v4 << 12; /*0xe84*/
  }
  else
  {
    v3 = 0; /*0xe66*/
  }
  v5 = 0; /*0xe8c*/
  v6 = *(unsigned int *)sub_1CAC(1036304); /*0xe93*/
  qword_4A20 = v6; /*0xe95*/
  *(_DWORD *)(v6 + 180) = 0; /*0xe9e*/
  if ( *(_DWORD *)(v6 + 184) == 267429210 ) /*0xeb6*/
  {
    *(_DWORD *)&byte_40[(unsigned int)v6 + 116] = 4; /*0xebc*/
    v9 = (*(_DWORD *)&byte_40[(unsigned int)v6 + 120] >> 8) & 3; /*0xecf*/
    *(_DWORD *)&byte_40[(unsigned int)v6 + 116] = 4096; /*0xed2*/
    v7 = *(unsigned int *)&byte_40[(unsigned int)v6 + 120]; /*0xedc*/
    v10 = 0; /*0xee3*/
    v8 = (unsigned int)v9 + 1; /*0xeea*/
    if ( v9 != -1 ) /*0xeed*/
    {
      do /*0xf66*/
      {
        if ( (v7 & 7) != 0 ) /*0xef6*/
        {
          switch ( v7 & 7 ) /*0xefb*/
          {
            case 1LL: /*0xefb*/
              v5 += 0x100000; /*0xf4b*/
              break;
            case 2LL: /*0xefb*/
              v5 += 0x200000; /*0xf43*/
              break;
            case 3LL: /*0xefb*/
              v5 += 0x400000; /*0xf3b*/
              break;
            case 4LL: /*0xefb*/
              v5 += 0x800000; /*0xf33*/
              break;
            case 5LL: /*0xefb*/
              v5 += 0x1000000; /*0xf2b*/
              break;
            case 6LL: /*0xefb*/
              v5 += 0x2000000; /*0xf23*/
              break;
            case 7LL: /*0xefb*/
              v5 += 0x4000000; /*0xf1b*/
              break;
          }
        }
        else
        {
          v5 += 0x80000; /*0xf53*/
        }
        ++v10; /*0xf59*/
        LOBYTE(v7) = (unsigned __int8)v7 >> 4; /*0xf5c*/
      }
      while ( v10 < (unsigned int)v8 ); /*0xf66*/
    }
  }
  v11 = -v5; /*0xf68*/
  result = v3; /*0xf6a*/
  *(_QWORD *)&v78 = v3 + (unsigned __int64)v11; /*0xf72*/
  if ( (_QWORD)v78 )
  {
    sub_9BC(v3 + (unsigned __int64)v11, 0, v7, v8); /*0xf81*/
    v13 = (unsigned __int8)dword_4CC0; /*0xf86*/
    v14 = BYTE1(dword_4CC0); /*0xf95*/
    v15 = BYTE2(dword_4CC0); /*0xf9d*/
    v16 = HIBYTE(word_4CC4); /*0xfb3*/
    LODWORD(v81) = dword_4CC0; /*0xfba*/
    WORD2(v81) = word_4CC4; /*0xfd6*/
    v73 = (unsigned __int8)word_4CC4; /*0xffb*/
    v74 = HIBYTE(dword_4CC0); /*0x1002*/
    v63 = sub_C90(&v81); /*0x1011*/
    v72 = v16; /*0x1015*/
    v75 = v15; /*0x1019*/
    v76 = v14; /*0x101d*/
    v77 = v13; /*0x1021*/
    sub_1A50(64, "LanMac.MAC = [%X-%X-%X-%X-%X-%X] \n", v13, v14, v15, v74, v73, v16); /*0x102a*/
    v17 = v65; /*0x102f*/
    v18 = v66; /*0x1034*/
    n4_1 = 0; /*0x103b*/
    n4 = 4; /*0x1046*/
    do /*0x1142*/
    {
      sub_1980(&v61, 6); /*0x1056*/
      v23 = sub_BEC(v21, v17, v22, &v61); /*0x1063*/
      v62 = BYTE1(v61); /*0x1071*/
      v24 = v61; /*0x1071*/
      __SET_PAIR__(v82, v83, WORD1(v61)); /*0x108b*/
      v69 = *(_DWORD *)((char *)&v61 + 2); /*0x108b*/
      __SET_PAIR__(v80, v81, WORD2(v61)); /*0x10a7*/
      v68 = v61; /*0x10b1*/
      if ( v23 >= 0 ) /*0x10b9*/
      {
        v25 = sub_C90(&v68); /*0x10c5*/
        *v18 = v25; /*0x10de*/
        sub_1A50(64, "ValidMacFRU[%d] = 0x%X \n", n4_1, v25); /*0x10e1*/
        sub_1A50( /*0x112a*/
          64,
          "BMCFruMac.MAC = [%X-%X-%X-%X-%X-%X] \n",
          v24,
          v62,
          v83,
          v82,
          (unsigned __int8)v81,
          (unsigned __int8)v80);
      }
      else
      {
        *v18 = 0; /*0x10bb*/
      }
      ++n4_1; /*0x1134*/
      v17 += 6; /*0x1138*/
      ++v18; /*0x113b*/
    }
    while ( n4_1 < 4u ); /*0x1142*/
    v26 = v65; /*0x114d*/
    v27 = v78; /*0x1153*/
    v28 = v66[0] || v66[1] || v66[2] || v66[3]; /*0x1179*/
    if ( v63 )
    {
      sub_1A50(64, "The MAC[%x %x %x %x %x %x] is Valid.\n", v77, v76, v75, v74, v73, v72); /*0x11ba*/
      v71[0] = -326642109; /*0x11d1*/
      v71[1] = 1270213540; /*0x11dd*/
      v71[2] = 1044374945; /*0x11ea*/
      v71[3] = -1458720202; /*0x11f9*/
      result = (*(__int64 (__fastcall **)(const __int16 *, _DWORD *, __int64, __int64, int *))(RuntimeServices + 88))( /*0x1206*/
                 L"LBG_LAN_Mac",
                 v71,
                 3,
                 24,
                 &dword_4CC0);
      if ( result < 0 )
        return sub_1A50(64, "Write MAC to NVRAM fail: %r\n", result);
    }
    else if ( v28 ) /*0x1228*/
    {
      sub_1A50(64, "The MAC is Invalid, but the MAC in FRU is Valid.\n"); /*0x1242*/
      result = (*(__int64 (__fastcall **)(__int64, __int64, __int64 *))(qword_4B58 + 64))(4, 0x20000, &v70); /*0x125d*/
      if ( result >= 0 ) /*0x1263*/
      {
        sub_27C4(v27, v70, 0x20000); /*0x1274*/
        v29 = 0; /*0x1279*/
        do /*0x1318*/
        {
          sub_1980(&v61, 6); /*0x1298*/
          sub_BEC(v30, v26, v31, &v61); /*0x12a6*/
          v33 = v61; /*0x12ab*/
          v26 += 6; /*0x12af*/
          v34 = *(_WORD *)((char *)&v61 + 1); /*0x12b7*/
          LOBYTE(v36) = BYTE4(v61); /*0x12c0*/
          LOBYTE(v35) = BYTE3(v61); /*0x12c0*/
          v37 = BYTE5(v61); /*0x12c5*/
          *((_BYTE *)&dword_4CC0 + v29) = v61; /*0x12ca*/
          *(_WORD *)((char *)&dword_4CC0 + v29 + 1) = v34; /*0x12cd*/
          *(_WORD *)((char *)&dword_4CC0 + v29 + 3) = __PAIR16__(v36, v35); /*0x12d5*/
          *((_BYTE *)&dword_4CC0 + v29 + 5) = v37; /*0x12df*/
          byte_4CA0[v29] = v33; /*0x12e4*/
          *(_WORD *)&byte_4CA0[v29 + 1] = v34; /*0x12eb*/
          *(_WORD *)&byte_4CA0[v29 + 3] = __PAIR16__(v36, v35); /*0x12f9*/
          byte_4CA4[v29 + 1] = v37; /*0x1309*/
          v29 += 6; /*0x1311*/
          --n4; /*0x1314*/
        }
        while ( n4 ); /*0x1318*/
        LOBYTE(v32) = 1; /*0x132d*/
        dword_4C70 = dword_4CC0; /*0x1330*/
        word_4C74 = word_4CC4; /*0x1366*/
        sub_9BC(v70, v32, v35, v36); /*0x1372*/
        funcs_1386 = (void (*)(void))funcs_1386; /*0x1377*/
        v39 = 0; /*0x1381*/
        while ( funcs_1386 ) /*0x1399*/
        {
          funcs_1386(); /*0x1386*/
          funcs_1386 = *(void (**)(void))((char *)&funcs_1386 + (_QWORD)&_ImageBase[4 * (unsigned __int8)++v39]); /*0x138e*/
        }
        v40 = qword_4C28; /*0x139b*/
        if ( qword_4C28 || (sub_2784(qword_4AD0), (v40 = qword_4C28) != 0) ) /*0x13bd*/
        {
          (*(void (**)(void))(v40 + 48))(); /*0x13bf*/
          v40 = qword_4C28; /*0x13c2*/
        }
        n0x20 = 0; /*0x13c9*/
        v42 = v27; /*0x13cd*/
        do /*0x1542*/
        {
          v43 = n0x20 << 12; /*0x13d3*/
          v44 = v43; /*0x13d6*/
          v81 = v43; /*0x13d8*/
          v45 = v43 + v27; /*0x13df*/
          if ( (v40 || (sub_2784(v43 + v27), (v40 = qword_4C28) != 0)) /*0x1420*/
            && ((*(void (__fastcall **)(__int64))(v40 + 32))(v45), (v46 = qword_4C28) != 0)
            || (sub_2784(v45), (v46 = qword_4C28) != 0) )
          {
            (*(void (__fastcall **)(__int64))(v46 + 8))(v45); /*0x1425*/
          }
          sub_38BC(v45, v44 + v70); /*0x1433*/
          n4096 = 4096; /*0x143d*/
          n4096_1 = 4096; /*0x1446*/
          v80 = v44 + v70; /*0x144b*/
          v49 = 0; /*0x1452*/
          while ( 1 ) /*0x1460*/
          {
            sub_39AE(v79, 256, 0); /*0x1460*/
            sub_27C4(v27 + v49 + v81, v79, 256); /*0x147c*/
            n4096_1 -= 256; /*0x1484*/
            v50 = 0; /*0x148b*/
            v51 = n4096 - n4096_1; /*0x148e*/
            if ( v51 ) /*0x1491*/
              break; /*0x1491*/
LABEL_64:
            n4096 = n4096_1; /*0x14d0*/
            v49 = 4096 - n4096_1; /*0x14d8*/
            if ( n4096_1 > 0x1000 ) /*0x14e1*/
            {
              Write_success_%X_n = "Write success %X\n"; /*0x14e7*/
              goto LABEL_66; /*0x14e7*/
            }
          }
          v52 = v80; /*0x1493*/
          v53 = 0; /*0x149a*/
          while ( 1 ) /*0x14a0*/
          {
            if ( v52 ) /*0x14a0*/
            {
              v54 = *(_BYTE *)(v53 + v52 + v49); /*0x14a5*/
              v52 = v80; /*0x14a9*/
            }
            else
            {
              v54 = -1; /*0x14b2*/
            }
            if ( *((_BYTE *)v79 + v53) != v54 ) /*0x14ba*/
              break; /*0x14ba*/
            ++v50; /*0x14c0*/
            ++v53; /*0x14c2*/
            if ( v50 >= v51 ) /*0x14ce*/
              goto LABEL_64; /*0x14ce*/
          }
          Write_success_%X_n = "Write fail %X\n"; /*0x1667*/
LABEL_66:
          sub_1A50(64, Write_success_%X_n, v42); /*0x14ee*/
          v40 = qword_4C28; /*0x14fd*/
          if ( qword_4C28 || (sub_2784(v45), (v40 = qword_4C28) != 0) ) /*0x151e*/
          {
            (*(void (__fastcall **)(__int64))(v40 + 40))(v45); /*0x1523*/
            v40 = qword_4C28; /*0x1526*/
          }
          v42 += 4096; /*0x1533*/
          ++n0x20; /*0x153a*/
        }
        while ( n0x20 < 0x20u ); /*0x1542*/
        if ( v40 || (sub_2784(qword_4AD0), (v40 = qword_4C28) != 0) ) /*0x1563*/
        {
          (*(void (**)(void))(v40 + 56))(); /*0x1565*/
          funcs_157E = (void (*)(void))funcs_157E; /*0x1568*/
          v57 = 0; /*0x156f*/
          if ( funcs_157E ) /*0x1575*/
          {
            do /*0x1591*/
            {
              funcs_157E(); /*0x157e*/
              funcs_157E = *(void (**)(void))((char *)&funcs_157E + (_QWORD)&_ImageBase[4 * (unsigned __int8)++v57]); /*0x1586*/
            }
            while ( funcs_157E ); /*0x1591*/
          }
        }
        (*(void (__fastcall **)(__int64))(qword_4B58 + 72))(v70); /*0x159f*/
        (*(void (__fastcall **)(__int64))(qword_4B58 + 248))(500000); /*0x15ae*/
        LOBYTE(v80) = 0; /*0x15cb*/
        v78 = xmmword_3B68; /*0x15d6*/
        result = (*(__int64 (__fastcall **)(__int128 *, _QWORD, __int64 *))(qword_4B58 + 320))(&v78, 0, &qword_4B40); /*0x15db*/
        if ( result >= 0 ) /*0x15e4*/
        {
          v64[0] = 2; /*0x15ed*/
          LOBYTE(v58) = 2; /*0x15f7*/
          LOBYTE(v80) = 1; /*0x15ff*/
          LOBYTE(v60) = 1; /*0x1613*/
          v59 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD, __int64, char *, int, char *, __int64 *))(qword_4B40 + 16))( /*0x1638*/
                  qword_4B40,
                  0,
                  0,
                  v58,
                  v64,
                  v60,
                  v67,
                  &v80);
          (*(void (__fastcall **)(__int64))(qword_4B58 + 248))(360000000); /*0x163b*/
          return sub_1A50(64, "Send power cycle status - %r\n", v59); /*0x164e*/
        }
      }
    }
    else
    {
      return sub_1A50(64, "Both of the Mac and MAC in FRU is invalid.\n"); /*0x1231*/
    }
  }
  return result; /*0x1653*/
}