MmAllocateIndependentPagesEx
INT64 __fastcall MmAllocateIndependentPagesEx(UINT64 a1, INT64 a2, _QWORD *a3, UINT64 a4){
int v4;
UINT64 v6;
INT64 v7;
UINT64 ValidPte;
INT64 v9;
UINT64 v10;
UINT64 v11;
int v12;
__int64 v13;
int v14;
unsigned int NextPageColor;
UINT64 v16;
UINT64 SlabPage;
unsigned int v19;
_QWORD *v20;
INT64 v21;
__int64 v22;
__int64 v23;
INT64 v24[2];
UINT64 v25[4];
__int128 v26;
BOOL v27;
unsigned int v28;
v28 = a4;
v4 = a2;
v6 = (a1 >> 12) + ((a1 & 0xFFF) != 0);
*(_OWORD *)v24 = 0i64;
memset(v25, 0, sizeof(v25));
v26 = 0i64;
v7 = MiReservePtes((INT64)&qword_140C4EC80, (unsigned int)v6);
if( !v7 )
return 0i64;
if( !(unsigned int)MiObtainPoolCharges(v6, 1i64) )
{
MiReleasePtes((INT64)&qword_140C4EC80, v7, (unsigned int)v6);
return 0i64;
}
v27 = a3 && (dword_140C50AC4 & 8) != 0 && (v4 == -1 || KeNumberNodes == 1);
v23 = ((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
ValidPte = MiMakeValidPte(v7, 0i64, 2684354564i64);
v9 = 0i64;
v10 = ValidPte;
if( v4 != -1 )
v9 = (unsigned int)(v4 + 1);
MiInitializePageColorBase(0i64, v9, (INT64)v24);
v11 = 0i64;
v22 = 0i64;
do
{
v12 = 0;
NextPageColor = MiGetNextPageColor((INT64)v24);
if( v27 )
{
if( a3 != (_QWORD *)-1i64 )
{
v19 = 0;
if( !v28 )
goto LABEL_9;
v20 = a3;
while( v13 != *v20 >> 12 )
{
v19 += v14;
++v20;
if( v19 >= v28 )
goto LABEL_9;
}
}
v12 = v14;
}
LABEL_9:
while( 1 )
{
if( v12 )
{
LODWORD(v21) = 0;
SlabPage = MiGetSlabPage((UINT64)&MiSystemPartition, v14, 0i64, (INT64 *)0xFFFFFFFFFFFFFFFFi64, v21);
if( SlabPage != -1i64 )
break;
}
SlabPage = MiGetPage((_MI_PARTITION *)&MiSystemPartition, NextPageColor, 8ui64);
if( SlabPage != -1i64 )
goto LABEL_11;
MiWaitForFreePage((_MI_PARTITION *)&MiSystemPartition, v16);
LOBYTE(v14) = 1;
}
++v11;
LABEL_11:
v10 ^= (v10 ^ (SlabPage << 12)) & 0xFFFFFFFFF000i64;
MiInitializePfn((_RTL_BITMAP_EX *)MmGetPfnDb() + 3 * SlabPage, (UINT64 *)v7, 4ui64);
*(_QWORD *)v7 = v10;
v7 += 8i64;
++v22;
--v6;
}
while( v6 );
if( v11 )
{
v25[3] = v11;
v25[0] = v11;
*(_OWORD *)&v25[1] = 0i64;
v26 = 0i64;
MiReturnPoolCharges(v25, 1i64);
}
return v23;
}Referenced by:
ExCreatePoolTagTable
HvlInitializeProcessor
HvlpPreallocatePageListResources
IopLiveDumpAllocateDumpBuffers
IopLiveDumpAllocateExtraBuffers
IopLiveDumpAllocateIptBuffers
KeStartAllProcessors
KiStartDynamicProcessor
MmAllocateIndependentPages
MmAllocateIsrStack
PspInitPhase0