MiAddExpansionNonPagedPool
VOID __stdcall MiAddExpansionNonPagedPool(UINT64 PageFrameIndex, UINT64 NumberOfPages){
INT64 v2;
__int64 v3;
char *v4;
__int64 v5;
_MMPFN *v6;
char *v7;
int v8;
signed __int64 v9;
__int64 v10;
__int64 v11;
unsigned __int8 v12;
char v13;
unsigned __int64 v14;
char v15;
char v16;
char v17;
if( NumberOfPages )
{
v2 = MiSwizzleInvalidPte(128i64);
v4 = (char *)MmGetPfnDb() + 48 * v3;
v6 = 0i64;
v7 = &v4[48 * v5];
v8 = -1;
do
{
v9 = v4 - (char *)MmGetPfnDb();
LODWORD(v10) = MiSearchNumaNodeTable((PVOID)(v9 / 48));
if( v8 != *(_DWORD *)(v10 + 8) )
{
if( v6 )
{
MiReturnPhysicalPoolPages(v6);
v6 = 0i64;
}
LODWORD(v11) = MiSearchNumaNodeTable((PVOID)(v9 / 48));
v8 = *(_DWORD *)(v11 + 8);
}
v12 = MiLockPageInline((INT64)v4);
v13 = v4[34] & 0xC7;
v14 = v12;
*((_QWORD *)v4 + 5) &= ~0x8000000000000000ui64;
v4[34] = v13;
v15 = v4[35] & 0xDF;
v4[35] = v15;
*(_WORD *)((char *)MmGetPfnDb() + v9 + 32) = 0;
*((_QWORD *)v4 + 3) &= 0xC000000000000000ui64;
*(_QWORD *)((char *)MmGetPfnDb() + v9 + 16) = v2;
*((_QWORD *)v4 + 5) &= 0x8FFFFFFFFFFFFFFFui64;
v16 = v15;
v17 = v4[34];
v4[35] = v16 | 0x10;
*((_QWORD *)v4 + 5) &= 0xFFFFFFF000000000ui64;
if( (v17 & 0xC0) != 64 )
{
MiChangePageAttribute((INT64)v4, 1i64, 3);
v17 = v4[34];
}
*((_QWORD *)v4 + 1) = -8i64;
v4[34] = v17 & 0xF8 | 5;
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
*(_QWORD *)v4 = v6;
v6 = (_MMPFN *)v4;
v4 += 48;
}
while( v4 < v7 );
MiReturnPhysicalPoolPages(v6);
}
}Referenced by:
MiFreeLargeInitializationCodePages
MiInitializeNonPagedPool