MiInitializeEnclaveMetadataPage
NTSTATUS __stdcall MiInitializeEnclaveMetadataPage(){
UINT64 v0;
_DWORD *Pool;
_KTBFLUSH_TYPE v2;
_QWORD *v3;
_DWORD *v4;
INT64 v5;
UINT64 v6;
__int64 v7;
__int64 v8;
int v9;
__int64 v10;
NTSTATUS result;
v0 = (UINT64)MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
if( v0 )
{
Pool = MiAllocatePool(64i64, 0x50ui64, 0x4D424D45ui64);
v3 = Pool;
if( Pool )
{
*Pool = 512;
v4 = Pool + 4;
v3[1] = v4;
*v4 |= 1u;
LODWORD(v5) = MiGetEnclavePage(&Irp, 0i64);
v6 = v5;
if( v5 != -1 )
{
LODWORD(v7) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v0, v5, 3221225476i64);
v8 = v7;
LOBYTE(v9) = MiPteInShadowRange(v0);
if( v9 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
v8 |= 0x8000000000000000ui64;
*(_QWORD *)v0 = v8;
v10 = (__int64)((v0 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( KeCreateEnclaveMetadataPage() >= 0 )
{
*(&stru_140C4DB30 + 533) = 0i64;
result = 1;
*(&stru_140C4DB30 + 531) = v10;
*(&stru_140C4DB30 + 532) = v3;
*(&stru_140C4DB30 + 1068) = 0;
return result;
}
}
ExFreePoolWithTag(v3, 0);
if( v6 != -1i64 )
MiReturnEnclavePage(v6);
}
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (_MMPTE *)v0, 1ui64, v2);
}
return 0;
}Referenced by:
MiCreateEnclaveRegions