VslpIumPhase0Initialize
NTSTATUS __stdcall VslpIumPhase0Initialize(INT64 a1){
__int64 v1;
__int64 v3;
INT64 v4;
_KIDTENTRY64 *IdtBase;
INT64 v6;
INT64 v7;
int v8;
NTSTATUS v9;
__int64 v11;
int v12;
unsigned int v13;
int v14;
int v15;
INT64 v16[14];
v1 = *(_QWORD *)(a1 + 240);
v13 = 0;
v12 = 0;
if( (*(_DWORD *)(v1 + 132) & 0x200) != 0 )
{
if( !HvlQueryVsmConnection(0i64) )
KeBugCheckEx(0x6Fu, (PVOID)0xFFFFFFFFC0000001i64, 0i64, 0i64, (PVOID)(v3 & v11));
memset(v16, 0i64, 0x68u);
LODWORD(v16[1]) = 167772168;
LODWORD(v4) = MmGetPhysicalAddress((UINT64)&KUSER_SHARED_DATA);
v16[2] = v4;
VslpIumPhase0InitializeNtKd(a1, (INT64)v16);
IdtBase = KeGetPcr()->IdtBase;
LODWORD(v6) = MmGetPhysicalAddress((UINT64)KeGetPcr()->NtTib.ExceptionList);
v16[8] = v6;
LODWORD(v7) = MmGetPhysicalAddress((UINT64)IdtBase);
v16[10] = v7;
MmSetPageProtection(IdtBase, 0x1000ui64, 2ui64);
((void(__fastcall *)(__int64, __int64, INT64 *, int *))off_140C00A68[0])(45i64, 8i64, &v16[9], &v12);
KUSER_SHARED_DATA.EnclaveFeatureMask[0] |= 0x100u;
if( KiKvaShadowMode )
HIDWORD(v16[1]) |= 1u;
KeQueryKvaShadowInformation(&v13, 4u, &v12);
v8 = HIDWORD(v16[1]);
if( ((v13 >> 4) & 1) != 0 )
{
v8 = HIDWORD(v16[1]) | 2;
HIDWORD(v16[1]) |= 2u;
}
if( BBTBuffer )
{
v8 |= 4u;
HIDWORD(v16[1]) = v8;
}
if( ((v13 >> 4) & 1) != 0 && KiImplementedPhysicalBits > 0 )
{
v8 |= 8u;
HIDWORD(v16[1]) = v8;
}
if( KiDisableTsx )
HIDWORD(v16[1]) = v8 | 0x10;
v15 = VslpNestedPageProtectionFlags & 2;
v16[6] = (INT64)KeFeatureBits;
v16[7] = (INT64)KeFeatureBits2;
v9 = VslpEnterIumSecureMode(2u, 208, 0i64, (INT64)v16);
if( v9 < 0 )
KeBugCheckEx(0x6Fu, (PVOID)v9, 0i64, (PVOID)1, 0i64);
if( LODWORD(v16[2]) != 167772168 )
KeBugCheckEx(0x6Fu, (PVOID)0xFFFFFFFFC0000059i64, 0i64, (PVOID)2, 0i64);
v14 = 0;
*(&stru_140C452E0 + 954) = (char *)&stru_140C452E0 + 7624;
*(&stru_140C452E0 + 953) = (char *)&stru_140C452E0 + 7624;
*(&stru_140C452E0 + 1905) = HIDWORD(v16[2]);
*(&stru_140C452E0 + 1910) = HIDWORD(v16[2]);
*(&stru_140C452E0 + 7616) = 5;
*(&stru_140C452E0 + 7618) = 8;
VslVsmEnabled = 1;
((void(__fastcall *)(__int64, __int64, int *))off_140C00A70[0])(16i64, 4i64, &v14);
LODWORD(v1) = ((__int64(__fastcall *)(__int64, __int64, int *))off_140C00A70[0])(18i64, 4i64, &v15);
}
return v1;
}Referenced by:
HvlPhase1Initialize