RtlCopyContext

INT64 __fastcall RtlCopyContext(_CONTEXT *Destination, UINT64 ContextFlags, _CONTEXT *Source){
  unsigned int v3; 
  _M128A *v6; 
  _M128A *XmmRegisters; 
  INT64 result; 
  _DWORD *v9; 
  INT64 v10; 
  int *v11; 
  unsigned int *v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  unsigned int v16; 
  UINT64 ChunksMask; 
  _DWORD *v18; 
  UINT64 v19; 
  LODWORD(ChunksMask) = 0;
  v3 = ContextFlags;
  LODWORD(v19) = 0;
  v6 = 0i64;
  XmmRegisters = 0i64;
  LODWORD(result) = RtlpValidateContextFlags((unsigned int)ContextFlags, 0i64);
  if( (int)result >= 0 )
  {
    LODWORD(v9) = RtlpGetContextFlagsLocation((INT64)Destination, v3);
    v18 = v9;
    LODWORD(v11) = RtlpGetContextFlagsLocation((INT64)Source, v10);
    v13 = *v12;
    v14 = *v11;
    LODWORD(result) = RtlpValidateContextFlags(v3 | *v11 | *v12, 0i64);
    if( (int)result >= 0 )
    {
      v15 = v3 & v14;
      LODWORD(result) = RtlpValidateContextFlags(v15, &ChunksMask);
      if( (int)result >= 0 )
      {
        LODWORD(result) = RtlpValidateContextFlags(v13, &v19);
        v16 = result;
        if( (int)result >= 0 )
        {
          if( (~(_DWORD)v19 & (unsigned int)ChunksMask) != 0 )
          {
            return 2147483653i64;
          }
          else
          {
            RtlpCopyLegacyContext(1, Destination, v15, Source);
            *v18 |= v13;
            if( (v19 & 0xFFFFFFFE) != 0 )
            {
              if( (v15 & 0x10000) != 0 )
              {
                XmmRegisters = (_M128A *)((char *)&Source->1 + 460);
                v6 = (_M128A *)((char *)&Destination->1 + 460);
                if( (v13 & 0x10020) != 65568 && (v15 & 0x10020) == 65568 )
                  *((_DWORD *)&Destination->1 + 118) = 716;
              }
              else if( (v3 & 0x100000) != 0 )
              {
                XmmRegisters = (_M128A *)&Source[1];
                v6 = (_M128A *)&Destination[1];
              }
              else if( (v3 & 0x200000) != 0 )
              {
                XmmRegisters = Source->FltSave.XmmRegisters;
                v6 = Destination->FltSave.XmmRegisters;
              }
              else if( (v3 & 0x400000) != 0 )
              {
                XmmRegisters = &Source->VectorRegister[9];
                v6 = &Destination->VectorRegister[9];
              }
            }
            if( (ChunksMask & 2) == 0 )
              return v16;
            result = RtlpCopyXStateChunk(1, (INT64)v6, (INT64)v6, (INT64)XmmRegisters, (INT64)XmmRegisters);
            v16 = result;
            if( (int)result >= 0 )
              return v16;
          }
        }
      }
    }
  }
  return result;
}

Referenced by:

PspGetSetContextInternal
PspInitializeThunkContext
PspSetContextState
PspWow64GetContextThread
PspWow64SetContextThread