MiTradePage

INT64 __fastcall MiTradePage(INT64 a1, ULONG_PTR BugCheckParameter2){
  unsigned int v2; 
  _MI_PARTITION *v4; 
  ULONG_PTR v6; 
  char *v7; 
  __int64 CurrentIrql; 
  UINT8 v9; 
  char *v10; 
  unsigned __int64 v11; 
  int v12; 
  unsigned int v13; 
  _MMPFN *BaseResidentPage; 
  unsigned int PfnPageSizeIndex; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  int v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned __int64 v22; 
  char v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  UINT64 v27; 
  UINT64 v28; 
  INT64 v29; 
  __int64 v30; 
  UINT8 v31; 
  unsigned int *v32; 
  char v33; 
  int v34; 
  bool v35; 
  UINT64 active; 
  UNICODE_STRING *v37; 
  UINT8 v38; 
  WCHAR *v39; 
  int v40; 
  __int64 v41; 
  int v42; 
  INT64 v43; 
  INT64 result; 
  _MMPFN *v45; 
  __int64 v46; 
  int v47[8]; 
  INT64 a5; 
  int v49; 
  _DWORD v50[3]; 
  UINT64 PageFrameIndex; 
  ULONG_PTR v52; 
  INT64 a6; 
  char *v54; 
  INT64 a3; 
  int v56; 
  int v57; 
  INT64 a4; 
  UINT64 SpinCount; 
  v2 = *(_DWORD *)(a1 + 24);
  v4 = *(_MI_PARTITION **)a1;
  a3 = *(_QWORD *)(a1 + 8);
  v50[0] = *(_DWORD *)(a1 + 32);
  v49 = 0;
  v56 = v2 & 0x400000;
  v57 = 0;
  *(_QWORD *)(a1 + 48) = 0i64;
  PageFrameIndex = (UINT64)v4;
  if( (v2 & 0x400000) != 0 )
    LODWORD(a4) = *(_DWORD *)(a1 + 28);
  else
    LODWORD(a4) = -1;
  v54 = 0i64;
  v6 = 48 * BugCheckParameter2;
  v52 = 48 * BugCheckParameter2;
  a6 = -1i64;
  v7 = (char *)MmGetPfnDb() + 48 * BugCheckParameter2;
  CurrentIrql = KeGetCurrentIrql();
  *(_QWORD *)&v50[1] = CurrentIrql;
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  if( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) )
  {
    do
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v7 + 3) < 0 );
    }
    while( _interlockedbittestandset64((volatile signed __int32 *)v7 + 6, 0x3Fui64) );
    LOBYTE(CurrentIrql) = v50[1];
    v6 = v52;
  }
  v9 = CurrentIrql;
  while( 1 )
  {
    while( 1 )
    {
      while( 1 )
      {
        v10 = (char *)MmGetPfnDb() + 40;
        if( BugCheckParameter2 > 0xFFFFFFFFFi64 || (*(_QWORD *)&v10[v6] & 0x4000000000000i64) == 0 )
          goto LABEL_113;
        v11 = *((_QWORD *)v7 + 5);
        if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((v11 >> 39) & 0x3FF)) != v4 )
        {
          v46 = (unsigned int)MiPfnLargeBitSet((UINT64)&MiSystemPartition);
          _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
          __writecr8(v9);
          v29 = 0i64;
          if( (_DWORD)v46 != -1 )
            *(_QWORD *)(a1 + 48) = MiLargePageSizes[v46];
          goto LABEL_99;
        }
        v12 = v7[34] & 7;
        v13 = -1;
        if( (v11 & 0x1000000000i64) != 0 )
        {
          BaseResidentPage = MiGetBaseResidentPage((_MMPFN *)v7);
          PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)BaseResidentPage);
          v13 = PfnPageSizeIndex;
          if( (char *)v16 != v7 )
            _InterlockedAnd64((volatile signed __int64 *)(v16 + 24), 0x7FFFFFFFFFFFFFFFui64);
          if( v12 == 6 )
          {
            *(_QWORD *)(a1 + 48) = MiLargePageSizes[PfnPageSizeIndex];
LABEL_113:
            v29 = 0i64;
LABEL_114:
            if( v9 != 17 )
            {
              _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
              __writecr8(v9);
            }
            goto LABEL_99;
          }
        }
        if( v12 != 5 )
          break;
        if( MiIsPageOnBadList((INT64)v7) )
          goto LABEL_113;
        if( v13 != -1 )
          break;
        if( !MiInvalidPteConforms(*((_QWORD *)v7 + 2)) )
          goto LABEL_113;
        if( qword_140C4DC80 )
        {
          if( (v17 & 0x10) != 0 )
            v17 &= ~0x10ui64;
          else
            v17 &= ~qword_140C4DC80;
        }
        if( HIDWORD(v17) != 4294967294 || v54 == v7 )
          goto LABEL_113;
        LODWORD(v18) = MiSearchNumaNodeTable((PVOID)((v7 - (char *)MmGetPfnDb()) / 48));
        v19 = *(_DWORD *)(v18 + 8);
        v20 = ((unsigned int)MiGetPfnChannel((INT64)v7) << byte_140C4DBCD) | dword_140C4DC38 & BugCheckParameter2 | (v19 << byte_140C4DBCC);
        _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v9);
        MiDrainZeroLookasides(v4, (_MMPFN *)v7, *(_QWORD *)(a1 + 16), v20);
        v54 = v7;
        MiLockPageInline((INT64)v7);
        v6 = v52;
      }
      if( MiIsPfnFileOnly((INT64)v7) || MiIsPfnFromSlabAllocation((INT64)v7) )
        goto LABEL_113;
      if( v21 > 1 )
        break;
      if( v13 == -1 )
      {
        if( !v56 && !MiUnlinkFreeOrZeroedPage(BugCheckParameter2, 0i64, 0i64) )
        {
LABEL_93:
          MiReturnFreeZeroPage((INT64)v7);
          goto LABEL_113;
        }
        v29 = 1i64;
        v43 = 0i64;
LABEL_95:
        MiAddMdlPageToTradeBlock(a1, BugCheckParameter2, v43);
        goto LABEL_114;
      }
      v25 = v13;
      v26 = MiLargePageSizes[v13];
      if( (v2 & 0x2000000) != 0 && v26 >= 0x200 || (v2 & 0x1000000) != 0 && v26 == 16 )
        goto LABEL_113;
      _InterlockedAnd64((volatile signed __int64 *)v7 + 3, v22);
      __writecr8(v9);
      if( v56 || BugCheckParameter2 != (BugCheckParameter2 & ~(v26 - 1)) || *(_QWORD *)(a1 + 16) < v26 )
      {
        v27 = PageFrameIndex;
      }
      else
      {
        v27 = PageFrameIndex;
        v28 = v26 + BugCheckParameter2 - 1;
        if( v28 <= *(_QWORD *)(a1 + 56) )
        {
          LODWORD(a5) = v2;
          if( (unsigned int)MiLargeFreePageToMdl(PageFrameIndex, v28, (UINT64 *)v13) == 1 )
          {
            v29 = v26;
            if( *(_QWORD *)(a1 + 64) && MiPfnZeroingNeeded((INT64)v7, v50[0]) )
              *(_QWORD *)(v30 + 24) = 1i64;
            goto LABEL_99;
          }
        }
      }
      a5 = (INT64)&v57;
      if( !(unsigned int)MiDemoteLargeFreePage(v27, BugCheckParameter2) && !v57 )
      {
        v29 = 0i64;
        if( !MiLargePageMovesInProgress((INT64)v7) )
          *(_QWORD *)(a1 + 48) = MiLargePageSizes[v25];
        goto LABEL_99;
      }
      v31 = MiLockPageInline((INT64)v7);
      v4 = (_MI_PARTITION *)PageFrameIndex;
LABEL_87:
      v9 = v31;
      v6 = v52;
    }
    v32 = (unsigned int *)a3;
    if( !*(_QWORD *)(a3 + 16) )
      break;
    v33 = v7[35];
    if( v33 < 0 )
      break;
    if( v21 > 4 )
    {
      v35 = v21 == 6;
      goto LABEL_68;
    }
    if( (v2 & 0x4000000) == 0 && (v24 & *((_QWORD *)v7 + 5)) == 0 && *((__int64 *)v7 + 1) > 0
      || (v2 & 0x200000) != 0 && ((v33 & 0x40) != 0 || MiIsPageOnBadList((INT64)v7)) )
    {
      goto LABEL_113;
    }
    LODWORD(a5) = v2;
    v34 = MiTradeTransitionPage((UINT64)v7, v9, (INT64)v32, (unsigned int)a4, a5, (INT64)&a6);
    if( v34 == 3 )
    {
      if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) != v4 )
        goto LABEL_97;
      if( !v56 )
        goto LABEL_106;
      v45 = (_MMPFN *)v7;
      goto LABEL_102;
    }
    if( v34 != 2 )
      goto LABEL_98;
LABEL_59:
    v9 = MiLockPageInline((INT64)v7);
    v6 = v52;
  }
  if( v21 == 2 )
  {
    if( *((_WORD *)v7 + 16) )
      goto LABEL_113;
    if( !(unsigned int)MiReuseStandbyPage((UINT64)v7) )
      goto LABEL_93;
    v29 = 1i64;
    v43 = 1i64;
    goto LABEL_95;
  }
  if( v21 != 6
    || (v7[34] & 0x10) != 0
    || *((_WORD *)v7 + 16) != 1
    || ((*((_QWORD *)v7 + 5) >> 60) & 7) == 2
    || (*v7 & 1) == 0 )
  {
    goto LABEL_113;
  }
  v33 = v7[35];
  v35 = (v33 & 8) == 0;
LABEL_68:
  if( !v35 || (v2 & 0x200000) != 0 && ((v33 & 0x40) != 0 || MiIsPageOnBadList((INT64)v7)) )
    goto LABEL_113;
  if( ((*((_QWORD *)v7 + 5) >> 60) & 7) == 2 )
  {
    if( v23 == 2 || (v2 & 8) != 0 )
      goto LABEL_113;
    _InterlockedAnd64((volatile signed __int64 *)v7 + 3, v22);
    __writecr8(v9);
    if( (unsigned int)MiSwapStackPage((__int64)v4, (__int64)v7, v32, *(_DWORD *)(a1 + 28), v2, &a6, &v49) )
      goto LABEL_104;
    if( ((*((_QWORD *)v7 + 5) >> 60) & 7) == 2 )
      goto LABEL_98;
    goto LABEL_59;
  }
  active = MiActivePageClaimCandidate(v4, (_MMPFN *)v7, 1ui64, v22);
  if( active )
  {
    *(_QWORD *)(a1 + 48) = active;
    goto LABEL_113;
  }
  if( LOBYTE(v50[1]) == 2 || (v2 & 8) != 0 )
    goto LABEL_113;
  LOBYTE(v40) = MI_PFN_IS_PROTO((UNICODE_STRING *)v7, v37, v38, v39);
  if( v40 )
    v42 = MiTrimSharedPage(v41, v9, v2);
  else
    v42 = MiStealPage(v41, v9, v2, (_DWORD)v32, *(_DWORD *)(a1 + 28), (__int64)&a6);
  _InterlockedAnd64((volatile signed __int64 *)v7 + 3, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v9);
  if( !v42 )
    goto LABEL_98;
  if( v42 == 2 )
  {
    v31 = MiLockPageInline((INT64)v7);
    goto LABEL_87;
  }
  if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)v7 + 5) >> 39) & 0x3FFi64)) != v4 )
  {
LABEL_97:
    MiLockAndInsertPageInFreeList((_MMPFN *)v7);
LABEL_98:
    v29 = 0i64;
    goto LABEL_99;
  }
LABEL_104:
  *((_QWORD *)v7 + 2) = ZeroPte;
  MiSetOriginalPtePfnFromFreeList((UINT64 *)v7 + 2);
  v45 = (_MMPFN *)v7;
  if( v56 )
  {
LABEL_102:
    MiLockAndInsertPageInFreeList(v45);
    goto LABEL_106;
  }
  _InterlockedOr(v47, 0);
  MiSetPfnTbFlushStamp((_MMPFN *)v7, (unsigned int)KiTbFlushTimeStamp, 0i64);
LABEL_106:
  v29 = 1i64;
  MiAddMdlPageToTradeBlock(a1, BugCheckParameter2, 1i64);
LABEL_99:
  result = v29;
  *(_QWORD *)(a1 + 40) = a6;
  return result;
}

Referenced by:

MiClaimPhysicalRun