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