MiCopyLargeVad

NTSTATUS __stdcall MiCopyLargeVad(ULONG_PTR ProcessToInitialize, _MMVAD_SHORT *SourceVad, _MMVAD_SHORT *TargetVad){
  int v5; 
  __int64 ********VadEvent; 
  __int64 v7; 
  void *v8; 
  int v9; 
  int v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  unsigned __int64 v14; 
  char *v15; 
  unsigned __int64 v16; 
  unsigned __int64 v17; 
  VOID *v18; 
  VOID *v19; 
  VOID *LockedBuffer; 
  VOID *v21; 
  VOID *LockVariable; 
  VOID *Src; 
  PVOID Process; 
  _KAPC_STATE ApcState; 

  Process = *(PVOID *)&ProcessToInitialize;
  Src = 0i64;
  LockVariable = 0i64;
  v21 = 0i64;
  LockedBuffer = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  MiLocateLockedVadEvent((__int64)TargetVad, 16);
  VadEvent = MiLocateVadEvent((__int64)SourceVad, v5);
  if( v7 )
  {
    *(_BYTE *)(v7 + 8) = *((_BYTE *)VadEvent + 8);
    *(_QWORD *)(v7 + 16) = VadEvent[2];
  }
  KiStackAttachProcess(v8, 0i64, &ApcState);
  v9 = MiMapUserLargePages(TargetVad, 0i64);
  KiUnstackDetachProcess(&ApcState, 0i64);
  if( v9 < 0 )
    return v9;
  v11 = 0;
  v12 = 4292870144i64;
  v13 = TargetVad->u.LongFlags & 0x200;
  v14 = SourceVad->StartingVpn | ((unsigned __int64)SourceVad->StartingVpnHigh << 32);
  v15 = (char *)(v14 << 12);
  v16 = ((SourceVad->EndingVpn | ((unsigned __int64)SourceVad->EndingVpnHigh << 32)) - v14 + 1) << 12;
  while( v16 )
  {
    v17 = v12;
    if( v16 <= v12 )
      v17 = v16;
    v11 = ExLockUserBuffer(v15, (unsigned int)v17, 1, IoReadAccess, &Src, &LockVariable);
    if( v11 < 0 )
      goto LABEL_9;
    KiStackAttachProcess(Process, 0i64, &ApcState);
    v18 = v15;
    if( v13 )
    {
      v19 = 0i64;
      LockedBuffer = v15;
      v21 = 0i64;
    }
    else
    {
      v11 = ExLockUserBuffer(v15, (unsigned int)v17, 1, IoWriteAccess, &LockedBuffer, &v21);
      if( v11 < 0 )
      {
        KiUnstackDetachProcess(&ApcState, 0i64);
        ExUnlockUserBuffer(LockVariable);
LABEL_9:
        v12 = (v17 >> 1) & 0x7FFFFFFFFFE00000i64;
        if( v12 < 0x200000 )
          return v11;
        continue;
      }
      v19 = v21;
      v18 = LockedBuffer;
    }
    memmove(v18, Src, v17);
    if( !v13 )
      ExUnlockUserBuffer(v19);
    KiUnstackDetachProcess(&ApcState, 0i64);
    ExUnlockUserBuffer(LockVariable);
    v16 -= v17;
    v15 += v17;
  }
  return v11;
}

Referenced by:

MiMapChildLargePageVads