HvlEnlightenProcessor
VOID __fastcall HvlEnlightenProcessor(CHAR a1, INT64 a2, INT64 a3, INT64 *a4){
struct _KPRCB *CurrentPrcb;
int v5;
unsigned int v6;
char v7;
unsigned __int64 v8;
unsigned __int64 v9;
__int64 v10;
UINT64 v11;
char v12;
WCHAR *LpcbByLpIndex;
unsigned int v14;
unsigned int LpIndexFromProcessorIndex;
__int64 v16;
unsigned __int64 v17;
__int64 v18;
unsigned __int64 v19;
__int64 v20;
unsigned __int64 v21;
__int64 v22;
v20 = 0i64;
v22 = 0i64;
if( (_BYTE)HvlHypervisorConnected && (!a1 || (HvlpFlags & 2) == 0) )
{
CurrentPrcb = KeGetCurrentPrcb();
if( !a1 )
{
HvlpGetRegister64(589827, &v20);
v5 = v20;
v6 = (unsigned int)v20 >> 6;
v7 = v20 & 0x3F;
HvlpVirtualProcessorMapping[2 * *((unsigned int *)CurrentPrcb + 9)] = (unsigned int)v20 >> 6;
HvlpVirtualProcessorMapping[2 * *((unsigned int *)CurrentPrcb + 9) + 1] = v7;
if( v5 != *((_DWORD *)CurrentPrcb + 9) )
HvlpVirtualProcessorsIdentityMapped = 0;
if( v6 < 0x10 )
{
if( v6 > (((unsigned int)HvlpFlags >> 8) & 0xF) )
LODWORD(HvlpFlags) = ((unsigned __int16)HvlpFlags ^ (unsigned __int16)((_WORD)v6 << 8)) & 0xF00 ^ HvlpFlags;
}
else
{
HvlEnlightenments &= ~0x80u;
HvlpEnlightenments &= ~0x80u;
}
}
if( (HvlpFlags & 0x80000) != 0 )
{
v21 = 0i64;
if( (HvlpFlags & 2) != 0 )
{
HvlpGetRegister64(589843, &v21);
v8 = v21;
v9 = v21 & 0xFFFFFFFFFFFFF000ui64;
if( *((_DWORD *)CurrentPrcb + 9) )
MmMapIoSpaceEx((_LARGE_INTEGER)v9, 0x1000ui64, 4ui64);
else
v10 = ((__int64(__fastcall *)(unsigned __int64, __int64, __int64))qword_140C00720)(v9, 1i64, 4i64);
*((_QWORD *)CurrentPrcb + 4209) = v10;
}
else
{
v8 = MmGetPhysicalAddress(*((PVOID *)CurrentPrcb + 4209)).QuadPart & 0xFFFFFFFFFFFFF000ui64;
}
HvlpSetRegister64(589843, v8 | 1);
}
HvlpSetupSchedulerAssist((INT64)CurrentPrcb);
v12 = HvlpFlags;
LpcbByLpIndex = 0i64;
v14 = ((unsigned int)HvlpFlags >> 1) & 1;
if( v14 )
{
LpIndexFromProcessorIndex = HvlGetLpIndexFromProcessorIndex(*((unsigned int *)CurrentPrcb + 9));
LpcbByLpIndex = HvlpGetLpcbByLpIndex(LpIndexFromProcessorIndex);
}
if( v14 && (v12 & 0x20) != 0 )
{
HvlpGetRegister64(655379, &v22);
v16 = v22;
if( (v22 & 1) == 0 )
{
v16 = v22 | 1;
HvlpSetRegister64(655379, v22 | 1);
}
v17 = v16 & 0xFFFFFFFFFFFFF000ui64;
if( *((_DWORD *)CurrentPrcb + 9) )
MmMapIoSpaceEx((_LARGE_INTEGER)v17, 0x1000ui64, 4ui64);
else
v18 = ((__int64(__fastcall *)(unsigned __int64, __int64))qword_140C00720)(v17, 1i64);
*((_QWORD *)LpcbByLpIndex + 5) = v18;
}
if( (HvlpFlags & 2) != 0 && (HvlpFlags & 0x20) != 0 )
{
v19 = ((unsigned __int64)((HvlpFlags & 0x10) == 0) << 17) | 0x30;
HvlpSetRegister64(655360, v19);
HvlpSetRegister64(655364, v19);
HvlSharedIsr();
}
if( (HvlpFlags & 2) != 0 )
{
if( *((_DWORD *)CurrentPrcb + 9) )
HvlpDiscoverTopologyLocal(
v11,
*((unsigned int *)LpcbByLpIndex + 2),
(UINT64 *)LpcbByLpIndex + 2,
(UINT64 *)(LpcbByLpIndex + 10));
}
}
}Referenced by:
HvlpInitializeBootProcessor
KiInitializeKernel
PopHandleNextState