MiAssignNonPagedPoolPte
NTSTATUS __stdcall MiAssignNonPagedPoolPte(INT64 a1, UINT64 a2){
_XSTATE_CONFIGURATION *v4;
__int64 v5;
unsigned __int16 v6;
__int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v11;
__int64 v12;
_MMPFN *PfnDb;
__int64 v14;
__int64 v15;
NTSTATUS v16;
__int64 v17;
int v18;
_MMPFN *v19;
UINT64 ReferenceCount;
UINT64 SpinCount;
v4 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + ((a2 >> 9) & 0x7FFFFFFFF8i64));
v5 = MiSwizzleInvalidPte(128i64);
v6 = *(_WORD *)(a1 + 78);
v7 = v5;
LODWORD(v8) = MiMakeValidPte(v4, 0i64, (v6 >> 3) & 0x1F | 0xA0000000);
v9 = v8;
LODWORD(v10) = MiGetContainingPageTable((UINT64)v4);
v11 = *(_QWORD *)(a1 + 16);
v12 = v10;
PfnDb = MmGetPfnDb();
if( (v6 & 0x100) != 0 )
{
v16 = 1;
v15 = *(_QWORD *)(v11 + 8 * ((a2 - *(_QWORD *)a1) >> 12));
}
else
{
*(_QWORD *)(a1 + 16) = *(_QWORD *)v11;
v14 = *(_QWORD *)(v11 + 40);
v15 = (v11 - (__int64)PfnDb) / 48;
if( (*(_BYTE *)(v11 + 35) & 0x10) != 0 )
{
v16 = 0;
}
else
{
*(_QWORD *)(v11 + 16) = v7;
v14 &= ~0x8000000000000000ui64;
v16 = 1;
}
LODWORD(ReferenceCount) = 1;
*(_QWORD *)(v11 + 40) = v14 ^ (v10 ^ v14) & 0xFFFFFFFFFi64;
MiSetPfnOwnedAndActive((_MMPFN *)v11, 0i64, (_MMPTE *)v4, MiCached, ReferenceCount);
}
v17 = v9 ^ (v9 ^ (v15 << 12)) & 0xFFFFFFFFF000i64;
LOBYTE(v18) = MiPteInShadowRange((UINT64)v4);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v17 & 1) != 0 )
v17 |= 0x8000000000000000ui64;
v4->EnabledFeatures = v17;
v19 = &PfnDb[v12];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v19->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v19->u2._bf_0 < 0 );
}
v19->u2._bf_0 ^= (v19->u2._bf_0 ^ (v19->u2._bf_0 + 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v19->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return v16;
}Referenced by:
MiFillPoolCommitPageTable