MiDoneWithThisPageGetAnother

__int64 __fastcall MiDoneWithThisPageGetAnother(__int64 *a1, __int64 a2, __int64 a3, unsigned __int8 a4){
  INT64 v4; 
  __int64 v5; 
  signed __int32 v9; 
  unsigned int v10; 
  _MI_PARTITION *v11; 
  UINT64 v12; 
  INT64 *SharedVm; 
  unsigned __int8 v14; 
  __int64 Page; 
  __int64 result; 
  _MMPFN *PfnDb; 
  __int128 v18; 
  v4 = a2 + 1664;
  v5 = *a1;
  v18 = 0i64;
  if( v5 != -1 )
    MiFinishLastForkPageTable((UINT64)a1, v5);
  MiInitializePageColorBase(v4, 0i64, (INT64)&v18);
  v9 = _InterlockedExchangeAdd((volatile signed __int32 *)v18, 1u);
  v10 = HIDWORD(v18) | v9 & DWORD2(v18);
  v11 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a3 + 1838));
  while( 1 )
  {
    Page = MiGetPage(v11, v10, 0x302ui64);
    *a1 = Page;
    if( Page != -1 )
      break;
    MiUnlockWorkingSetExclusive(v4, a4);
    MiWaitForFreePage(v11, v12);
    SharedVm = MiGetSharedVm(v4);
    v14 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
    *((_DWORD *)SharedVm + 1) = 0;
    a4 = v14;
  }
  result = 6 * Page;
  PfnDb = MmGetPfnDb();
  *((_QWORD *)PfnDb + result + 2) &= 0xFFFFFFFFFC00FFFFui64;
  return result;
}

Referenced by:

MiUpdateForkMaps