KiCopyUchToStagingArea

NTSTATUS __stdcall KiCopyUchToStagingArea(INT64 a1, INT64 *a2){
  __int64 v2; 
  unsigned __int64 v5; 
  __int64 v6; 
  __int64 v7; 
  _QWORD *v8; 
  _OWORD *v9; 
  _OWORD *v10; 
  __int64 v11; 
  __int128 v12; 
  INT64 v13; 

  v2 = *(_QWORD *)(a1 + 504);
  v5 = ((unsigned __int64)a2 + 2791) & 0xFFFFFFFFFFFFFFF0ui64;
  v6 = *(_QWORD *)(v2 + 32);
  v7 = v5 - v6;
  memmove((VOID *)(v5 - *(_QWORD *)(v2 + 40)), (const VOID *)(v6 - *(_QWORD *)(v2 + 40)), *(_QWORD *)(v2 + 40));
  v8 = (_QWORD *)(v7 + v2);
  *(_QWORD *)(a1 + 504) = v8;
  v8[11] += v7;
  v8[10] += v7;
  v9 = (_OWORD *)v8[8];
  v8[4] = v5;
  v10 = (_OWORD *)*a2;
  if( KUSER_SHARED_DATA.XState.EnabledFeatures )
  {
    v10[32] = v9[32];
    v10[33] = v9[33];
    v10[34] = v9[34];
    v10[35] = v9[35];
    KiCopyXStateArea(*a2, KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFDui64, v8[8]);
  }
  else
  {
    v11 = 4i64;
    do
    {
      *v10 = *v9;
      v10[1] = v9[1];
      v10[2] = v9[2];
      v10[3] = v9[3];
      v10[4] = v9[4];
      v10[5] = v9[5];
      v10[6] = v9[6];
      v10 += 8;
      v12 = v9[7];
      v9 += 8;
      *(v10 - 1) = v12;
      --v11;
    }
    while( v11 );
  }
  v13 = *a2;
  v8[8] = *a2;
  return v13;
}

Referenced by:

KeSynchronizeUmsThread