MiGetNextNonGapPfnPage

INT64 __fastcall MiGetNextNonGapPfnPage(UINT64 *a1, UINT64 *a2, CHAR a3, INT64 r9_0){
  UINT64 v4; 
  UINT64 v5; 
  _MMPTE *PteBase; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  int a5; 
  CHAR *AnyMultiplexedVm; 
  UINT64 v11; 
  UINT64 v12; 
  unsigned __int64 i; 
  UINT64 v14; 
  _MMPTE *v15; 
  UINT64 v16; 
  __int64 v17; 
  UINT64 LeafVa; 
  __int64 v19; 
  __int64 v20; 
  UINT64 v22; 
  __int64 v23; 
  __int64 v24; 
  UINT64 *v25; 
  unsigned int a6; 
  CHAR *v27; 
  int v31; 
  v31 = r9_0;
  v4 = *a1;
  v5 = 0i64;
  a6 = 0;
  PteBase = MmGetPteBase();
  if( !v4 )
    v4 = (UINT64)PteBase + (((unsigned __int64)MmPfnDatabase >> 9) & 0x7FFFFFFFF8i64);
  if( *a2 )
  {
    v7 = v4 + 8 * (*a2 >> 12);
    v8 = (__int64)((v7 << 25) - ((_QWORD)PteBase << 25)) >> 16;
LABEL_5:
    v7 -= 8i64;
    goto LABEL_6;
  }
  v8 = (unsigned __int64)MmGetPfnDb() + 0x30000000000i64;
  v7 = (unsigned __int64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
  if( (v7 & 0xFFF) == 0 )
    goto LABEL_5;
LABEL_6:
  a5 = (_DWORD)r9_0 != 0 ? 7 : 3;
  AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
  v27 = AnyMultiplexedVm;
  v11 = 0i64;
  v12 = 0i64;
  i = 0i64;
  if( v4 <= v7 )
  {
    while( 2 )
    {
      if( v11 )
      {
        MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v11);
        v11 = 0i64;
      }
      MiGetNextPageTable(v4, v7, 0i64, a3, a5, &a6);
      v4 = v14;
      if( v14 )
      {
        v15 = MmGetPteBase();
        if( !v31 )
          v11 = (UINT64)v15 + ((v14 >> 9) & 0x7FFFFFFFF8i64);
        if( a6 )
        {
          v12 = v14;
          v16 = v14;
          v17 = a6;
          do
          {
            if( v11 )
              v11 = (UINT64)v15 + ((v11 >> 9) & 0x7FFFFFFFF8i64);
            v16 = (UINT64)v15 + ((v16 >> 9) & 0x7FFFFFFFF8i64);
            --v17;
          }
          while( v17 );
          LeafVa = MiGetLeafVa(v16 + 8);
          i = LeafVa - MiGetLeafVa(v4);
          AnyMultiplexedVm = v27;
          v19 = (__int64)(v7 - v4) >> 3;
          if( i >> 12 > v19 + 1 )
            i = (v19 + 1) << 12;
        }
        else
        {
          v22 = v14;
          while( !(unsigned int)MiPfnDatabaseVaIsUnique((UINT64 *)v22) )
          {
            v22 += 8i64;
            if( v22 > v7 || (v22 & v23) == 0 )
              goto LABEL_33;
          }
          v12 = v22;
          if( v22 )
          {
            for( i = 4096i64; ; i += v24 )
            {
              v25 = (UINT64 *)(v22 + 8);
              if( (unsigned __int64)v25 > v7
                || ((unsigned __int64)v25 & v23) == 0
                || !(unsigned int)MiPfnDatabaseVaIsUnique(v25) )
              {
                break;
              }
            }
            goto LABEL_41;
          }
LABEL_33:
          AnyMultiplexedVm = v27;
          v4 = v22;
          if( v22 <= v7 )
            continue;
        }
      }
      else
      {
LABEL_41:
        AnyMultiplexedVm = v27;
      }
      break;
    }
  }
  if( v11 )
    MiUnlockPageTableInternal((INT64)AnyMultiplexedVm, v11);
  if( v12 )
  {
    v4 = v12 + 8 * (i >> 12);
    v20 = (__int64)((v12 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    v5 = v8 - v20;
    if( i + v20 <= v8 )
      v5 = i;
  }
  else
  {
    v20 = 0i64;
  }
  *a2 = v5;
  *a1 = v4;
  return v20;
}

Referenced by:

MiFreedUnusedPfnPagesWorker
MiGetFileOnlyRanges