MiQueryVaPhysicalContiguity

NTSTATUS __stdcall MiQueryVaPhysicalContiguity(INT64 a1, UINT64 a2, UINT64 a3, INT64 a4){
  _MMSUPPORT_INSTANCE *v4; 
  __int64 v5; 
  _MMPTE *PteBase; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  UINT64 v9; 
  int v10; 
  int v11; 
  NTSTATUS v12; 
  int v13; 
  UINT64 v14; 
  UINT8 v15; 
  UINT8 v16; 
  _MMPTE *v17; 
  __int64 v18; 
  _MMPTE *NextPageTable; 
  _MMPTE *v20; 
  unsigned int v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  UINT64 v24; 
  UINT64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  __int64 v28; 
  __int16 v29; 
  __int64 v30; 
  __int64 v31; 
  int v32; 
  UINT64 v33; 
  UINT64 v34; 
  _MMPFN *v35; 
  bool v36; 
  __int64 v37; 
  int v38; 
  UINT64 PageTableFlags; 
  UINT64 v41; 
  UINT64 v42; 
  unsigned __int64 v43; 
  unsigned __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  UINT64 LargePage; 
  UINT64 WsIrql; 
  int v50; 

  v50 = a4;
  LODWORD(LargePage) = 0;
  v4 = (_MMSUPPORT_INSTANCE *)a1;
  v5 = (unsigned int)a3;
  PteBase = MmGetPteBase();
  v46 = MiLargePageSizes[v5];
  v7 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
  v45 = -1i64;
  v8 = (unsigned __int64)PteBase + ((((v46 << 12) + a2 - 1) >> 9) & 0x7FFFFFFFF8i64);
  v9 = 0i64;
  v44 = v8;
  v43 = 0i64;
  v10 = 0;
  LODWORD(v41) = 0;
  v11 = 0;
  v12 = 1;
  v13 = 0;
  HIDWORD(v41) = a4 & 1;
  MiLockWorkingSetShared();
  LOBYTE(WsIrql) = v15;
  v16 = v15;
  if( v7 > v8 )
    goto LABEL_50;
  v17 = (_MMPTE *)v8;
  while( 1 )
  {
    v18 = 1i64;
    if( v9 )
    {
      if( (v7 & 0xFFF) == 0 )
      {
        MiUnlockPageTableInternal((INT64)v4, v9);
        v16 = WsIrql;
        v9 = 0i64;
      }
      if( v9 )
        goto LABEL_21;
      v17 = (_MMPTE *)v44;
    }
    LODWORD(PageTableFlags) = 1;
    NextPageTable = MiGetNextPageTable((_MMPTE *)v7, v17, 0i64, v16, PageTableFlags, &LargePage, v41);
    if( !NextPageTable )
      break;
    v20 = MmGetPteBase();
    v21 = LargePage;
    v9 = (UINT64)v20 + (((unsigned __int64)NextPageTable >> 9) & 0x7FFFFFFFF8i64);
    if( (_DWORD)LargePage )
    {
      v43 = (unsigned __int64)v20 + (((unsigned __int64)NextPageTable >> 9) & 0x7FFFFFFFF8i64);
      v22 = v43;
      if( (unsigned int)LargePage > 1 )
      {
        v14 = (unsigned int)(LargePage - 1);
        do
        {
          v9 = (UINT64)v20 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
          v22 = (unsigned __int64)v20 + ((v22 >> 9) & 0x7FFFFFFFF8i64);
          --v14;
        }
        while( v14 );
        v43 = v22;
      }
      v9 = (UINT64)v20 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
    }
    else
    {
      v22 = v43;
    }
    if( NextPageTable != (_MMPTE *)v7 )
      break;
    if( (_DWORD)LargePage )
    {
      v23 = (__int64)((v7 << 25) - ((_QWORD)v20 << 25)) >> 16;
      LODWORD(v24) = MI_READ_PTE_LOCK_FREE(v22);
      v42 = v24;
      v25 = v24;
      MiPteInShadowRange((UINT64)&v42);
      v26 = (v25 >> 12) & 0xFFFFFFFFFi64;
      v27 = v23 >> 12;
      v28 = v21;
      do
      {
        v29 = v27;
        v27 >>= 9;
        v30 = v18 * (v29 & 0x1FF);
        v18 <<= 9;
        v26 += v30;
        --v28;
      }
      while( v28 );
      v13 = 1;
      v31 = v18 - (v26 & (v18 - 1));
      goto LABEL_32;
    }
LABEL_21:
    v32 = 0;
    LODWORD(v33) = MI_READ_PTE_LOCK_FREE(v7);
    v42 = v33;
    v34 = v33;
    if( (v33 & 1) != 0 )
    {
      MiPteInShadowRange((UINT64)&v42);
      v26 = (v34 >> 12) & 0xFFFFFFFFFi64;
      v35 = &MmGetPfnDb()[v26];
    }
    else
    {
      if( (v33 & 0x400) != 0
        || (v33 & 0x800) == 0
        || (v50 & 2) != 0
        || (v35 = MiLockTransitionLeafPage(v7, 0i64)) == 0i64 )
      {
        v11 = 1;
LABEL_46:
        v4 = (_MMSUPPORT_INSTANCE *)a1;
        goto LABEL_47;
      }
      v32 = 1;
      v26 = v35 - MmGetPfnDb();
    }
    if( !MiCheckContiguityTradeEligible((INT64)v35) )
      v13 = 1;
    v36 = v32 == 0;
    v31 = 1i64;
    if( !v36 )
      _InterlockedAnd64(&v35->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_32:
    if( v45 == -1 )
      v36 = ((v46 - 1) & v26) == 0;
    else
      v36 = v45 == v26;
    if( !v36 )
    {
      LODWORD(v41) = 1;
      if( !HIDWORD(v41) )
        goto LABEL_46;
    }
    v37 = v26 + v31;
    v4 = (_MMSUPPORT_INSTANCE *)a1;
    v45 = v37;
    if( (v7 & 0x78) == 0 && (LOBYTE(v38) = MiWorkingSetIsContended(a1), v38) || (unsigned int)KeShouldYieldProcessor() )
    {
      if( v9 )
      {
        MiUnlockPageTableInternal(a1, v9);
        v9 = 0i64;
      }
      LOBYTE(v14) = WsIrql;
      MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a1, v14);
      MiLockWorkingSetShared();
    }
    v17 = (_MMPTE *)v44;
    v7 += 8 * v31;
    v16 = WsIrql;
    if( v7 > v44 )
      goto LABEL_47;
  }
  v11 = 1;
LABEL_47:
  if( v9 )
    MiUnlockPageTableInternal((INT64)v4, v9);
  v16 = WsIrql;
  v10 = v41;
LABEL_50:
  LOBYTE(v14) = v16;
  MiUnlockWorkingSetShared(v4, v14);
  if( v11 )
    return(v13 != 0) + 2;
  if( v10 )
    return v13 != 0 ? 3 : 0;
  return v12;
}

Referenced by:

MiProcessVaContiguityInformation
MiQueryMemoryPhysicalContiguity