MiAddExpansionNonPagedPool
VOID __stdcall MiAddExpansionNonPagedPool(UINT64 PageFrameIndex, UINT64 NumberOfPages){
__int64 v2;
__int64 v3;
_MMPFN *v4;
__int64 v5;
_MMPFN *v6;
_MMPFN *v7;
int v8;
signed __int64 v9;
__int64 v10;
__int64 v11;
UINT8 v12;
char v13;
unsigned __int64 v14;
char v15;
char v16;
char v17;
if( NumberOfPages )
{
v2 = MiSwizzleInvalidPte(128i64);
v4 = &MmGetPfnDb()[v3];
v6 = 0i64;
v7 = &v4[v5];
v8 = -1;
do
{
v9 = (char *)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(v4);
v13 = *(_BYTE *)(&v4->u3 + 1) & 0xC7;
v14 = v12;
v4->u4._bf_0 &= ~0x8000000000000000ui64;
*((_BYTE *)&v4->u3 + 2) = v13;
v15 = *((_BYTE *)&v4->u3 + 3) & 0xDF;
*((_BYTE *)&v4->u3 + 3) = v15;
*(unsigned __int16 *)((char *)&MmGetPfnDb()->u3.ReferenceCount + v9) = 0;
v4->u2._bf_0 &= 0xC000000000000000ui64;
*(unsigned __int64 *)((char *)&MmGetPfnDb()->OriginalPte.u.Long + v9) = v2;
v4->u4._bf_0 &= 0x8FFFFFFFFFFFFFFFui64;
v16 = v15;
v17 = *((_BYTE *)&v4->u3 + 2);
*((_BYTE *)&v4->u3 + 3) = v16 | 0x10;
v4->u4._bf_0 &= 0xFFFFFFF000000000ui64;
if( (v17 & 0xC0) != 64 )
{
MiChangePageAttribute(v4, MiCached, 3ui64);
v17 = *((_BYTE *)&v4->u3 + 2);
}
v4->PteLong = -8i64;
*((_BYTE *)&v4->u3 + 2) = v17 & 0xF8 | 5;
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
v4->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = (__int64)v6;
v6 = v4++;
}
while( v4 < v7 );
MiReturnPhysicalPoolPages(v6);
}
}Referenced by:
MiFreeLargeInitializationCodePages
MiInitializeNonPagedPool