MiAssignNonPagedPoolPte
INT64 __fastcall MiAssignNonPagedPoolPte(INT64 a1, UINT64 a2){
UINT64 *v4;
INT64 v5;
unsigned __int16 v6;
INT64 v7;
UINT64 ValidPte;
UINT64 ContainingPageTable;
INT64 v10;
UINT64 v11;
_MMPFN *PfnDb;
__int64 v13;
__int64 v14;
unsigned int v15;
char *v16;
INT64 v18;
UINT64 SpinCount;
v4 = (UINT64 *)((char *)MmGetPteBase() + ((a2 >> 9) & 0x7FFFFFFFF8i64));
v5 = MiSwizzleInvalidPte(128i64);
v6 = *(_WORD *)(a1 + 78);
v7 = v5;
ValidPte = MiMakeValidPte((UINT64)v4, 0i64, (v6 >> 3) & 0x1F | 0xA0000000);
ContainingPageTable = MiGetContainingPageTable((UINT64)v4);
v10 = *(_QWORD *)(a1 + 16);
v11 = ContainingPageTable;
PfnDb = MmGetPfnDb();
if( (v6 & 0x100) != 0 )
{
v15 = 1;
v14 = *(_QWORD *)(v10 + 8 * ((a2 - *(_QWORD *)a1) >> 12));
}
else
{
*(_QWORD *)(a1 + 16) = *(_QWORD *)v10;
v13 = *(_QWORD *)(v10 + 40);
v14 = (v10 - (__int64)PfnDb) / 48;
if( (*(_BYTE *)(v10 + 35) & 0x10) != 0 )
{
v15 = 0;
}
else
{
*(_QWORD *)(v10 + 16) = v7;
v13 &= ~0x8000000000000000ui64;
v15 = 1;
}
LODWORD(v18) = 1;
*(_QWORD *)(v10 + 40) = v13 ^ (ContainingPageTable ^ v13) & 0xFFFFFFFFFi64;
MiSetPfnOwnedAndActive(v10, 0, (INT64)v4, 1i64, v18);
}
*v4 = ValidPte ^ (ValidPte ^ (v14 << 12)) & 0xFFFFFFFFF000i64;
v16 = (char *)PfnDb + 48 * v11;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v16 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v16 + 3) < 0 );
}
*((_QWORD *)v16 + 3) ^= (*((_QWORD *)v16 + 3) ^ (*((_QWORD *)v16 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v16 + 3, 0x7FFFFFFFFFFFFFFFui64);
return v15;
}Referenced by:
MiFillPoolCommitPageTable