MiMapBBTMemory
VOID __stdcall MiMapBBTMemory(_LOADER_PARAMETER_BLOCK *LoaderBlock){
unsigned __int64 v1;
_QWORD *BbtBuffer;
unsigned __int64 v4;
unsigned __int64 v5;
_MMPTE *PteBase;
_XSTATE_CONFIGURATION *v7;
INT64 v8;
_MI_TB_FLUSH_LIST *v9;
unsigned __int64 v10;
unsigned __int64 v11;
_LIST_ENTRY *p_MemoryDescriptorListHead;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v14;
_LIST_ENTRY *Blink;
unsigned __int64 v16;
int v17;
UINT64 v18;
INT64 v19;
_LIST_ENTRY *v20;
_QWORD *v21;
v1 = 0i64;
if( BBTPagesToReserve )
{
BbtBuffer = LoaderBlock->Extension->BbtBuffer;
if( BbtBuffer )
{
v1 = (BBTPagesToReserve + 511) & 0xFFFFFFFFFFFFFE00ui64;
LABEL_25:
v18 = v1 << 12;
KeZeroPages(BbtBuffer, v18);
*BbtBuffer = v18;
goto LABEL_26;
}
v4 = (BBTPagesToReserve + 511) & 0xFFFFFFFFFFFFFE00ui64;
v5 = (unsigned __int64)MiObtainSystemVa(v4 >> 9, MiVaSystemPtes);
v21 = (_QWORD *)v5;
BbtBuffer = (_QWORD *)v5;
if( v5 )
{
PteBase = MmGetPteBase();
v7 = (_XSTATE_CONFIGURATION *)((char *)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64));
LODWORD(v19) = 0;
v8 = (INT64)v7 + 8 * v4 - 8;
if( MiMakeZeroedPageTablesEx((INT64)v7, v8, 0i64, 9i64, v19) )
{
LODWORD(v10) = MiMakeValidPte(v7, 0i64, 2684354564i64);
v11 = v10;
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
Flink = LoaderBlock->MemoryDescriptorListHead.Flink;
v20 = p_MemoryDescriptorListHead;
if( Flink != p_MemoryDescriptorListHead )
{
while( 1 )
{
if( LODWORD(Flink[1].Flink) == 23 )
{
v14 = Flink[2].Flink;
Blink = Flink[1].Blink;
if( (unsigned __int64)v14 + v1 > BBTPagesToReserve )
v14 = (_LIST_ENTRY *)(BBTPagesToReserve - v1);
v1 += (unsigned __int64)v14;
do
{
v11 ^= (v11 ^ ((_QWORD)Blink << 12)) & 0xFFFFFFFFF000i64;
v16 = v11;
LOBYTE(v17) = MiPteInShadowRange((UINT64)v7);
if( v17 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v11 & 1) != 0 )
v16 = v11 | 0x8000000000000000ui64;
v7->EnabledFeatures = v16;
v7 = (_XSTATE_CONFIGURATION *)((char *)v7 + 8);
Blink = (_LIST_ENTRY *)((char *)Blink + 1);
v14 = (_LIST_ENTRY *)((char *)v14 - 1);
}
while( v14 );
if( v1 == BBTPagesToReserve )
{
LABEL_22:
BbtBuffer = v21;
break;
}
p_MemoryDescriptorListHead = v20;
}
Flink = Flink->Flink;
if( Flink == p_MemoryDescriptorListHead )
goto LABEL_22;
}
}
if( v1 < BBTPagesToReserve )
BBTPagesToReserve = v1;
goto LABEL_25;
}
MiReturnSystemVa(
BbtBuffer,
(VOID *)(((v8 << 25) - ((_QWORD)PteBase << 25) + 0x10000000) >> 16),
MiVaSystemPtes,
v9);
BbtBuffer = 0i64;
}
BBTPagesToReserve = 0i64;
LABEL_26:
BBTBuffer = (__int64)BbtBuffer;
}
}Referenced by:
MiInitSystem