MiGetPageTablePages

__int64 __fastcall MiGetPageTablePages(__int64 a1, unsigned __int64 a2, _QWORD *a3){
  int v3; 
  INT64 v4; 
  _MMPFN *v8; 
  int v9; 
  unsigned int v10; 
  unsigned __int32 v11; 
  UINT64 Page; 
  _MMPFN *v13; 
  _MMPFN *v15; 
  unsigned __int64 v16; 
  v3 = *(_DWORD *)(a1 + 64);
  v4 = *(_QWORD *)(a1 + 32);
  *a3 = 0i64;
  v8 = 0i64;
  if( (v3 & 8) != 0 || !*(_QWORD *)(v4 + 7592) )
  {
    v9 = 0;
  }
  else
  {
    if( !(unsigned int)MiObtainSystemCharges((_MI_PARTITION *)v4, a2, *(unsigned int *)(a1 + 56)) )
      return 3221225773i64;
    *(_QWORD *)(a1 + 40) += a2;
    v9 = 1;
    v3 = *(_DWORD *)(a1 + 64);
  }
  v16 = 0i64;
  v10 = (v3 & 0x400 | 0x20C280u) >> 6;
  if( a2 )
  {
    while( 1 )
    {
      v11 = *(_DWORD *)(a1 + 284) | _InterlockedExchangeAdd(*(volatile signed __int32 **)(a1 + 272), 1u) & *(_DWORD *)(a1 + 280);
      Page = MiGetPage((_MI_PARTITION *)v4, v11, v10);
      if( Page == -1i64 )
      {
        if( (*(_DWORD *)(a1 + 64) & 0x10) == 0 )
          break;
        if( !(unsigned int)MiSufficientAvailablePages(v4, 0x60ui64) )
          break;
        Page = MiGetPage((_MI_PARTITION *)v4, v11, v10 | 4);
        if( Page == -1i64 )
          break;
      }
      v13 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * Page);
      MiSetPfnTbFlushStamp(v13, 0i64, 0i64);
      *(_QWORD *)v13 = v8;
      ++v16;
      v8 = v13;
      if( v16 >= a2 )
        goto LABEL_8;
    }
    if( v9 )
    {
      MiReturnCommit((_MI_PARTITION *)v4, a2);
      MiReturnSystemCharges(v4, a2, *(unsigned int *)(a1 + 56));
      *(_QWORD *)(a1 + 40) -= a2;
    }
    if( v8 )
    {
      do
      {
        v15 = *(_MMPFN **)v8;
        MiReleaseFreshPage(v8);
        v8 = v15;
      }
      while( v15 );
    }
    return 3221225495i64;
  }
  else
  {
LABEL_8:
    *a3 = v8;
    return 0i64;
  }
}

Referenced by:

MiCreateSystemPageTable
MiDemoteValidLargePageOneLevel
MmCreateShadowMapping