MiInsertLargeUserMapping

CHAR __fastcall MiInsertLargeUserMapping(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, INT64 a5){
  _MMPTE *PteBase; 
  int v6; 
  unsigned __int64 v8; 
  __int64 v9; 
  unsigned __int64 v10; 
  INT64 v11; 
  UINT64 ValidPte; 
  unsigned int v13; 
  _MMPFN *UsedPtesHandle; 
  _ETHREAD *CurrentThread; 
  int v16; 
  PteBase = MmGetPteBase();
  v6 = a4;
  v8 = a2;
  if( (_DWORD)a4 != 2 )
  {
    v9 = (unsigned int)(2 - a4);
    do
    {
      v8 = (unsigned __int64)PteBase + ((v8 >> 9) & 0x7FFFFFFFF8i64);
      --v9;
    }
    while( v9 );
  }
  v10 = 16i64;
  v11 = (unsigned int)a5;
  LODWORD(v11) = a5 | 0x80000000;
  if( (*(_DWORD *)(a1 + 48) & 0x300000) == 3145728 )
    v11 = (unsigned int)a5;
  if( v6 != 2 )
    v10 = 1i64;
  if( v6 != 2 )
    v11 = (unsigned int)v11 | 0x4000000;
  ValidPte = MiMakeValidPte(a2, a3, v11);
  v13 = 0;
  if( (v8 < (unsigned __int64)MmGetPml4eBase() || v8 > (unsigned __int64)MmGetPml4eLimit())
    && !MI_READ_PTE_LOCK_FREE(v8) )
  {
    UsedPtesHandle = MiGetUsedPtesHandle((__int64)((v8 << 25) - ((_QWORD)PteBase << 25)) >> 16);
    MiIncreaseUsedPtesCount(UsedPtesHandle, (unsigned int)v10);
  }
  if( v6 == 2 )
  {
    do
    {
      *(_QWORD *)v8 = ValidPte;
      v8 += 8i64;
      ++v13;
      ValidPte ^= (ValidPte ^ (ValidPte + 4096)) & 0xFFFFFFFFF000i64;
      LOBYTE(CurrentThread) = v13;
    }
    while( v13 < v10 );
    return(char)CurrentThread;
  }
  v16 = 0;
  LODWORD(CurrentThread) = MiPteInShadowRange(v8);
  if( (_DWORD)CurrentThread )
  {
    LODWORD(CurrentThread) = MiPteHasShadow();
    if( (_DWORD)CurrentThread )
    {
      v16 = 1;
      if( !HIBYTE(word_140C4DD48) )
      {
LABEL_22:
        if( (ValidPte & 1) != 0 )
        {
          LOBYTE(CurrentThread) = 0;
          ValidPte |= 0x8000000000000000ui64;
        }
      }
    }
    else
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 23) + 2172i64) & 0x1000) != 0 )
        goto LABEL_22;
    }
  }
  *(_QWORD *)v8 = ValidPte;
  if( v16 )
    LOBYTE(CurrentThread) = MiWritePteShadow();
  return(char)CurrentThread;
}

Referenced by:

MiCommitExistingVad
MiMapUserLargePages