MiInsertLargeVadMapping

NTSTATUS __stdcall MiInsertLargeVadMapping(UINT64 a1, UINT64 a2, INT64 a3, UINT64 *a4, INT64 a5){
  int v8; 
  _EPROCESS *Process; 
  _MMPFN *v10; 
  ULONG_PTR v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  int v18; 
  __int64 v20[5]; 

  v8 = a3;
  Process = KeGetCurrentThread()->ApcState.Process;
  v10 = MiLockProtoPoolPage((_MMPTE *)a2, 0i64);
  v11 = (unsigned int)v10;
  if( !v10 )
    return 0;
  LODWORD(v12) = MI_READ_PTE_LOCK_FREE(a2);
  v20[0] = v12;
  v13 = v12;
  MiUnlockProtoPoolPage(v11, 0x11u);
  MiPteInShadowRange((UINT64)v20);
  v14 = 0xFFFFC0000i64;
  if( v8 != 2 )
    v14 = 0xFFFFFFE00i64;
  LODWORD(v15) = MiMakeValidPte(
                   (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64)),
                   (v13 >> 12) & v14,
                   (unsigned int)a5 | 0x84000000);
  v20[0] = v15;
  v16 = v15;
  if( v8 != 1 && _InterlockedCompareExchange(&MiGetSharedVm(&Process->Vm.Instance)->WorkingSetLock, 0x80000000, 1) != 1 )
    return 0;
  v17 = v16;
  LOBYTE(v18) = MiPteInShadowRange((UINT64)a4);
  if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v16 & 1) != 0 )
    v17 = v16 | 0x8000000000000000ui64;
  *a4 = v17;
  if( v8 != 1 )
    MiGetSharedVm(&Process->Vm.Instance)->WorkingSetLock = 1;
  return 1;
}

Referenced by:

MiInPagePageTable