__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*/ }