MiCreateEnclaveRegions
NTSTATUS __stdcall MiCreateEnclaveRegions(_LOADER_PARAMETER_BLOCK *LoaderBlock){
_RTL_BALANCED_NODE *v2;
_LIST_ENTRY *p_MemoryDescriptorListHead;
__int64 v4;
_LIST_ENTRY *i;
UINT64 Blink;
UINT64 Flink;
_RTL_BALANCED_NODE *v9;
_RTL_BALANCED_NODE *Pool;
BOOL v11;
_QWORD *v12;
_QWORD *v13;
_MMPFN *v14;
UINT8 v15;
INT64 v16;
UINT64 v17;
__int64 bf_0;
unsigned __int64 v19;
UINT64 BitsMustBeChanged;
UINT64 v21;
_LIST_ENTRY *v22;
*(&stru_140C4DB30 + 536) = (char *)&stru_140C4DB30 + 4280;
*(&stru_140C4DB30 + 535) = (char *)&stru_140C4DB30 + 4280;
v2 = 0i64;
*(&stru_140C4DB30 + 537) = 0i64;
ExInitializePushLock((PULONG_PTR)&stru_140C4DB30 + 538);
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
v4 = MiSwizzleInvalidPte(128i64);
v22 = p_MemoryDescriptorListHead;
for( i = p_MemoryDescriptorListHead->Flink; i != p_MemoryDescriptorListHead; i = i->Flink )
{
if( ((LODWORD(i[1].Flink) - 33) & 0xFFFFFFFD) != 0 )
continue;
Blink = (UINT64)i[1].Blink;
Flink = (UINT64)i[2].Flink;
if( v2 )
{
v9 = v2[1].Children[1];
if( (_RTL_BALANCED_NODE *)Blink == (_RTL_BALANCED_NODE *)((char *)v9 + (unsigned __int64)v2[1].Children[0]) )
{
v2[1].Children[1] = (_RTL_BALANCED_NODE *)((char *)v9 + Flink);
goto LABEL_16;
}
}
Pool = (_RTL_BALANCED_NODE *)MiAllocatePool(64i64, 0x28ui64, 0x52456D4Dui64);
v2 = Pool;
if( !Pool )
return 0;
Pool[1].Children[0] = (_RTL_BALANCED_NODE *)Blink;
v11 = 0;
Pool[1].Children[1] = (_RTL_BALANCED_NODE *)Flink;
v12 = (_QWORD *)*(&stru_140C4DB30 + 530);
if( !*(&stru_140C4DB30 + 530) )
goto LABEL_15;
while( Blink < v12[3] )
{
v13 = (_QWORD *)*v12;
if( !*v12 )
goto LABEL_15;
LABEL_20:
v12 = v13;
}
v13 = (_QWORD *)v12[1];
if( v13 )
goto LABEL_20;
v11 = 1;
LABEL_15:
RtlAvlInsertNodeEx((_RTL_BALANCED_NODE **)&stru_140C4DB30 + 530, (UINT64)v12, v11, v2);
LABEL_16:
LODWORD(BitsMustBeChanged) = 0;
MiUpdateLargePageBitMap((UINT64)&Irp, Blink, Flink, 0i64, BitsMustBeChanged);
v14 = &MmGetPfnDb()[Blink];
if( Flink )
{
do
{
v15 = MiLockPageInline(v14);
bf_0 = v14->u4._bf_0;
v19 = v15;
v14->u2._bf_0 &= 0x8000000000000000ui64;
v14->u3.ReferenceCount = 0;
v14->OriginalPte.u.Long = v4;
v14->u4._bf_0 = bf_0 & 0x8FFFFFFFFFFFFFFFui64 | 0x1000000000000000i64;
if( LODWORD(i[1].Flink) == 33 )
MiInsertPageInFreeOrZeroedList(Blink, 0x100ui64, v16, v17, BitsMustBeChanged, v21);
else
MiInitializeMdlPfn(v14, 0i64);
_InterlockedAnd64(&v14->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v19);
++v14;
++Blink;
--Flink;
}
while( Flink );
p_MemoryDescriptorListHead = v22;
}
*(&stru_140C4DB30 + 569) -= i[2].Flink;
}
return !*(&stru_140C4DB30 + 530) || MiInitializeEnclaveMetadataPage();
}Referenced by:
MiInitSystem