MiMapLockedPagesInUserSpaceHelper

VOID __stdcall MiMapLockedPagesInUserSpaceHelper(
        VOID *Va,
        UINT64 *Page,
        UINT64 *OldPage,
        _MEMORY_CACHING_TYPE CacheType,
        UINT64 NumberOfPages,
        _MMVAD *Vad,
        UINT64 Priority){
  _EPROCESS *Process; 
  UINT64 v10; 
  unsigned int v11; 
  unsigned int v12; 
  _MMSUPPORT_INSTANCE *p_Instance; 
  char *v14; 
  UINT8 v15; 
  UINT8 v16; 
  unsigned int v17; 
  _MMPFN *PfnDb; 
  char v19; 
  UINT64 v20; 
  int v21; 
  UINT64 v22; 
  UINT64 v23; 
  signed __int64 v25; 

  Process = KeGetCurrentThread()->ApcState.Process;
  v10 = (UINT64)MmGetPteBase() + (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64);
  v11 = (((int)Priority >> 31) & 0xFFFFFFFD) + 4;
  if( CacheType )
  {
    if( CacheType == MmWriteCombined )
      v11 |= 0x18u;
  }
  else
  {
    v11 |= 8u;
  }
  v12 = (unsigned int)Vad;
  p_Instance = &Process->Vm.Instance;
  if( Vad )
  {
    MiInsertVad(Vad, Process);
    v12 = (Vad->Core.u.LongFlags >> 12) & 0x3F;
  }
  v14 = 0i64;
  MiLockWorkingSetShared();
  v16 = v15;
  v25 = (char *)Page - (((unsigned __int64)Va >> 9) & 0x7FFFFFFFF8i64) - (char *)MmGetPteBase();
  do
  {
    v17 = v11;
    if( OldPage )
    {
      PfnDb = MmGetPfnDb();
      v17 = (unsigned __int8)*((_DWORD *)&PfnDb[*OldPage].3 + 4) >> 5;
      v19 = *((_BYTE *)&PfnDb[*OldPage].u3 + 2) >> 6;
      if( v19 == 2 )
      {
        v17 |= 0x18u;
      }
      else if( !v19 )
      {
        v17 |= 8u;
      }
      ++OldPage;
    }
    if( !v14 )
      goto LABEL_23;
    if( (v10 & 0xFFF) == 0 )
    {
      MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v14);
LABEL_23:
      LODWORD(v23) = 0;
      v14 = (char *)MmGetPteBase() + ((v10 >> 9) & 0x7FFFFFFFF8i64);
      MiMakeSystemAddressValid((VOID *)v10, 0i64, v12, v16, v23);
    }
    MiInsertPhysicalPteMapping(v10, *(_QWORD *)(v25 + v10), v17);
    v10 += 8i64;
    if( (v10 & 0x78) == 0 )
    {
      LOBYTE(v21) = MiWorkingSetIsContended((INT64)p_Instance);
      if( v21
        || (unsigned int)MiPageTableLockIsContended((__int64)p_Instance, (UINT64)v14)
        || (unsigned int)KeShouldYieldProcessor() )
      {
        MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v14);
        LOBYTE(v22) = v16;
        MiUnlockWorkingSetShared(p_Instance, v22);
        v14 = 0i64;
        MiLockWorkingSetShared();
      }
    }
    --NumberOfPages;
  }
  while( NumberOfPages );
  if( v14 )
    MiUnlockPageTableInternal((INT64)p_Instance, (UINT64)v14);
  LOBYTE(v20) = v16;
  MiUnlockWorkingSetShared(p_Instance, v20);
}

Referenced by:

MiMapLockedPagesInUserSpace
MmRotatePhysicalView