MiTradeTransitionPage

NTSTATUS __fastcall MiTradeTransitionPage(_MMPFN *Pfn1, UINT8 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
  unsigned __int64 v6; 
  int v7; 
  int v9; 
  ULONG_PTR *v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  int v13; 
  NTSTATUS PfnChannel; 
  UINT64 v15; 
  unsigned int v16; 
  __int64 v17; 
  __int64 v18; 
  _MMPFN *v19; 
  unsigned __int64 v20; 
  int v21; 
  int v22; 
  _MMPTE_COPY_LIST *v23; 
  NTSTATUS v25; 
  ULONG_PTR *v26; 

  v6 = a2;
  v7 = a4;
  if( Pfn1->u3.ReferenceCount )
  {
    _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_26:
    __writecr8(v6);
    return 0;
  }
  if( !MiCanPageMove(Pfn1) || (LOBYTE(v9) = MiIsPfnFromSlabAllocation((INT64)Pfn1), v9) )
  {
    _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    goto LABEL_26;
  }
  v10 = *(ULONG_PTR **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
  v26 = v10;
  _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v6);
  v11 = Pfn1 - MmGetPfnDb();
  if( v7 == -1 )
  {
    LODWORD(v12) = MiSearchNumaNodeTable((PVOID)v11);
    v13 = *(_DWORD *)(v12 + 8);
    PfnChannel = MiGetPfnChannel((INT64)Pfn1);
    v15 = 128i64;
    v16 = (PfnChannel << *(&stru_140C4DB30 + 157)) | *(&stru_140C4DB30 + 66) & v11 | (v13 << *(&stru_140C4DB30 + 156));
    if( (a5 & 0x3000000) != 0 )
      v15 = 65664i64;
  }
  else
  {
    v15 = 48i64;
    v16 = *(&stru_140C4DB30 + 66) & v11 | v7 & ~*(&stru_140C4DB30 + 66);
  }
  LODWORD(v17) = MiGetPage(v10, v16, v15);
  v18 = v17;
  if( v17 == -1 )
    return 1;
  v19 = &MmGetPfnDb()[v17];
  v20 = MiLockPageInline(Pfn1);
  if( v19 == Pfn1 )
  {
    v18 = -1i64;
    goto LABEL_18;
  }
  if( v11 > 0xFFFFFFFFFi64
    || (MmGetPfnDb()[v11].u4._bf_0 & 0x4000000000000i64) == 0
    || (LOBYTE(v21) = MiIsPfnFileOnly((INT64)Pfn1), v21 == 1) )
  {
    LODWORD(v23) = 0;
LABEL_23:
    v25 = (int)v23;
    goto LABEL_22;
  }
  LOBYTE(v22) = MiIsPfnFromSlabAllocation((INT64)Pfn1);
  LODWORD(v23) = 0;
  if( v22
    || Pfn1->u3.ReferenceCount
    || v26 != *(ULONG_PTR **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF))
    || !MiCanPageMove(Pfn1) )
  {
    goto LABEL_23;
  }
  if( (unsigned __int8)((*(_BYTE *)(&Pfn1->u3 + 1) & 7) - 2) > 2u )
  {
    v25 = 2;
LABEL_22:
    _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v20);
    MiReleaseFreshPage(v19);
    return v25;
  }
  MiReplaceTransitionPage(Pfn1, v19, v23);
LABEL_18:
  Pfn1->OriginalPte = ZeroPte;
  MiSetOriginalPtePfnFromFreeList(&Pfn1->OriginalPte.u.Long);
  _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v20);
  if( a6 )
    *(_QWORD *)a6 = v18;
  return 3;
}

Referenced by:

MiTradePage