MiQueryVaPhysicalContiguity

INT64 __fastcall MiQueryVaPhysicalContiguity(INT64 a1, UINT64 a2, UINT64 a3, INT64 a4){
  INT64 v4; 
  __int64 v5; 
  _MMPTE *PteBase; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  UINT64 v9; 
  int v10; 
  int v11; 
  unsigned int v12; 
  int v13; 
  UINT8 v14; 
  INT64 v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  _MMPTE *v18; 
  unsigned int v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  UINT64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  __int16 v27; 
  __int64 v28; 
  __int64 v29; 
  int v30; 
  INT64 v31; 
  unsigned __int64 v32; 
  _MMPFN *v33; 
  bool v34; 
  __int64 v35; 
  int v37; 
  int v38; 
  UINT64 v39; 
  unsigned __int64 v40; 
  unsigned __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  unsigned int a6; 
  UINT8 v46; 
  int v47; 
  v47 = a4;
  a6 = 0;
  v4 = a1;
  v5 = (unsigned int)a3;
  PteBase = MmGetPteBase();
  v43 = MiLargePageSizes[v5];
  v7 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
  v42 = -1i64;
  v8 = (unsigned __int64)PteBase + ((((v43 << 12) + a2 - 1) >> 9) & 0x7FFFFFFFF8i64);
  v9 = 0i64;
  v41 = v8;
  v40 = 0i64;
  v10 = 0;
  v37 = 0;
  v11 = 0;
  v12 = 1;
  v13 = 0;
  v38 = a4 & 1;
  v46 = MiLockWorkingSetShared(a1);
  v14 = v46;
  if( v7 > v8 )
    goto LABEL_50;
  v15 = v8;
  while( 1 )
  {
    v16 = 1i64;
    if( v9 )
    {
      if( (v7 & 0xFFF) == 0 )
      {
        MiUnlockPageTableInternal(v4, v9);
        v14 = v46;
        v9 = 0i64;
      }
      if( v9 )
        goto LABEL_21;
      v15 = v41;
    }
    MiGetNextPageTable(v7, v15, 0i64, v14, 1, &a6);
    if( !v17 )
      break;
    v18 = MmGetPteBase();
    v19 = a6;
    v9 = (UINT64)v18 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
    if( a6 )
    {
      v40 = (unsigned __int64)v18 + ((v17 >> 9) & 0x7FFFFFFFF8i64);
      v20 = v40;
      if( a6 > 1 )
      {
        v21 = a6 - 1;
        do
        {
          v9 = (UINT64)v18 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
          v20 = (unsigned __int64)v18 + ((v20 >> 9) & 0x7FFFFFFFF8i64);
          --v21;
        }
        while( v21 );
        v40 = v20;
      }
      v9 = (UINT64)v18 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
    }
    else
    {
      v20 = v40;
    }
    if( v17 != v7 )
      break;
    if( a6 )
    {
      v22 = (__int64)((v7 << 25) - ((_QWORD)v18 << 25)) >> 16;
      v39 = MI_READ_PTE_LOCK_FREE(v20);
      v23 = v39;
      MiPteInShadowRange((UINT64)&v39);
      v24 = (v23 >> 12) & 0xFFFFFFFFFi64;
      v25 = v22 >> 12;
      v26 = v19;
      do
      {
        v27 = v25;
        v25 >>= 9;
        v28 = v16 * (v27 & 0x1FF);
        v16 <<= 9;
        v24 += v28;
        --v26;
      }
      while( v26 );
      v13 = 1;
      v29 = v16 - (v24 & (v16 - 1));
      goto LABEL_32;
    }
LABEL_21:
    v30 = 0;
    v31 = MI_READ_PTE_LOCK_FREE(v7);
    v39 = v31;
    v32 = v31;
    if( (v31 & 1) != 0 )
    {
      MiPteInShadowRange((UINT64)&v39);
      v24 = (v32 >> 12) & 0xFFFFFFFFFi64;
      v33 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v24);
    }
    else
    {
      if( (v31 & 0x400) != 0
        || (v31 & 0x800) == 0
        || (v47 & 2) != 0
        || (v33 = MiLockTransitionLeafPage((_MMPTE *)v7, 0i64)) == 0i64 )
      {
        v11 = 1;
LABEL_46:
        v4 = a1;
        goto LABEL_47;
      }
      v30 = 1;
      v24 = (v33 - MmGetPfnDb()) / 48;
    }
    if( !(unsigned int)MiCheckContiguityTradeEligible((INT64)v33) )
      v13 = 1;
    v34 = v30 == 0;
    v29 = 1i64;
    if( !v34 )
      _InterlockedAnd64((volatile signed __int64 *)v33 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_32:
    if( v42 == -1 )
      v34 = ((v43 - 1) & v24) == 0;
    else
      v34 = v42 == v24;
    if( !v34 )
    {
      v37 = 1;
      if( !v38 )
        goto LABEL_46;
    }
    v35 = v24 + v29;
    v4 = a1;
    v42 = v35;
    if( (v7 & 0x78) == 0 && MiWorkingSetIsContended(a1) || KeShouldYieldProcessor() )
    {
      if( v9 )
      {
        MiUnlockPageTableInternal(a1, v9);
        v9 = 0i64;
      }
      MiUnlockWorkingSetShared(a1, v46);
      MiLockWorkingSetShared(a1);
    }
    v15 = v41;
    v7 += 8 * v29;
    v14 = v46;
    if( v7 > v41 )
      goto LABEL_47;
  }
  v11 = 1;
LABEL_47:
  if( v9 )
    MiUnlockPageTableInternal(v4, v9);
  v14 = v46;
  v10 = v37;
LABEL_50:
  MiUnlockWorkingSetShared(v4, v14);
  if( v11 )
  {
    return(unsigned int)(v13 != 0) + 2;
  }
  else if( v10 )
  {
    return v13 != 0 ? 3 : 0;
  }
  return v12;
}

Referenced by:

MiProcessVaContiguityInformation
MiQueryMemoryPhysicalContiguity