MiEnableNewPfns

VOID __stdcall MiEnableNewPfns(UINT64 StartPage, UINT64 LastPage){
  unsigned int v2; 
  unsigned __int64 v3; 
  BOOL v5; 
  unsigned __int64 v6; 
  _BOOL8 v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  char *v10; 
  unsigned __int64 v11; 
  char v12; 
  unsigned __int8 v13; 
  int v14; 
  unsigned int v15; 
  _MMPFN *PfnDb; 
  unsigned int v17; 
  INT64 v18; 
  unsigned __int64 v19; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v21; 
  bool v22; 
  signed __int32 v23; 
  unsigned int a2; 
  UINT64 v25; 
  INT64 a1[2]; 
  __int64 v27; 
  v27 = 0i64;
  v3 = StartPage;
  v5 = (v2 & 0x100) == 0;
  *(_OWORD *)a1 = 0i64;
  v6 = LastPage - StartPage;
  v25 = LastPage - StartPage;
  v7 = (v2 & 0x100) == 0;
  if( (v2 & 0x1800) != 0 )
  {
    v8 = (v2 >> 11) & 1;
    a2 = MiDetermineNewPfnHeatState(v7);
    v9 = MiLargePageSizes[v8];
    v10 = (char *)MmGetPfnDb() + 48 * v3;
    v11 = v6 / v9;
    if( v6 / v9 )
    {
      v12 = ~(_BYTE)v8 & 3;
      do
      {
        MiLockPageInline((INT64)v10);
        v10[34] = v5 | v10[34] & 0xF8;
        v10[39] = v12 | v10[39] & 0xFC;
        MiSetFreeZeroPfnCold((INT64)v10, a2);
        v27 = v13;
        a1[0] = v3;
        a1[1] = v5;
        MiInsertLargePageInNodeList((INT64)a1);
        v10 += 48 * v9;
        v3 += v9;
        --v11;
      }
      while( v11 );
      v6 = v25;
    }
  }
  else
  {
    v14 = MiDetermineNewPfnHeatState(v7);
    PfnDb = MmGetPfnDb();
    v17 = v15 | 0x400;
    if( !v14 )
      v17 = v15;
    v18 = (INT64)PfnDb + 48 * v3;
    while( v3 < LastPage )
    {
      v19 = (unsigned __int8)MiLockPageInline(v18);
      MiInsertPageInFreeOrZeroedList(v3, v17);
      _InterlockedAnd64((volatile signed __int64 *)(v18 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v19);
      ++v3;
      v18 += 48i64;
    }
  }
  CurrentPrcb = KeGetCurrentPrcb();
  v21 = *((int *)CurrentPrcb + 8391);
  if( (_DWORD)v21 != -1 )
  {
    if( v6 + v21 <= 0x100 )
    {
      do
      {
        if( v6 >= 0x80000 )
          break;
        v23 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v6 + v21, v21);
        v22 = (_DWORD)v21 == v23;
        LODWORD(v21) = v23;
        if( v22 )
          return;
      }
      while( v23 != -1 && v6 + v23 <= 0x100 );
    }
    if( (int)v21 > 192
      && (_DWORD)v21 != -1
      && (_DWORD)v21 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v21) )
    {
      v6 += (int)v21 - 192;
    }
  }
  if( v6 )
    _InterlockedExchangeAdd64(&qword_140C526C0, v6);
}

Referenced by:

MiAddPhysicalMemory