__int64 __fastcall CheckVpdAndUpdateToBmc(__int64 a1, __int64 a2, __int64 a3, char a4)
{
double v4; // xmm3_8
__int64 v5; // rdi
__int64 v6; // r14
__int64 v7; // r15
char v8; // r12
unsigned __int64 v9; // r13
__int64 v10; // rbx
__int64 i_1; // rax
__int64 i_4; // rbx
__int64 v13; // rbx
__int64 v14; // rbx
__int64 i_5; // rbx
__int64 v16; // rdx
unsigned __int16 n0xFF_1; // bx
char v18; // al
unsigned __int16 n0xFF; // r14
_BYTE *v20; // rdi
char n0xFF_2; // cl
__int64 v22; // r9
__int64 v23; // rdx
__int64 v24; // rdx
char v25; // al
unsigned __int16 n0xFF_3; // di
unsigned __int16 i_7; // cx
int i_2; // r15d
int i_8; // edi
unsigned __int8 v30; // r12
__int64 v31; // rbx
__int64 v32; // r14
unsigned __int16 v33; // bx
__int64 v34; // rdx
__int64 v35; // r9
unsigned __int16 i; // cx
int i_3; // r14d
unsigned __int8 v38; // r15
__int64 v39; // rbx
__int64 v40; // rdi
unsigned __int16 v41; // bx
__int64 v42; // rdx
__int64 v43; // r9
int v44; // [rsp+28h] [rbp-D8h]
_WORD v45[2]; // [rsp+44h] [rbp-BCh] BYREF
int i_6; // [rsp+48h] [rbp-B8h]
__int64 v47; // [rsp+50h] [rbp-B0h] BYREF
__int64 v48; // [rsp+58h] [rbp-A8h] BYREF
unsigned __int64 v49; // [rsp+60h] [rbp-A0h] BYREF
_BYTE v50[16]; // [rsp+70h] [rbp-90h] BYREF
__int64 v51; // [rsp+80h] [rbp-80h]
_BYTE v52[64]; // [rsp+88h] [rbp-78h] BYREF
_BYTE v53[8]; // [rsp+C8h] [rbp-38h] BYREF
__int64 v54; // [rsp+D0h] [rbp-30h] BYREF
__int64 v55; // [rsp+D8h] [rbp-28h] BYREF
_QWORD v56[3]; // [rsp+E0h] [rbp-20h] BYREF
char v57; // [rsp+FBh] [rbp-5h]
_BYTE v58[65600]; // [rsp+100h] [rbp+0h] BYREF
v5 = a3; /*0x34b5*/
v6 = a2; /*0x34b8*/
v7 = a1; /*0x34bb*/
v8 = a4; /*0x34ca*/
ZeroMem(v58, 0x10000); /*0x34cd*/
v9 = 0; /*0x34ef*/
v10 = (*(__int64 (__fastcall **)(void *, _QWORD, __int64 *))(qword_96A8 + 320))(&unk_9460, 0, &qword_9690); /*0x34f2*/
if ( v10 >= 0 )
{
i_1 = (*(__int64 (__fastcall **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(qword_96A8 + 312))( /*0x3554*/
2,
&unk_9400,
0,
&v49,
&v47);
i_4 = i_1; /*0x355a*/
if ( i_1 >= 0 )
{
if ( v49 )
{
do
{
ZeroMem(v50, 140); /*0x35aa*/
v57 = 1; /*0x35c7*/
v13 = (*(__int64 (__fastcall **)(_QWORD, void *, __int64 *, _QWORD, _QWORD, int))(qword_96A8 + 280))( /*0x35e5*/
*(_QWORD *)(v47 + 8 * v9),
&unk_9400,
&v48,
0,
0,
2);
if ( v13 >= 0 )
{
v14 = (*(__int64 (__fastcall **)(__int64, _QWORD, _QWORD, __int64, _BYTE *))(v48 + 48))(v48, 0, 0, 64, v52); /*0x3668*/
if ( v14 >= 0 )
{
v51 = *(_QWORD *)(v47 + 8 * v9); /*0x36bf*/
i_1 = (*(__int64 (__fastcall **)(__int64, _BYTE *, __int64 *, __int64 *, _QWORD *))(v48 + 112))( /*0x36c6*/
v48,
v53,
&v54,
&v55,
v56);
i_5 = i_1; /*0x36c9*/
if ( i_1 >= 0 )
{
if ( v54 == v7 && v55 == v6 && v56[0] == v5 )
{
(*(void (__fastcall **)(_BYTE *, __int64, _QWORD))(qword_96D8 + 360))(v58, 0x10000, 0); /*0x3728*/
LOBYTE(v16) = -126; /*0x3733*/
n0xFF_1 = 0; /*0x3743*/
if ( CheckDeviceVpd(v50, v16, v58, v45) >= 0 )
{
v18 = DebugTraceEnabled(); /*0x374e*/
n0xFF = v45[0]; /*0x3753*/
if ( v18 && (unsigned __int8)DebugLevelEnabled(2) )
DebugPrint(2, "CheckVpdAndUpdateToBmc: RDBG VPD type 0x82 , Data Length = %x\n", n0xFF);
if ( n0xFF ) /*0x3783*/
{
do /*0x37be*/
{
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x3795*/
DebugPrint(0x80000000LL, "%x ", (unsigned __int8)v58[n0xFF_1]); /*0x37b1*/
++n0xFF_1; /*0x37b6*/
}
while ( n0xFF_1 < n0xFF ); /*0x37be*/
v8 = a4; /*0x37c0*/
}
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x37d3*/
DebugPrint(0x80000000LL, "\n"); /*0x37e6*/
v20 = (_BYTE *)AllocatePool((unsigned __int8)(n0xFF + 5)); /*0x37f7*/
n0xFF_2 = n0xFF; /*0x37fa*/
*v20 = 11; /*0x3806*/
v20[1] = v8; /*0x3809*/
v20[3] = -126; /*0x380d*/
if ( n0xFF > 0xFFu ) /*0x381a*/
n0xFF_2 = -1; /*0x381a*/
v20[4] = n0xFF_2; /*0x381d*/
(*(void (__fastcall **)(_BYTE *, _BYTE *, _QWORD))(qword_96D8 + 352))(v20 + 5, v58, n0xFF); /*0x382b*/
LOBYTE(v22) = 87; /*0x3837*/
byte_9699 = 1; /*0x383a*/
LOBYTE(v23) = 46; /*0x384a*/
LOBYTE(v44) = n0xFF + 5; /*0x3864*/
(*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, _BYTE *, int, void *, char *))(qword_9690 + 16))( /*0x3870*/
qword_9690,
v23,
0,
v22,
v20,
v44,
&unk_9720,
&byte_9699);
(*(void (__fastcall **)(_BYTE *))(qword_96D8 + 72))(v20); /*0x387d*/
n0xFF_1 = 0; /*0x3880*/
}
(*(void (__fastcall **)(_BYTE *, __int64, _QWORD))(qword_96D8 + 360))(v58, 0x10000, 0); /*0x3895*/
LOBYTE(v24) = -112; /*0x38a0*/
i_1 = CheckDeviceVpd(v50, v24, v58, v45); /*0x38ab*/
if ( i_1 >= 0 )
{
v25 = DebugTraceEnabled(); /*0x38b9*/
n0xFF_3 = v45[0]; /*0x38be*/
if ( v25 && (unsigned __int8)DebugLevelEnabled(2) )
DebugPrint(2, "CheckVpdAndUpdateToBmc: RDBG VPD type 0x90/0x91 , Data Length = %x\n", n0xFF_3);
if ( n0xFF_3 ) /*0x38f3*/
{
do /*0x392d*/
{
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x3905*/
DebugPrint(0x80000000LL, "%x ", (unsigned __int8)v58[n0xFF_1]); /*0x3921*/
++n0xFF_1; /*0x3926*/
}
while ( n0xFF_1 < n0xFF_3 ); /*0x392d*/
v8 = a4; /*0x392f*/
}
i_1 = DebugTraceEnabled(); /*0x3936*/
if ( (_BYTE)i_1 ) /*0x393f*/
{
i_1 = DebugLevelEnabled(0x80000000LL); /*0x3944*/
if ( (_BYTE)i_1 ) /*0x394b*/
i_1 = DebugPrint(0x80000000LL, "\n"); /*0x3957*/
}
i_7 = 0; /*0x3960*/
i_2 = n0xFF_3 - 1; /*0x3963*/
i_6 = i_2; /*0x396b*/
if ( i_2 > 0 )
{
while ( v58[i_7] != 80 || v58[i_7 + 1] != 78 ) /*0x3988*/
{
i_1 = ++i_7; /*0x398d*/
if ( i_7 >= i_2 ) /*0x3993*/
goto LABEL_74; /*0x3993*/
}
i_8 = i_7; /*0x399b*/
v30 = v58[i_7 + 2] + 5; /*0x39a6*/
v31 = (unsigned int)i_7 + 2; /*0x39aa*/
v32 = AllocatePool(v30); /*0x39b5*/
*(_BYTE *)v32 = 11; /*0x39bb*/
*(_BYTE *)(v32 + 1) = a4; /*0x39c4*/
*(_WORD *)(v32 + 2) = 20048; /*0x39cc*/
*(_BYTE *)(v32 + 4) = v58[v31]; /*0x39da*/
(*(void (__fastcall **)(__int64, _BYTE *, _QWORD))(qword_96D8 + 352))( /*0x39ef*/
v32 + 5,
&v58[i_8 + 3],
(unsigned __int8)v58[v31]);
v33 = 0; /*0x39fb*/
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(2) )
DebugPrint(2, "CheckVpdAndUpdateToBmc: RDBG VPD PN Size = %x, IpmiVpdData= %a , \n", v30, v4);
if ( v30 ) /*0x3a2d*/
{
do /*0x3a66*/
{
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x3a3f*/
DebugPrint(0x80000000LL, "%x ", *(unsigned __int8 *)(v33 + v32)); /*0x3a5a*/
++v33; /*0x3a5f*/
}
while ( v33 < v30 ); /*0x3a66*/
i_2 = i_6; /*0x3a68*/
}
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x3a7b*/
DebugPrint(0x80000000LL, "\n"); /*0x3a8e*/
LOBYTE(v35) = 87; /*0x3a98*/
byte_9699 = 1; /*0x3a9b*/
LOBYTE(v34) = 46; /*0x3aab*/
LOBYTE(v44) = v30; /*0x3ac5*/
(*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, __int64, int, void *, char *))(qword_9690 + 16))( /*0x3ad2*/
qword_9690,
v34,
0,
v35,
v32,
v44,
&unk_9720,
&byte_9699);
i_1 = (*(__int64 (__fastcall **)(__int64))(qword_96D8 + 72))(v32); /*0x3adf*/
v8 = a4; /*0x3ae2*/
}
LABEL_74:
for ( i = 0; i < i_2; i_1 = ++i ) /*0x3af4*/
{
i_1 = i; /*0x3af6*/
if ( v58[i] == 83 && v58[i + 1] == 78 ) /*0x3b05*/
break; /*0x3b05*/
}
i_3 = i; /*0x3b12*/
if ( i != i_2 )
{
v38 = v58[i + 2] + 5; /*0x3b28*/
v39 = (unsigned int)i + 2; /*0x3b2c*/
v40 = AllocatePool(v38); /*0x3b3c*/
*(_BYTE *)v40 = 11; /*0x3b43*/
*(_BYTE *)(v40 + 1) = v8; /*0x3b46*/
*(_WORD *)(v40 + 2) = 20051; /*0x3b4a*/
*(_BYTE *)(v40 + 4) = v58[v39]; /*0x3b54*/
(*(void (__fastcall **)(__int64, _BYTE *, _QWORD))(qword_96D8 + 352))( /*0x3b6f*/
v40 + 5,
&v58[i_3 + 3],
(unsigned __int8)v58[v39]);
v41 = 0; /*0x3b7b*/
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(2) )
DebugPrint(2, "CheckVpdAndUpdateToBmc: RDBG VPD SN Size = %x, IpmiVpdData= %a , \n", v38, v4);
if ( v38 ) /*0x3bb1*/
{
do /*0x3bee*/
{
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x3bc6*/
DebugPrint(0x80000000LL, "%x ", *(unsigned __int8 *)(v41 + v40)); /*0x3be1*/
++v41; /*0x3be6*/
}
while ( v41 < v38 ); /*0x3bee*/
v8 = a4; /*0x3bf5*/
}
if ( (unsigned __int8)DebugTraceEnabled() && (unsigned __int8)DebugLevelEnabled(0x80000000LL) ) /*0x3c0a*/
DebugPrint(0x80000000LL, "\n"); /*0x3c1d*/
LOBYTE(v43) = 87; /*0x3c27*/
byte_9699 = 1; /*0x3c2a*/
LOBYTE(v42) = 46; /*0x3c3a*/
LOBYTE(v44) = v38; /*0x3c54*/
(*(void (__fastcall **)(__int64, __int64, _QWORD, __int64, __int64, int, void *, char *))(qword_9690 + 16))( /*0x3c61*/
qword_9690,
v42,
0,
v43,
v40,
v44,
&unk_9720,
&byte_9699);
i_1 = (*(__int64 (__fastcall **)(__int64))(qword_96D8 + 72))(v40); /*0x3c6e*/
}
v7 = a1; /*0x3c71*/
}
}
}
else
{
i_1 = DebugTraceEnabled(); /*0x36d1*/
if ( (_BYTE)i_1 )
{
i_1 = DebugLevelEnabled(0x80000000LL); /*0x36e1*/
if ( (_BYTE)i_1 )
i_1 = DebugPrint(0x80000000LL, "CheckVpdAndUpdateToBmc: error reading Pci Locattion = %r\n", i_5);
}
}
}
else
{
i_1 = DebugTraceEnabled(); /*0x3670*/
if ( (_BYTE)i_1 )
{
i_1 = DebugLevelEnabled(0x80000000LL); /*0x367c*/
if ( (_BYTE)i_1 )
i_1 = DebugPrint(0x80000000LL, "CheckVpdAndUpdateToBmc: error reading Pci Config space. Code=%r\n", v14);
}
}
}
else
{
i_1 = DebugTraceEnabled(); /*0x35ed*/
if ( (_BYTE)i_1 )
{
i_1 = DebugLevelEnabled(0x80000000LL); /*0x35f9*/
if ( (_BYTE)i_1 )
i_1 = DebugPrint(
0x80000000LL,
"CheckVpdAndUpdateToBmc: Error openning handle index %d. Code=%r\n",
v9,
v13);
}
}
v5 = a3; /*0x3619*/
++v9; /*0x3620*/
v6 = a2; /*0x3623*/
}
while ( v9 < v49 );
}
}
else
{
i_1 = DebugTraceEnabled(); /*0x3562*/
if ( (_BYTE)i_1 )
{
i_1 = DebugLevelEnabled(0x80000000LL); /*0x3576*/
if ( (_BYTE)i_1 )
return DebugPrint(0x80000000LL, "CheckVpdAndUpdateToBmc: unable to find any PCI devices. Code=%r\n", i_4);
}
}
}
else
{
i_1 = DebugTraceEnabled(); /*0x34fa*/
if ( (_BYTE)i_1 ) /*0x3501*/
{
i_1 = DebugLevelEnabled(64); /*0x350d*/
if ( (_BYTE)i_1 ) /*0x3514*/
return DebugPrint(64, "CheckVpdAndUpdateToBmc Locating IPMI Dxe Protocol Status - %r\n", v10); /*0x3526*/
}
}
return i_1; /*0x3635*/
}