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