HalpApicInitializeLocalUnit
UINT64 __stdcall HalpApicInitializeLocalUnit(PVOID BaseVa, PVOID EndVa, UINT64 LevelsNeeded){
int v3;
int v4;
int v5;
UINT64 result;
__int64 v8;
unsigned int v9;
__int64 v10;
unsigned int v11;
unsigned int v12;
__int64 v13;
unsigned int v14;
bool v15;
unsigned int *v16;
INT64 v17[3];
INT64 v18;
unsigned int v19;
unsigned int *v20;
LODWORD(v18) = 0;
v4 = v3;
LODWORD(v17[0]) = 0;
v5 = LevelsNeeded;
if( !HalpApicX2Mode && !HalpApicUsingMsrs )
{
if( !HalpLocalApicPhysical.QuadPart )
return 3221225486i64;
if( !HalpLocalApic )
{
HalpLocalApic = (UINT64)HalMapIoSpace(HalpLocalApicPhysical, 0x1000ui64, MmNonCached);
if( !HalpLocalApic )
return 3221225626i64;
}
}
result = HalpApicSetupRegisterAccess();
if( (result & 0x80000000) == 0i64 )
{
if( !*((_BYTE *)BaseVa + 27) && HalpApicIsCmciImplemented(&v18, v17) )
{
*((_DWORD *)BaseVa + 8) = v18;
*((_DWORD *)BaseVa + 9) = v17[0];
}
v8 = *((unsigned int *)BaseVa + 8);
v9 = v4 | 0x10000;
if( (_DWORD)v8 )
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(v8, v9);
v10 = *((unsigned int *)BaseVa + 9);
if( (_DWORD)v10 )
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(v10, v9);
HalpApicSetPriority(0i64, 0xFui64);
v11 = v5 | 0x100;
if( HalpApicDirectedEndOfInterruptModeEnabled
&& (((__int64(__fastcall *)(__int64))HalpApicRead)(48i64) & 0x1000000) != 0 )
{
v11 |= 0x1000u;
}
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(240i64, v11);
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(800i64, v4 | 0x30000u);
((void(__fastcall *)(__int64, __int64))HalpApicWrite)(992i64, 11i64);
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(880i64, v19);
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(832i64, v9);
v12 = ((__int64(__fastcall *)(__int64))HalpApicRead)(848i64);
v13 = v12;
LODWORD(v13) = v12 | 0x10000;
((void(__fastcall *)(__int64, __int64))HalpApicWrite)(848i64, v13);
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(848i64, v9);
((void(__fastcall *)(__int64, _QWORD))HalpApicWrite)(864i64, v4 | 0x18400u);
v14 = ((__int64(__fastcall *)(__int64))HalpApicRead)(32i64);
v15 = HalpApicX2Mode == 0;
v16 = v20;
*v20 = v14;
if( v15 )
*v16 = HIBYTE(v14);
if( *((_BYTE *)BaseVa + 27) )
return 0i64;
LODWORD(result) = HalpApicDescribeLocalLines(BaseVa);
if( (result & 0x80000000) == 0i64 )
{
*((_BYTE *)BaseVa + 27) = 1;
return 0i64;
}
}
return result;
}Referenced by:
No references.