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