MmRelocatePfnList

VOID __stdcall MmRelocatePfnList(){
  unsigned __int64 v0; 
  unsigned __int64 v1; 
  unsigned int v2; 
  unsigned int v3; 
  unsigned __int64 v4; 
  unsigned __int64 v5; 
  int v6; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v8; 
  SIZE_T v9; 
  unsigned __int64 FileObject; 
  _MMPFN *v11; 
  PVOID v12; 
  UINT64 *v13; 
  SIZE_T v14; 
  _MMPFN_IDENTITY Identity; 
  INT64 v16[2]; 
  __int64 v17; 
  UINT64 DrainStacks; 
  LODWORD(DrainStacks) = 0;
  v14 = 0i64;
  v17 = 0i64;
  v4 = v0;
  v5 = v1;
  memset(&Identity, 0, sizeof(Identity));
  *(_OWORD *)v16 = 0i64;
  if( v2 < (unsigned __int16)KeNumberNodes && v3 < MmNumberOfChannels )
  {
    v6 = (v2 << byte_140C4DBCC) | (v3 << byte_140C4DBCD);
    MiCreatePteCopyList(v1, 0x100ui64, (__int64)v16);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v8 = v4 + 24 * v5;
    MiLockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
    while( 1 )
    {
      if( v4 >= v8 )
      {
        MiUnlockDynamicMemoryShared((INT64)&MiSystemPartition, (INT64)CurrentThread);
        MiReleasePteCopyList((INT64)v16);
        return;
      }
      v9 = *(_QWORD *)(v4 + 8);
      FileObject = 0i64;
      Identity.u1.e1 = 0i64;
      Identity.u2.FileObject = 0i64;
      Identity.PageFrameIndex = v9;
      if( (unsigned int)MiIsPfn(v9) )
      {
        v11 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v9);
        MiIdentifyPfnWrapper(v11, &Identity);
        FileObject = (unsigned __int64)Identity.u2.FileObject;
        if( Identity.u2.FileObject == *(PVOID *)(v4 + 16)
          && ((*(_QWORD *)&Identity.u1.e1 ^ *(_QWORD *)v4) & 0x1FFFFFFFFFFFE00i64) == 0 )
        {
          if( !MiPfnsWorthTrying((_MI_PARTITION *)&MiSystemPartition, v11, 1ui64, 0i64, &DrainStacks, v13) )
          {
            if( (_DWORD)DrainStacks == 1 )
              MiEmptyKernelStackCache();
            if( !MiClaimPhysicalRun(
                    (__int64)&MiSystemPartition,
                    v9,
                    1i64,
                    0xFFFFFFFFFi64,
                    (__int64)v16,
                    0x400000,
                    v6,
                    0i64,
                    *((unsigned __int8 *)v11 + 34) >> 6,
                    &v14)
              && v14 != -1i64 )
            {
              Identity.PageFrameIndex = v14;
              goto LABEL_15;
            }
          }
          FileObject = (unsigned __int64)Identity.u2.FileObject;
        }
      }
      Identity.u2.FileObject = (PVOID)(FileObject | 2);
LABEL_15:
      v12 = Identity.u2.FileObject;
      *(_OWORD *)v4 = *(_OWORD *)&Identity.u1.e1;
      *(_QWORD *)(v4 + 16) = v12;
      v4 += 24i64;
    }
  }
}

Referenced by:

PfpPfnPrioRequest