/*
*IntelPhyCard.efi - Full Decompilation
*Source: HR650X BIOS PE file 0101 (IntelPhyCard.efi)
*IDA Port: 13368
*Decompiled: 24 major functions covering all driver logic
*/
#include "IntelPhyCard.h"
// _ModuleEntryPoint (0x3e0)
EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
sub_480(ImageHandle); /*0x3e9*/
if ( !::SystemTable ) /*0x3f6*/
{
::SystemTable = (__int64)SystemTable; /*0x3f8*/
BootServices = (__int64)SystemTable->BootServices; /*0x403*/
RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x40e*/
}
if ( (unsigned __int8)sub_1844() ) /*0x415*/
{
sub_1A50(0x80000000LL, "\nOCP present\n"); /*0x42a*/
sub_E14(); /*0x42f*/
}
else
{
sub_1A50(0x80000000LL, "\nOCP not present\n"); /*0x43d*/
}
return (*(EFI_STATUS ( **)(__int64, __int64, __int64 ( *)()))(BootServices + 368))( /*0x478*/
512,
8,
sub_18A0);
}
// sub_480 (0x480)
__int64 sub_480(__int64 ImageHandle, __int64 a2)
{
__int64 Status; // rax __int64 Status; // rbx __int64 Status; // rax __int64 v6; // rax __int64 v7; // rax __int64 v8; // rbx __int64 v9; // rax __int64 v10; // rax __int64 v11; // rax __int64 v12; // rcx __int64 v13; // rax _BYTE *v14; // rax __int16 v15; // bx bool v16; // bl __int64 v17; // rdi __int64 result; // rax
::ImageHandle = ImageHandle; /*0x495*/
if ( !ImageHandle ) /*0x4a9*/
sub_1A98( /*0x4b8*/
"e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
51,
"gImageHandle != ((void *) 0)");
qword_4B50 = a2; /*0x4bd*/
if ( !a2 ) /*0x4c7*/
sub_1A98("e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 57, "gST != ((void *) 0)"); /*0x4d6*/
qword_4B58 = *(_QWORD *)(a2 + 96); /*0x4df*/
if ( !qword_4B58 ) /*0x4e9*/
sub_1A98("e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 63, "gBS != ((void *) 0)"); /*0x4f8*/
qword_4B68 = *(_QWORD *)(a2 + 88); /*0x501*/
if ( !qword_4B68 ) /*0x50b*/
sub_1A98( /*0x51e*/
"e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
47,
"gRT != ((void *) 0)");
Status = sub_1B64(&unk_4A10, &qword_4B80); /*0x531*/
Status = Status; /*0x536*/
if ( Status < 0 ) /*0x542*/
{
sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x551*/
sub_1A98("e:\\hs\\MdePkg\\Library\\DxeServicesTableLib\\DxeServicesTableLib.c", 64, "!EFI_ERROR (Status)"); /*0x569*/
}
if ( !qword_4B80 ) /*0x576*/
sub_1A98("e:\\hs\\MdePkg\\Library\\DxeServicesTableLib\\DxeServicesTableLib.c", 65, "gDS != ((void *) 0)"); /*0x58b*/
if ( Status < 0 ) /*0x593*/
{
sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x5a2*/
sub_1A98( /*0x5ba*/
"e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\LenovoServerPkg\\IntelPhyCard\\IntelPhyCard\\DEBUG\\AutoGen.c",
453,
"!EFI_ERROR (Status)");
}
if ( !qword_4B88 ) /*0x5c7*/
{
Status = (*(__int64 ( **)(void *, _QWORD, __int64 *))(qword_4B58 + 320))(&unk_49B0, 0, &qword_4B88); /*0x5e0*/
if ( Status < 0 ) /*0x5e9*/
{
sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x5f8*/
sub_1A98("e:\\hs\\CpRcPkg\\Library\\DxeMmPciBaseLib\\DxeMmPciBaseLib.c", 52, "!EFI_ERROR (Status)"); /*0x610*/
}
if ( !qword_4B88 ) /*0x61d*/
sub_1A98("e:\\hs\\CpRcPkg\\Library\\DxeMmPciBaseLib\\DxeMmPciBaseLib.c", 53, "mPciUsra != ((void *) 0)"); /*0x632*/
}
sub_1C28(); /*0x637*/
v6 = sub_1AD8(); /*0x63c*/
qword_4B98 = (*(__int64 ( **)(__int64))(v6 + 32))(5); /*0x649*/
v7 = sub_1AD8(); /*0x650*/
v8 = (*(__int64 ( **)(__int64))(v7 + 40))(7); /*0x65f*/
v9 = sub_1AD8(); /*0x662*/
if ( (unsigned __int64)(*(__int64 ( **)(__int64))(v9 + 56))(7) > 0x48 ) /*0x670*/
sub_1A98( /*0x683*/
"e:\\hs\\AmiCRBPkg\\Library\\AmiPcieSegBusLib\\AmiPcieSegBusDxeSmm.c",
60,
"sizeof (PCIE_SEG_BUS_TABLE) >= LibPcdGetSize(7U)");
v10 = sub_1AD8(); /*0x688*/
v11 = (*(__int64 ( **)(__int64))(v10 + 56))(7); /*0x690*/
sub_292C(v12, v8, v11); /*0x699*/
if ( *(char *)sub_1CAC(1024068) >= 0 ) /*0x6ae*/
{
v13 = sub_1CAC(1024064); /*0x6b3*/
sub_2878(v13); /*0x6bb*/
v14 = (_BYTE *)sub_1CAC(1024068); /*0x6c2*/
*v14 |= 0x80u; /*0x6cc*/
}
v15 = sub_360(); /*0x6d3*/
sub_350(); /*0x6d6*/
v16 = (v15 & 0x200) != 0; /*0x6e7*/
v17 = sub_1950(1288) & 0xFFFFFF; /*0x6f1*/
sub_330(); /*0x6f7*/
while ( (((_DWORD)v17 + 357 - (unsigned int)sub_1950(1288)) & 0x800000) == 0 ) /*0x717*/
sub_320(); /*0x6fe*/
sub_330(); /*0x719*/
if ( v16 ) /*0x720*/
sub_340(); /*0x722*/
else sub_350(); /*0x729*/
result = sub_2784(4278190080LL); /*0x733*/
if ( result < 0 ) /*0x73b*/
{
sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x74a*/
return sub_1A98( /*0x762*/
"e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\LenovoServerPkg\\IntelPhyCard\\IntelPhyCard\\DEBUG\\AutoGen.c",
471,
"!EFI_ERROR (Status)");
}
return result; /*0x776*/
}
// sub_E14 (0xe14)
__int64 sub_E14()
{
__int64 v0; // rax __int16 Index; // ax __int64 Index; // rdx unsigned int Index; // edi int v4; // eax int Status; // ebx __int64 v6; // rcx __int64 Result; // r8 __int64 v8; // r9 unsigned __int16 v9; // ax unsigned __int8 Index; // 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 Index; // 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 Index; // 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 Index; // 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 Index; // edx unsigned int v51; // r12d __int64 v52; // rax __int64 Index; // rcx char v54; // r8 const char *Write_success_%X_n; // rdx void (*funcs_157E)(void); // rax char Index; // bl __int64 v58; // r9 __int64 Status; // 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 Result; // [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 Result; // [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*/
Index = (*(__int64 ( **)(__int64))(v0 + 16))(189); /*0xe3a*/
Index = qword_4A20; /*0xe3d*/
v65 = Index + 8; /*0xe50*/
*(_DWORD *)(qword_4A20 + 180) = 0; /*0xe55*/
if ( *(_DWORD *)(Index + 184) == 267429210 /*0xe7f*/
&& (*(_DWORD *)(Index + 180) = 8236, v4 = *(_DWORD *)(Index + 184), (v4 & 0xFFFF0000) != 0) )
{
Index = (unsigned __int16)v4 << 12; /*0xe84*/
}
else
{
Index = 0; /*0xe66*/
}
Status = 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*/
Result = *(unsigned int *)&byte_40[(unsigned int)v6 + 120]; /*0xedc*/
Index = 0; /*0xee3*/
v8 = (unsigned int)v9 + 1; /*0xeea*/
if ( v9 != -1 ) /*0xeed*/
{
do /*0xf66*/
{
if ( (Result & 7) != 0 ) /*0xef6*/
{
switch ( Result & 7 ) /*0xefb*/
{
case 1LL: /*0xefb*/
Status += 0x100000; /*0xf4b*/
break;
case 2LL: /*0xefb*/
Status += 0x200000; /*0xf43*/
break;
case 3LL: /*0xefb*/
Status += 0x400000; /*0xf3b*/
break;
case 4LL: /*0xefb*/
Status += 0x800000; /*0xf33*/
break;
case 5LL: /*0xefb*/
Status += 0x1000000; /*0xf2b*/
break;
case 6LL: /*0xefb*/
Status += 0x2000000; /*0xf23*/
break;
case 7LL: /*0xefb*/
Status += 0x4000000; /*0xf1b*/
break;
}
}
else
{
Status += 0x80000; /*0xf53*/
}
++Index; /*0xf59*/
LOBYTE(Result) = (unsigned __int8)Result >> 4; /*0xf5c*/
}
while ( Index < (unsigned int)v8 ); /*0xf66*/
}
}
v11 = -Status; /*0xf68*/
result = Index; /*0xf6a*/
*(_QWORD *)&Result = Index + (unsigned __int64)v11; /*0xf72*/
if ( (_QWORD)Result )
{
sub_9BC(Index + (unsigned __int64)v11, 0, Result, 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*/
Index = 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 = Result; /*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 ( **)(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 ( **)(__int64, __int64, __int64 *))(qword_4B58 + 64))(4, 0x20000, &Result); /*0x125d*/
if ( result >= 0 ) /*0x1263*/
{
sub_27C4(v27, Result, 0x20000); /*0x1274*/
Index = 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 + Index) = v61; /*0x12ca*/
*(_WORD *)((char *)&dword_4CC0 + Index + 1) = v34; /*0x12cd*/
*(_WORD *)((char *)&dword_4CC0 + Index + 3) = __PAIR16__(v36, v35); /*0x12d5*/
*((_BYTE *)&dword_4CC0 + Index + 5) = v37; /*0x12df*/
byte_4CA0[Index] = v33; /*0x12e4*/
*(_WORD *)&byte_4CA0[Index + 1] = v34; /*0x12eb*/
*(_WORD *)&byte_4CA0[Index + 3] = __PAIR16__(v36, v35); /*0x12f9*/
byte_4CA4[Index + 1] = v37; /*0x1309*/
Index += 6; /*0x1311*/
--Index; /*0x1314*/
}
while ( Index ); /*0x1318*/
LOBYTE(v32) = 1; /*0x132d*/
dword_4C70 = dword_4CC0; /*0x1330*/
word_4C74 = word_4CC4; /*0x1366*/
sub_9BC(Result, v32, v35, v36); /*0x1372*/
funcs_1386 = (void (*)(void))funcs_1386; /*0x1377*/
Index = 0; /*0x1381*/
while ( funcs_1386 ) /*0x1399*/
{
funcs_1386(); /*0x1386*/
funcs_1386 = *(void (**)(void))((char *)&funcs_1386 + (_QWORD)&_ImageBase[4 * (unsigned __int8)++Index]); /*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 ( **)(__int64))(v40 + 32))(v45), (v46 = qword_4C28) != 0)
|| (sub_2784(v45), (v46 = qword_4C28) != 0) )
{
(*(void ( **)(__int64))(v46 + 8))(v45); /*0x1425*/
}
sub_38BC(v45, v44 + Result); /*0x1433*/
n4096 = 4096; /*0x143d*/
n4096_1 = 4096; /*0x1446*/
v80 = v44 + Result; /*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*/
Index = 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*/
Index = 0; /*0x149a*/
while ( 1 ) /*0x14a0*/
{
if ( v52 ) /*0x14a0*/
{
v54 = *(_BYTE *)(Index + v52 + v49); /*0x14a5*/
v52 = v80; /*0x14a9*/
}
else
{
v54 = -1; /*0x14b2*/
}
if ( *((_BYTE *)v79 + Index) != v54 ) /*0x14ba*/
break; /*0x14ba*/
++Index; /*0x14c0*/
++Index; /*0x14c2*/
if ( Index >= 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 ( **)(__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*/
Index = 0; /*0x156f*/
if ( funcs_157E ) /*0x1575*/
{
do /*0x1591*/
{
funcs_157E(); /*0x157e*/
funcs_157E = *(void (**)(void))((char *)&funcs_157E + (_QWORD)&_ImageBase[4 * (unsigned __int8)++Index]); /*0x1586*/
}
while ( funcs_157E ); /*0x1591*/
}
}
(*(void ( **)(__int64))(qword_4B58 + 72))(Result); /*0x159f*/
(*(void ( **)(__int64))(qword_4B58 + 248))(500000); /*0x15ae*/
LOBYTE(v80) = 0; /*0x15cb*/
Result = xmmword_3B68; /*0x15d6*/
result = (*(__int64 ( **)(__int128 *, _QWORD, __int64 *))(qword_4B58 + 320))(&Result, 0, &qword_4B40); /*0x15db*/
if ( result >= 0 ) /*0x15e4*/
{
v64[0] = 2; /*0x15ed*/
LOBYTE(v58) = 2; /*0x15f7*/
LOBYTE(v80) = 1; /*0x15ff*/
LOBYTE(v60) = 1; /*0x1613*/
Status = (*(__int64 ( **)(__int64, _QWORD, _QWORD, __int64, char *, int, char *, __int64 *))(qword_4B40 + 16))( /*0x1638*/
qword_4B40,
0,
0,
v58,
v64,
v60,
v67,
&v80);
(*(void ( **)(__int64))(qword_4B58 + 248))(360000000); /*0x163b*/
return sub_1A50(64, "Send power cycle status - %r\n", Status); /*0x164e*/
}
}
}
else
{
return sub_1A50(64, "Both of the Mac and MAC in FRU is invalid.\n"); /*0x1231*/
}
}
return result; /*0x1653*/
}
// sub_18A0 (0x18A0)
__int64 sub_18A0()
{
__int64 result; // rax char v1; // [rsp+50h] [rbp+18h]
sub_1A50(0x80000000LL, "\nUpdateOCPCardStatus\n"); /*0x18b9*/
if ( (unsigned __int8)sub_1674() == 1 ) /*0x18c5*/
{
result = sub_1844(); /*0x18c7*/
if ( (_BYTE)result ) /*0x18ce*/
return result; /*0x18ce*/
v1 = 1; /*0x18d0*/
}
else
{
sub_1A50(0x80000000LL, "\nOCP not present\n"); /*0x18e1*/
result = sub_1844(); /*0x18e6*/
if ( !(_BYTE)result ) /*0x18ed*/
return result; /*0x18ed*/
v1 = 0; /*0x18ef*/
}
result = (*(__int64 ( **)(const __int16 *, void *, __int64))(qword_4B68 + 88))(L"OCP_TypeC", &unk_49D0, 3); /*0x191d*/
if ( v1 ) /*0x1925*/
{
sub_1A50(0x80000000LL, "\nOCP Conenct,Reset System\n"); /*0x1931*/
return (*(__int64 ( **)(_QWORD, _QWORD, _QWORD, _QWORD))(qword_4B68 + 104))(0, 0, 0, 0); /*0x1947*/
}
return result; /*0x194a*/
}
// sub_1844 (0x1844)
char sub_1844()
{
char Result; // [rsp+40h] [rbp+8h] BYREF __int64 v2; // [rsp+48h] [rbp+10h] BYREF v2 = 1; /*0x184f*/
Result = 0; /*0x1870*/
if ( (*(__int64 ( **)(const __int16 *, void *, _QWORD, __int64 *, char *))(qword_4B68 + 72))( /*0x1882*/
L"OCP_TypeC",
&unk_49D0,
0,
&v2,
&Result) < 0 )
sub_1A50(0x80000000LL, "\nLnvGetOcpTypeCstatus Fail\n"); /*0x1890*/
return Result; /*0x1899*/
}
// sub_1950 (0x1950)
unsigned __int32 sub_1950(unsigned __int16 n1288)
{
if ( (n1288 & 3) != 0 ) /*0x195c*/
sub_1A98((__int64)"e:\\hs\\MdePkg\\Library\\BaseIoLibIntrinsic\\IoLibMsc.c", 193, (__int64)"(Port & 3) == 0"); /*0x1971*/
return __indword(n1288); /*0x197a*/
}
// sub_1A50 (0x1A50)
__int64 sub_1A50(__int64 a1, const char *a2, ...)
{
__int64 result; // rax __int64 ( **v4)(__int64, const char *, __int64 *); // r10 va_list va; // [rsp+40h] [rbp+18h] BYREF va_start(va, a2);
result = sub_19D0(); /*0x1a67*/
if ( result ) /*0x1a72*/
{
result = sub_28AC(); /*0x1a74*/
if ( ((unsigned int)result & (unsigned int)a1) != 0 ) /*0x1a7f*/
return (*v4)(a1, a2, (__int64 *)va); /*0x1a8e*/
}
return result; /*0x1a91*/
}
// sub_1A98 (0x1A98)
__int64 sub_1A98(__int64 a1, __int64 a2, __int64 a3)
{
__int64 result; // rax result = sub_19D0(); /*0x1ab0*/
if ( result ) /*0x1ab8*/
return (*(__int64 ( **)(__int64, __int64, __int64))(result + 8))(a1, a2, a3); /*0x1ac3*/
return result; /*0x1ad0*/
}
// sub_1AD8 (0x1AD8)
__int64 sub_1AD8()
{
__int64 result; // rax __int64 Status; // rax result = qword_4B78; /*0x1adc*/
if ( !qword_4B78 ) /*0x1ae6*/
{
Status = (*(__int64 ( **)(void *, _QWORD, __int64 *))(qword_4B58 + 320))(&unk_49C0, 0, &qword_4B78); /*0x1aff*/
if ( Status < 0 ) /*0x1b08*/
{
sub_1A50(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1b19*/
sub_1A98("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 78, "!EFI_ERROR (Status)"); /*0x1b31*/
}
result = qword_4B78; /*0x1b36*/
if ( !qword_4B78 ) /*0x1b40*/
{
sub_1A98("e:\\hs\\MdePkg\\Library\\DxePcdLib\\DxePcdLib.c", 79, "mPcd != ((void *) 0)"); /*0x1b53*/
return qword_4B78; /*0x1b58*/
}
}
return result; /*0x1b5f*/
}
// sub_1CAC (0x1CAC)
__int64 sub_1CAC(__int64 a1)
{
if ( (a1 & 0xFFFFFFFFF0000000uLL) != 0 ) /*0x1cbc*/
sub_1A98( /*0x1cd1*/
(__int64)"e:\\hs\\MdePkg\\Library\\SmmPciExpressLib\\PciExpressLib.c",
118,
(__int64)"((Address) & ~0xfffffff) == 0");
return a1 + qword_4B98; /*0x1ce0*/
}
// sub_1DF8 (0x1DF8)
__int64 sub_1DF8(char a1, char a2)
{
unsigned int n0x4000000; // r8d unsigned int i; // r9d __int64 result; // rax n0x4000000 = 0; /*0x1df8*/
if ( a1 ) /*0x1e03*/
{
for ( i = 0; i < 0x4000000; ++i ) /*0x1e05*/
{
if ( (*(_BYTE *)(qword_4A20 + 4) & 0x21) != 0x20 ) /*0x1e18*/
break; /*0x1e18*/
}
result = qword_4A20; /*0x1e22*/
*(_BYTE *)(qword_4A20 + 4) = 7; /*0x1e29*/
}
if ( a2 ) /*0x1e2f*/
{
do /*0x1e4c*/
{
if ( (*(_BYTE *)(qword_4A20 + 160) & 5) != 1 ) /*0x1e44*/
break; /*0x1e44*/
++n0x4000000; /*0x1e46*/
}
while ( n0x4000000 < 0x4000000 ); /*0x1e4c*/
result = qword_4A20; /*0x1e4e*/
*(_BYTE *)(qword_4A20 + 160) = 28; /*0x1e55*/
}
return result; /*0x1e5c*/
}
// sub_1EA4 (0x1EA4)
char sub_1EA4(__int64 a1, __int64 a2, unsigned int n2, char a4)
{
__int64 v4; // rdi unsigned int n2_1; // ebx unsigned int n2_2; // esi unsigned int Index; // edx unsigned int v12; // esi __int64 Index; // rcx char v14; // r8 char dst[64]; // [rsp+20h] [rbp-68h] BYREF unsigned int p_n2; // [rsp+A0h] [rbp+18h] BYREF v4 = 0; /*0x1ebb*/
n2_1 = n2; /*0x1ebd*/
p_n2 = n2; /*0x1ec0*/
n2_2 = n2; /*0x1ecf*/
if ( !n2 ) /*0x1ed5*/
return 1; /*0x1f70*/
while ( 1 ) /*0x1ee7*/
{
sub_39AE(dst, 64, 0); /*0x1ee7*/
if ( a4 ) /*0x1eef*/
{
sub_253C(v4 + a1, dst, &p_n2); /*0x1f02*/
n2_1 = p_n2; /*0x1f07*/
}
else
{
if ( n2_1 <= 0x40 ) /*0x1f13*/
n2_1 = 0; /*0x1f1a*/
else n2_1 -= 64; /*0x1f15*/
p_n2 = n2_1; /*0x1f1e*/
sub_3A00(dst, (char *)(v4 + a1), n2_2 - n2_1); /*0x1f33*/
}
Index = 0; /*0x1f38*/
v12 = n2_2 - n2_1; /*0x1f3a*/
if ( v12 ) /*0x1f3c*/
break; /*0x1f3c*/
LABEL_15:
n2_2 = n2_1; /*0x1f62*/
v4 = n2 - n2_1; /*0x1f66*/
if ( n2 < n2_1 ) /*0x1f6a*/
return 1; /*0x1f6a*/
}
Index = 0; /*0x1f3e*/
while ( 1 )
{
v14 = a2 ? *(_BYTE *)(v4 + Index + a2) : -1;
if ( dst[Index] != v14 ) /*0x1f57*/
return 0; /*0x1f7f*/
++Index; /*0x1f59*/
++Index; /*0x1f5b*/
if ( Index >= v12 ) /*0x1f60*/
goto LABEL_15; /*0x1f60*/
}
}
// sub_1F90 (0x1F90)
unsigned __int64 sub_1F90(int a1, unsigned int *a2)
{
__int64 v2; // r8 unsigned __int64 v5; // r10 unsigned __int64 Index; // r11 unsigned int v7; // eax unsigned __int64 v9; // [rsp+30h] [rbp+8h] BYREF __int64 v10; // [rsp+40h] [rbp+18h] BYREF __int64 v11; // [rsp+48h] [rbp+20h] BYREF LODWORD(v2) = qword_4C18; /*0x1f9c*/
LODWORD(v5) = qword_4C00; /*0x1fb0*/
v11 = qword_4C10; /*0x1fb7*/
v10 = qword_4C18; /*0x1fbb*/
if ( !qword_4C18 ) /*0x1fc2*/
{
*(_DWORD *)(qword_4A20 + 180) = 0; /*0x1fcf*/
if ( *(_DWORD *)(qword_4A20 + 184) == 267429210 && sub_1D5C(0, &v11, &v10) >= 0 ) /*0x1ffd*/
{
Index = 0; /*0x1fff*/
v9 = 0; /*0x2002*/
v5 = 0; /*0x2007*/
do /*0x2056*/
{
*(_DWORD *)(qword_4A20 + 180) = 0; /*0x2011*/
if ( *(_DWORD *)(qword_4A20 + 184) == 267429210 && sub_1D5C((unsigned int)Index, 0, &v9) >= 0 && v9 > v5 ) /*0x2049*/
v5 = v9; /*0x2049*/
++Index; /*0x204f*/
}
while ( Index < 5 ); /*0x2056*/
v2 = v10; /*0x2058*/
}
else
{
v5 = (unsigned int)(n0x1000000 - 1); /*0x2067*/
v2 = v5; /*0x206a*/
}
qword_4C10 = v11; /*0x2072*/
qword_4C18 = v2; /*0x2079*/
qword_4C00 = v5; /*0x2080*/
}
if ( byte_4C08 ) /*0x208e*/
a1 += -16777216 - qword_4AD0; /*0x209c*/
v7 = a1 + v2 + 1; /*0x20a3*/
if ( v7 > (unsigned int)v5 ) /*0x20a9*/
return 0x8000000000000002uLL; /*0x20ab*/
*a2 = v7; /*0x20b7*/
return 0; /*0x20c0*/
}
// sub_216C (0x216C)
char sub_216C(__int64 a1, int *p_n24608)
{
int v3; // edx qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x2183*/
*(_DWORD *)(qword_4A20 + 8) = 0; /*0x218a*/
*(_WORD *)(qword_4A20 + 6) = 525; /*0x219d*/
sub_1DF8(1, 0); /*0x21a3*/
sub_1CE8((unsigned int)(v3 + 35)); /*0x21ab*/
*p_n24608 = *(_DWORD *)(qword_4A20 + 16) & 0xFFFFFF; /*0x21c2*/
return 1; /*0x21c4*/
}
// sub_234C (0x234C)
char sub_234C(__int64 a1, __int64 a2, _DWORD *a3)
{
__int64 v6; // r9 unsigned __int16 Index; // bx char n2_2; // si __int64 Index; // rdx __int64 n2_1; // r9 char v11; // r10 unsigned __int16 i; // r8 char v13; // r15 unsigned int v15; // [rsp+68h] [rbp+20h] BYREF v15 = 0; /*0x2373*/
v6 = *(unsigned int *)sub_1CAC(1036304); /*0x238b*/
Index = Index; /*0x2392*/
qword_4A20 = v6; /*0x2398*/
if ( Index == 1 ) /*0x23a2*/
{
if ( byte_4AA8 && (a1 & 1) == 0 && *a3 >= 2u ) /*0x23e3*/
Index = 2; /*0x23e5*/
}
else
{
Index = 64; /*0x23a4*/
if ( *a3 < 0x40u ) /*0x23a9*/
Index = *(_WORD *)a3; /*0x23ab*/
if ( (a1 & 1) != 0 ) /*0x23c1*/
{
Index = 1; /*0x23c3*/
}
else if ( Index > (unsigned __int16)(256 - (unsigned __int8)a1) ) /*0x23cc*/
{
Index = 256 - (unsigned __int8)a1; /*0x23ce*/
}
}
n2_2 = 0; /*0x23e8*/
while ( 1 ) /*0x23ef*/
{
if ( sub_1EA4(a2, 0, Index, 0) ) /*0x23fa*/
{
LABEL_28:
*a3 -= Index; /*0x2512*/
return 1; /*0x2515*/
}
if ( Index ) /*0x240b*/
{
Index = 0; /*0x240d*/
n2_1 = Index; /*0x2410*/
do /*0x2451*/
{
v11 = *(_BYTE *)(Index + a2); /*0x2414*/
for ( i = 0; i < 0x12Cu; ++i ) /*0x2418*/
{
*(_BYTE *)(Index + qword_4A20 + 16) = v11; /*0x2423*/
v11 = *(_BYTE *)(Index + a2); /*0x242f*/
if ( v11 == *(_BYTE *)(Index + qword_4A20 + 16) ) /*0x243a*/
break; /*0x243a*/
}
++Index; /*0x244b*/
--n2_1; /*0x244e*/
}
while ( n2_1 ); /*0x2451*/
}
sub_1DF8(1, 1); /*0x2459*/
if ( (sub_1F90(a1, &v15) & 0x8000000000000000uLL) != 0LL ) /*0x246e*/
return 0; /*0x2527*/
v13 = v15; /*0x247d*/
*(_DWORD *)(qword_4A20 + 8) = v15; /*0x2485*/
*(_WORD *)(qword_4A20 + 6) = (Index << 8) - 251; /*0x24a0*/
sub_1DF8(1, 0); /*0x24a7*/
sub_1E60(); /*0x24ac*/
if ( byte_4AA8 && (v13 & 1) == 0 && Index >= 2u ) /*0x24c7*/
{
*(_WORD *)(qword_4A20 + 161) = 114; /*0x24d6*/
sub_1DF8(0, 1); /*0x24df*/
}
if ( !sub_1EA4(a1, a2, Index, 1) ) /*0x24f0*/
{
if ( n2_2 == 2 ) /*0x2503*/
return 0; /*0x2503*/
if ( (unsigned __int8)++n2_2 < 3u ) /*0x250c*/
continue; /*0x250c*/
}
goto LABEL_28; /*0x250c*/
}
}
// sub_2638 (0x2638)
signed __int64 sub_2638(int a1)
{
signed __int64 Result; // rax __int64 v2; // rcx __int64 n12; // rdx __int64 v4; // rcx unsigned int v5; // [rsp+38h] [rbp+10h] BYREF v5 = 0; /*0x2640*/
Result = sub_1F90(a1, &v5); /*0x264a*/
if ( Result >= 0 ) /*0x2652*/
{
if ( v5 ) /*0x265e*/
*(_DWORD *)(qword_4A20 + 8) = v5; /*0x2667*/
*(_WORD *)(qword_4A20 + 6) = 17; /*0x2678*/
sub_1DF8(1, 0); /*0x267e*/
Result = 28; /*0x268c*/
n12 = 12; /*0x2692*/
if ( (_BYTE)n24608_0 == 31 ) /*0x269e*/
Result = 12; /*0x269e*/
if ( ((unsigned __int8)Result & *(_BYTE *)(qword_4A20 + 16)) != 0 ) /*0x26a3*/
{
LOBYTE(n12) = 1; /*0x26a5*/
LOBYTE(v2) = 1; /*0x26a7*/
sub_1DF8(v2, n12); /*0x26a9*/
*(_BYTE *)(qword_4A20 + 16) = 0; /*0x26b5*/
*(_DWORD *)(qword_4A20 + 8) = v5; /*0x26c4*/
Result = 2048; /*0x26d2*/
if ( (*(_WORD *)(qword_4A20 + 4) & 0x800) == 0 ) /*0x26da*/
{
LOBYTE(v4) = 1; /*0x26e8*/
*(_WORD *)(qword_4A20 + 6) = 15; /*0x26ea*/
sub_1DF8(v4, 0); /*0x26f0*/
return sub_1E60(); /*0x26f5*/
}
}
}
return Result; /*0x26fa*/
}
// sub_2784 (0x2784)
__int64 sub_2784(__int64 a1)
{
__int64 ( **v2)(); // rbx char v3; // al v2 = off_4320; /*0x2791*/
do /*0x27b2*/
{
if ( !*v2 ) /*0x2798*/
break; /*0x279e*/
v3 = ((__int64 ( *)(__int64, __int64 *))*v2++)(a1, &qword_4C28); /*0x27aa*/
}
while ( !v3 ); /*0x27b2*/
return 0; /*0x27bb*/
}
// sub_2BC0 (0x2BC0)
char sub_2BC0(__int64 a1, __int64 *a2)
{
const char *SST_25LF040; // rdx __int64 v5; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x2bd4*/
return 0; /*0x2bdb*/
if ( (unsigned __int16)n24608 == 17599 ) /*0x2bf0*/
{
n0x1000000 = 0x80000; /*0x2c0c*/
SST_25LF040 = "SST 25LF040"; /*0x2c16*/
}
else
{
if ( (unsigned __int16)n24608 != 32959 ) /*0x2bf7*/
return 0; /*0x2bdf*/
n0x1000000 = 0x100000; /*0x2bf9*/
SST_25LF040 = "SST 25LF080"; /*0x2c03*/
}
sub_3A00(&unk_4C40, SST_25LF040, 11); /*0x2c2d*/
*a2 = (__int64)off_4A30; /*0x2c46*/
sub_3A00(&unk_4A88, &unk_4B20, 24); /*0x2c50*/
n24608_0 = n24608; /*0x2c5b*/
v5 = *a2; /*0x2c61*/
n24608_1 = n24608; /*0x2c64*/
*(_DWORD *)(v5 + 72) = dword_4B30; /*0x2c71*/
*(_DWORD *)(*a2 + 76) = dword_4B34; /*0x2c7d*/
*(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x2c83*/
return 1; /*0x2c8e*/
}
// sub_2C94 (0x2C94)
char sub_2C94(__int64 a1, __int64 *a2)
{
const char *ADESTO_AT25SF641; // rdx __int64 n17; // r8 __int64 v6; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x2ca8*/
return 0; /*0x2cb1*/
switch ( (unsigned __int16)n24608 ) /*0x2cc6*/
{
case 0x321Fu: /*0x2cc6*/
ADESTO_AT25SF641 = "ADESTO AT25SF641"; /*0x2dbe*/
goto LABEL_20; /*0x2dbe*/
case 0x421Fu: /*0x2cc6*/
n0x1000000 = 0x1000000; /*0x2d95*/
ADESTO_AT25SF641 = "ADESTO AT25SL128A"; /*0x2d9f*/
byte_4AE4 = 0; /*0x2da6*/
n17 = 17; /*0x2dac*/
n4096_0 = 4096; /*0x2db2*/
goto LABEL_22; /*0x2dbc*/
case 0x431Fu: /*0x2cc6*/
ADESTO_AT25SF641 = "ADESTO AT25SL641"; /*0x2d8c*/
LABEL_20:
n17 = 16; /*0x2dc5*/
n4096_0 = 4096; /*0x2dcb*/
byte_4AE4 = 0; /*0x2dd5*/
goto LABEL_21; /*0x2dd5*/
case 0x441Fu: /*0x2cc6*/
n0x1000000 = 0x80000; /*0x2d73*/
ADESTO_AT25SF641 = "ATMEL 26DF041/25DF041"; /*0x2d7d*/
n17 = 21; /*0x2d84*/
goto LABEL_22; /*0x2d8a*/
case 0x451Fu: /*0x2cc6*/
n0x1000000 = 0x100000; /*0x2d5a*/
ADESTO_AT25SF641 = "ATMEL 26DF081/25DF081"; /*0x2d64*/
n17 = 21; /*0x2d6b*/
goto LABEL_22; /*0x2d71*/
case 0x461Fu: /*0x2cc6*/
goto LABEL_12; /*0x2cf9*/
case 0x471Fu: /*0x2cc6*/
n0x1000000 = 0x400000; /*0x2d3e*/
ADESTO_AT25SF641 = "ATMEL 26DF321/25DF321"; /*0x2d48*/
n17 = 21; /*0x2d4f*/
goto LABEL_22; /*0x2d55*/
case 0x481Fu: /*0x2cc6*/
n17 = 21; /*0x2d2c*/
ADESTO_AT25SF641 = "ATMEL 26DF641/25DF641"; /*0x2d32*/
LABEL_21:
n0x1000000 = 0x800000; /*0x2ddb*/
goto LABEL_22; /*0x2ddb*/
}
if ( (unsigned __int16)n24608 != 34335 ) /*0x2d0e*/
return 0; /*0x2cb5*/
LABEL_12:
n0x1000000 = 0x200000; /*0x2d10*/
ADESTO_AT25SF641 = "ATMEL 26DF161/25DQ161"; /*0x2d1a*/
n17 = 21; /*0x2d21*/
LABEL_22:
sub_3A00(&unk_4C40, ADESTO_AT25SF641, n17); /*0x2de5*/
*a2 = (__int64)off_4A30; /*0x2e08*/
sub_3A00(&unk_4A88, &unk_4AD8, 24); /*0x2e12*/
n24608_0 = n24608; /*0x2e1d*/
v6 = *a2; /*0x2e23*/
n24608_1 = n24608; /*0x2e26*/
*(_DWORD *)(v6 + 72) = dword_4AE8; /*0x2e33*/
*(_DWORD *)(*a2 + 76) = n4096_0; /*0x2e3f*/
*(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x2e4a*/
qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x2e57*/
sub_20C8(); /*0x2e5e*/
sub_2638(4278190080LL); /*0x2e68*/
return 1; /*0x2e74*/
}
// sub_2E7C (0x2E7C)
__int64 sub_2E7C(unsigned int a1)
{
unsigned int n23; // ecx n23 = HIWORD(a1); /*0x2e7c*/
if ( (unsigned __int8)n23 <= 0x18u ) /*0x2e85*/
{
switch ( (unsigned __int8)n23 ) /*0x2e87*/
{
case 0x18u: /*0x2e87*/
return 0x1000000; /*0x2f08*/
case 0x10u: /*0x2e87*/
return 0x10000; /*0x2eda*/
case 0x11u: /*0x2e87*/
return 0x20000; /*0x2ed4*/
case 0x12u: /*0x2e87*/
return 0x40000; /*0x2ece*/
case 0x13u: /*0x2e87*/
return 0x80000; /*0x2ec8*/
case 0x14u: /*0x2e87*/
return 0x100000; /*0x2ec2*/
case 0x15u: /*0x2e87*/
return 0x200000; /*0x2ebc*/
}
if ( (unsigned __int8)n23 != 22 ) /*0x2eaa*/
{
if ( (unsigned __int8)n23 == 23 ) /*0x2eaf*/
return 0x800000; /*0x2eb6*/
return 0x1000000; /*0x2eaf*/
}
return 0x400000; /*0x2eaa*/
}
if ( (unsigned __int8)n23 != 25 ) /*0x2ede*/
{
switch ( (unsigned __int8)n23 ) /*0x2ee8*/
{
case 0x1Au: /*0x2ee8*/
case 0x20u: /*0x2ee8*/
return 0x4000000; /*0x2f1a*/
case 0x21u: /*0x2ee8*/
return 0x8000000; /*0x2f14*/
case 0x36u: /*0x2ee8*/
return 0x400000; /*0x2f0e*/
case 0x37u: /*0x2ee8*/
return 0x800000; /*0x2ef7*/
}
if ( (unsigned __int8)n23 != 57 ) /*0x2efc*/
return 0x1000000; /*0x2efc*/
}
return 0x2000000; /*0x2eb6*/
}
// sub_2FD4 (0x2FD4)
char sub_2FD4(__int64 a1, __int64 *a2)
{
const char *XMC_25QH_Series; // rdx __int64 n15; // r8 int n0x40000; // r8d bool v7; // zf __int64 v8; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x2fe8*/
return 0; /*0x2fef*/
if ( (unsigned __int16)n24608 > 0x40C8u ) /*0x3008*/
{
if ( (unsigned __int16)n24608 <= 0x7020u ) /*0x336b*/
{
if ( (unsigned __int16)n24608 != 28704 ) /*0x3371*/
{
if ( (unsigned __int16)n24608 <= 0x6020u ) /*0x337e*/
{
if ( (unsigned __int16)n24608 == 24608 ) /*0x3384*/
{
n4096 = 4096; /*0x3424*/
n32 = 32; /*0x342e*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x343a*/
XMC_25QH_Series = "XMC 25QH Series"; /*0x3440*/
n15 = 15; /*0x3447*/
goto LABEL_92; /*0x344d*/
}
if ( (unsigned __int16)n24608 == 16623 ) /*0x3390*/
goto LABEL_75; /*0x3390*/
if ( (unsigned __int16)n24608 != 16780 ) /*0x339c*/
{
if ( (unsigned __int16)n24608 != 20719 ) /*0x33a4*/
{
if ( (unsigned __int16)n24608 == 24258 ) /*0x33b0*/
goto LABEL_14; /*0x33b0*/
if ( (unsigned __int16)n24608 == 24577 ) /*0x33bc*/
{
n4096 = 4096; /*0x33c4*/
n32 = 32; /*0x33ce*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x33da*/
XMC_25QH_Series = "Spansion 25FL(L) Series"; /*0x33e0*/
n15 = 23; /*0x33e7*/
goto LABEL_92; /*0x33ed*/
}
return 0; /*0x2ff3*/
}
goto LABEL_75; /*0x33a4*/
}
goto LABEL_56; /*0x339c*/
}
if ( (unsigned __int16)n24608 == 24733 ) /*0x3458*/
{
n4096 = 4096; /*0x34d6*/
n32 = 32; /*0x34e0*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x34ec*/
XMC_25QH_Series = "ISSI 25LP Series"; /*0x34f2*/
n15 = 16; /*0x34f9*/
goto LABEL_92; /*0x34ff*/
}
if ( (unsigned __int16)n24608 != 24776 ) /*0x345d*/
{
if ( (unsigned __int16)n24608 != 24815 ) /*0x3462*/
{
if ( (unsigned __int16)n24608 != 28700 ) /*0x346e*/
return 0; /*0x346e*/
LABEL_62:
n4096 = 4096; /*0x3474*/
n32 = 32; /*0x3480*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x348c*/
XMC_25QH_Series = "EON 25F/Q/S/QH Series"; /*0x3492*/
n15 = 21; /*0x3499*/
goto LABEL_92; /*0x349f*/
}
goto LABEL_75; /*0x3462*/
}
LABEL_63:
n4096 = 4096; /*0x34a4*/
n32 = 32; /*0x34b0*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x34bc*/
XMC_25QH_Series = "GigaDevice 25Q Series"; /*0x34c2*/
n15 = 21; /*0x34c9*/
goto LABEL_92; /*0x34cf*/
}
LABEL_73:
n4096 = 4096; /*0x3579*/
n32 = 32; /*0x3585*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3591*/
XMC_25QH_Series = "STM/Micron/Numonyx 25PF/PX Series"; /*0x3597*/
n15 = 33; /*0x359e*/
goto LABEL_92; /*0x35a4*/
}
if ( (unsigned __int16)n24608 <= 0x80EFu ) /*0x350b*/
{
switch ( (unsigned __int16)n24608 ) /*0x3511*/
{
case 0x80EFu: /*0x3511*/
goto LABEL_75; /*0x3511*/
case 0x709Du: /*0x3511*/
n4096 = 4096; /*0x35ab*/
n32 = 32; /*0x35b5*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x35c1*/
XMC_25QH_Series = "ISSI 25WP Series"; /*0x35c7*/
n15 = 16; /*0x35ce*/
goto LABEL_92; /*0x35d4*/
case 0x70EFu: /*0x3511*/
goto LABEL_75; /*0x3526*/
}
if ( (unsigned __int16)n24608 != 28960 ) /*0x352f*/
{
if ( (unsigned __int16)n24608 != 29167 ) /*0x3537*/
{
if ( (unsigned __int16)n24608 == 32800 ) /*0x3543*/
{
n4096 = 256; /*0x354b*/
n32 = -37; /*0x3555*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3561*/
XMC_25QH_Series = "STM/Numonyx 25PE Series"; /*0x3567*/
n15 = 23; /*0x356e*/
goto LABEL_92; /*0x3574*/
}
return 0; /*0x3543*/
}
goto LABEL_75; /*0x3537*/
}
goto LABEL_73; /*0x352f*/
}
if ( (unsigned __int16)n24608 != 35209 ) /*0x360f*/
{
if ( (unsigned __int16)n24608 == 40319 ) /*0x3617*/
{
n4096 = 4096; /*0x365c*/
n32 = -41; /*0x3666*/
n0x1000000 = sub_2F24((unsigned int)n24608); /*0x3672*/
XMC_25QH_Series = "PMC 25LV/LQ Series"; /*0x3678*/
n15 = 18; /*0x367f*/
goto LABEL_92; /*0x3685*/
}
if ( (((unsigned __int16)n24608 - 47648) & 0xFFFFFEFF) == 0 ) /*0x3624*/
{
n4096 = 4096; /*0x362c*/
n32 = 32; /*0x3636*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3642*/
XMC_25QH_Series = "Micron/Numonyx 25Q Series"; /*0x3648*/
n15 = 25; /*0x364f*/
goto LABEL_92; /*0x3655*/
}
return 0; /*0x3624*/
}
n4096 = 0x10000; /*0x3694*/
if ( BYTE2(n24608) != 17 ) /*0x369e*/
{
if ( BYTE2(n24608) == 18 ) /*0x36a3*/
goto LABEL_89; /*0x36a3*/
if ( BYTE2(n24608) == 19 ) /*0x36a8*/
goto LABEL_88; /*0x36a8*/
if ( BYTE2(n24608) != 21 ) /*0x36ad*/
{
if ( BYTE2(n24608) != 22 ) /*0x36b2*/
{
if ( BYTE2(n24608) != 23 ) /*0x36b7*/
{
n0x1000000 = 0x1000000; /*0x36b9*/
LABEL_91:
n15 = 24; /*0x36e7*/
XMC_25QH_Series = "Intel/Numonyx 25F160/320"; /*0x36ed*/
goto LABEL_92; /*0x36ed*/
}
LABEL_88:
n0x1000000 = 0x800000; /*0x36c5*/
goto LABEL_91; /*0x36cf*/
}
LABEL_89:
n0x1000000 = 0x400000; /*0x36d1*/
goto LABEL_91; /*0x36db*/
}
}
n0x1000000 = 0x200000; /*0x36dd*/
goto LABEL_91; /*0x36dd*/
}
if ( (unsigned __int16)n24608 == 16584 ) /*0x300e*/
goto LABEL_63; /*0x300e*/
if ( (unsigned __int16)n24608 > 0x3037u ) /*0x301b*/
{
if ( (unsigned __int16)n24608 <= 0x3820u ) /*0x31f0*/
{
if ( (unsigned __int16)n24608 == 14368 ) /*0x31f6*/
{
n4096 = 4096; /*0x3287*/
n32 = 32; /*0x3291*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x329d*/
XMC_25QH_Series = "XMC 25QU Series"; /*0x32a3*/
n15 = 15; /*0x32aa*/
goto LABEL_92; /*0x32b0*/
}
if ( (unsigned __int16)n24608 != 12527 ) /*0x3202*/
{
switch ( (unsigned __int16)n24608 ) /*0x320b*/
{
case 0x311Cu: /*0x320b*/
goto LABEL_62; /*0x320b*/
case 0x32F8u: /*0x320b*/
n4096 = 4096; /*0x3257*/
n32 = 32; /*0x3261*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x326d*/
XMC_25QH_Series = "FIDELIX 25Q Series"; /*0x3273*/
n15 = 18; /*0x327a*/
goto LABEL_92; /*0x3280*/
case 0x377Fu: /*0x320b*/
n4096 = 4096; /*0x322e*/
n0x1000000 = sub_2F24((unsigned int)n24608); /*0x323d*/
XMC_25QH_Series = "AMIC 25L Series"; /*0x3243*/
n15 = 15; /*0x324a*/
goto LABEL_92; /*0x3250*/
}
v7 = (unsigned __int16)n24608 == 14364; /*0x3221*/
goto LABEL_25; /*0x3227*/
}
LABEL_75:
n4096 = 4096; /*0x35d9*/
n32 = 32; /*0x35e5*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x35f1*/
XMC_25QH_Series = "Winbond 25X/Q Series"; /*0x35f7*/
n15 = 20; /*0x35fe*/
goto LABEL_92; /*0x3604*/
}
if ( (unsigned __int16)n24608 == 16385 ) /*0x32bb*/
{
n4096 = 4096; /*0x3336*/
n32 = 32; /*0x3340*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x334c*/
XMC_25QH_Series = "Spansion 25FL(K) Series"; /*0x3352*/
n15 = 23; /*0x3359*/
goto LABEL_92; /*0x335f*/
}
if ( (unsigned __int16)n24608 == 16439 ) /*0x32c0*/
goto LABEL_44; /*0x32c0*/
if ( (unsigned __int16)n24608 != 16524 ) /*0x32c5*/
{
if ( (unsigned __int16)n24608 == 16545 ) /*0x32ce*/
{
n4096 = 4096; /*0x32d6*/
n32 = 32; /*0x32e0*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x32ec*/
XMC_25QH_Series = "Fudan FM25Q Series"; /*0x32f2*/
n15 = 18; /*0x32f9*/
goto LABEL_92; /*0x32ff*/
}
return 0; /*0x32ce*/
}
LABEL_56:
n4096 = 4096; /*0x33f2*/
n32 = 32; /*0x33fe*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x340a*/
XMC_25QH_Series = "ESMT 25L QA/PA Series"; /*0x3410*/
n15 = 21; /*0x3417*/
goto LABEL_92; /*0x341d*/
}
if ( (unsigned __int16)n24608 == 12343 ) /*0x3021*/
{
LABEL_44:
n4096 = 4096; /*0x3304*/
n32 = 32; /*0x3310*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x331c*/
XMC_25QH_Series = "AMIC 25L/LQ Series"; /*0x3322*/
n15 = 18; /*0x3329*/
goto LABEL_92; /*0x332f*/
}
if ( (unsigned __int16)n24608 > 0x24C2u ) /*0x302e*/
{
switch ( (unsigned __int16)n24608 ) /*0x3162*/
{
case 0x25C2u: /*0x3162*/
goto LABEL_14; /*0x3162*/
case 0x26BFu: /*0x3162*/
n4096 = 4096; /*0x31bb*/
byte_4AA9 = 1; /*0x31c5*/
n0x1000000 = sub_2F74((unsigned int)n24608); /*0x31d1*/
XMC_25QH_Series = "SST 26VF Series"; /*0x31d7*/
n15 = 15; /*0x31de*/
goto LABEL_92; /*0x31e4*/
case 0x28C2u: /*0x3162*/
n4096 = 4096; /*0x318b*/
n32 = 32; /*0x3195*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x31a1*/
XMC_25QH_Series = "MXIC 25R Series"; /*0x31a7*/
n15 = 15; /*0x31ae*/
goto LABEL_92; /*0x31b4*/
}
v7 = (unsigned __int16)n24608 == 12316; /*0x3178*/
LABEL_25:
if ( !v7 ) /*0x317e*/
return 0; /*0x317e*/
goto LABEL_62; /*0x317e*/
}
if ( (unsigned __int16)n24608 != 9410 ) /*0x3034*/
{
switch ( (unsigned __int16)n24608 ) /*0x303c*/
{
case 0x201u: /*0x303c*/
n4096 = 0x10000; /*0x3138*/
n0x1000000 = sub_2F24((unsigned int)n24608); /*0x3144*/
XMC_25QH_Series = "Spansion 25FL Series"; /*0x314a*/
n15 = 19; /*0x3151*/
goto LABEL_92; /*0x3157*/
case 0x2001u: /*0x303c*/
n4096 = 0x10000; /*0x310c*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3118*/
XMC_25QH_Series = "Spansion 25FL(P) Series"; /*0x311e*/
n15 = 23; /*0x3125*/
goto LABEL_92; /*0x312b*/
case 0x201Cu: /*0x303c*/
n32 = -40; /*0x30d7*/
n4096 = 0x10000; /*0x30e0*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x30ec*/
XMC_25QH_Series = "EON 25P Series"; /*0x30f2*/
n15 = 14; /*0x30f9*/
goto LABEL_92; /*0x30ff*/
case 0x2020u: /*0x303c*/
n32 = -40; /*0x3092*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x30a9*/
XMC_25QH_Series = "STM/Micron/Numonyx 25P Series"; /*0x30b4*/
if ( n0x1000000 == 0x1000000 ) /*0x30bb*/
n0x40000 = 0x40000; /*0x30bb*/
n4096 = n0x40000; /*0x30bf*/
n15 = 29; /*0x30c6*/
goto LABEL_92; /*0x30cc*/
}
if ( (unsigned __int16)n24608 != 8386 ) /*0x305e*/
return 0; /*0x305e*/
}
LABEL_14:
n4096 = 4096; /*0x3060*/
n32 = 32; /*0x306c*/
n0x1000000 = sub_2E7C((unsigned int)n24608); /*0x3078*/
XMC_25QH_Series = "MXIC 25L/U Series"; /*0x307e*/
n15 = 17; /*0x3085*/
LABEL_92:
sub_3A00(&unk_4C40, XMC_25QH_Series, n15); /*0x36f4*/
*a2 = (__int64)off_4A30; /*0x3717*/
sub_3A00(&unk_4A88, &unk_4B08, 24); /*0x3721*/
n24608_0 = n24608; /*0x372c*/
v8 = *a2; /*0x3732*/
n24608_1 = n24608; /*0x3735*/
*(_DWORD *)(v8 + 72) = dword_4B18; /*0x3742*/
*(_DWORD *)(*a2 + 76) = n4096; /*0x374e*/
*(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x3754*/
qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x3764*/
sub_20C8(); /*0x376b*/
sub_2638(4278190080LL); /*0x3775*/
return 1; /*0x3781*/
}
// sub_3788 (0x3788)
char sub_3788(__int64 a1, __int64 *a2)
{
unsigned int n0x800000; // eax int n256; // ecx __int64 n17; // r8 const char *ESMT_25L_T_Series; // rdx __int64 v8; // rcx if ( !(unsigned __int8)sub_216C(a1, &n24608) ) /*0x379c*/
return 0; /*0x37a3*/
if ( (unsigned __int16)n24608 == 8332 ) /*0x37ba*/
{
n0x800000 = sub_2E7C((unsigned int)n24608); /*0x380c*/
ESMT_25L_T_Series = "ESMT 25L T Series"; /*0x3811*/
goto LABEL_11; /*0x3811*/
}
if ( (unsigned __int16)n24608 == 8588 ) /*0x37c1*/
{
n0x800000 = sub_2E7C((unsigned int)n24608); /*0x37f7*/
byte_4AFC = 0; /*0x37fc*/
ESMT_25L_T_Series = "ESMT 25L B Series"; /*0x3803*/
LABEL_11:
n17 = 17; /*0x3818*/
goto LABEL_12; /*0x3818*/
}
if ( (unsigned __int16)n24608 != 9663 ) /*0x37c8*/
return 0; /*0x37a7*/
n0x800000 = sub_2F74(n24608); /*0x37ca*/
n256 = n256; /*0x37cf*/
n17 = 15; /*0x37df*/
if ( n0x800000 >= 0x800000 ) /*0x37e5*/
n256 = 256; /*0x37e5*/
ESMT_25L_T_Series = "SST 25VF Series"; /*0x37e8*/
n256 = n256; /*0x37ef*/
LABEL_12:
n0x1000000 = n0x800000; /*0x381e*/
sub_3A00(&unk_4C40, ESMT_25L_T_Series, n17); /*0x382e*/
*a2 = (__int64)off_4A30; /*0x3847*/
sub_3A00(&unk_4A88, &unk_4AF0, 24); /*0x3851*/
n24608_0 = n24608; /*0x385c*/
v8 = *a2; /*0x3862*/
n24608_1 = n24608; /*0x3865*/
*(_DWORD *)(v8 + 72) = n256; /*0x3872*/
*(_DWORD *)(*a2 + 76) = dword_4B04; /*0x387e*/
*(_QWORD *)(*a2 + 80) = &unk_4C40; /*0x3889*/
qword_4A20 = *(unsigned int *)sub_1CAC(1036304); /*0x3896*/
sub_20C8(); /*0x389d*/
sub_2638(4278190080LL); /*0x38a7*/
return 1; /*0x38b3*/
}
// sub_3960 (0x3960)
__int64 sub_3960(unsigned int _RAX_1, _DWORD *a2, _DWORD *a3, _DWORD *a4, _DWORD *a5)
{
__int64 result; // rax _RAX = _RAX_1; /*0x396f*/
__asm { cpuid } /*0x3974*/
if ( a2 ) /*0x3979*/
*a2 = result; /*0x397b*/
if ( a3 ) /*0x3981*/
*a3 = _RBX; /*0x3983*/
if ( a4 ) /*0x3989*/
*a4 = _RCX; /*0x398b*/
if ( a5 ) /*0x3991*/
*a5 = _RDX; /*0x3993*/
return result; /*0x3996*/
}
// sub_3A00 (0x3A00)
char *sub_3A00(char *dst_1, char *src, unsigned __int64 n8)
{
char *dst; // rdi unsigned __int64 count_2; // rcx char v10; // dl unsigned __int64 n8_1; // rax unsigned __int64 count; // rax __int64 count_1; // rbx char count_3; // al unsigned __int64 Ptr; // rcx unsigned __int64 count_4; // rax __asm { pushf } /*0x3a03*/
dst = dst_1; /*0x3a09*/
count_2 = n8; /*0x3a0c*/
v10 = 0; /*0x3a0f*/
n8_1 = src - dst; /*0x3a14*/
if ( src < dst ) /*0x3a17*/
{
n8_1 = dst - src; /*0x3a1d*/
if ( &src[n8] >= dst ) /*0x3a23*/
{
src += n8; /*0x3a25*/
dst += n8; /*0x3a28*/
v10 = 1; /*0x3a2c*/
}
}
if ( n8 < 8 || n8_1 < 8 ) /*0x3a39*/
goto LABEL_19; /*0x3a39*/
count = (unsigned __int8)src & 7; /*0x3a41*/
count_1 = (unsigned __int8)dst & 7; /*0x3a45*/
if ( v10 ) /*0x3a4b*/
{
--src; /*0x3a4d*/
--dst; /*0x3a50*/
}
if ( count == count_1 && count ) /*0x3a5b*/
{
if ( !v10 ) /*0x3a5f*/
count = 8 - count; /*0x3a64*/
qmemcpy(dst, src, count); /*0x3a6d*/
src += count; /*0x3a6d*/
dst += count; /*0x3a6d*/
count_2 = n8 - count; /*0x3a6f*/
}
if ( v10 ) /*0x3a74*/
{
src -= 7; /*0x3a76*/
dst -= 7; /*0x3a7a*/
}
count_3 = count_2; /*0x3a7e*/
Ptr = count_2 >> 3; /*0x3a81*/
qmemcpy(dst, src, 8 *Ptr); /*0x3a85*/
src += 8 *Ptr; /*0x3a85*/
dst += 8 *Ptr; /*0x3a85*/
count_4 = count_3 & 7; /*0x3a88*/
if ( count_4 ) /*0x3a8c*/
{
if ( v10 ) /*0x3a90*/
{
src += 8; /*0x3a92*/
dst += 8; /*0x3a96*/
}
count_2 = count_4; /*0x3a9a*/
LABEL_19:
if ( v10 ) /*0x3a9f*/
{
--src; /*0x3aa1*/
--dst; /*0x3aa4*/
}
qmemcpy(dst, src, count_2); /*0x3aa7*/
}
__asm { popf } /*0x3aa9*/
return dst_1; /*0x3aac*/
}