RtlCopyContext
NTSTATUS __stdcall RtlCopyContext(_X86_NT5_CONTEXT *Destination, UINT64 ContextFlags, _X86_NT5_CONTEXT *Source){
unsigned int v3;
_CONTEXT_EX *v6;
_CONTEXT_EX *SourceLayout;
NTSTATUS result;
_DWORD *v9;
INT64 v10;
int *v11;
unsigned int *v12;
unsigned int v13;
int v14;
unsigned int v15;
NTSTATUS v16;
UINT64 ChunksMask;
_DWORD *v18;
UINT64 v19;
LODWORD(ChunksMask) = 0;
v3 = ContextFlags;
LODWORD(v19) = 0;
v6 = 0i64;
SourceLayout = 0i64;
result = RtlpValidateContextFlags((unsigned int)ContextFlags, 0i64);
if( result >= 0 )
{
LODWORD(v9) = RtlpGetContextFlagsLocation((INT64)Destination, v3);
v18 = v9;
LODWORD(v11) = RtlpGetContextFlagsLocation((INT64)Source, v10);
v13 = *v12;
v14 = *v11;
result = RtlpValidateContextFlags(v3 | *v11 | *v12, 0i64);
if( result >= 0 )
{
v15 = v3 & v14;
result = RtlpValidateContextFlags(v15, &ChunksMask);
if( result >= 0 )
{
result = RtlpValidateContextFlags(v13, &v19);
v16 = result;
if( result >= 0 )
{
if( (~(_DWORD)v19 & (unsigned int)ChunksMask) != 0 )
{
return -2147483643;
}
else
{
RtlpCopyLegacyContext(1, (_CONTEXT *)Destination, v15, (_CONTEXT *)Source);
*v18 |= v13;
if( (v19 & 0xFFFFFFFE) != 0 )
{
if( (v15 & 0x10000) != 0 )
{
SourceLayout = (_CONTEXT_EX *)(Source + 179);
v6 = (_CONTEXT_EX *)(Destination + 179);
if( (v13 & 0x10020) != 65568 && (v15 & 0x10020) == 65568 )
Destination[182] = 716;
}
else if( (v3 & 0x100000) != 0 )
{
SourceLayout = (_CONTEXT_EX *)(Source + 308);
v6 = (_CONTEXT_EX *)(Destination + 308);
}
else if( (v3 & 0x200000) != 0 )
{
SourceLayout = (_CONTEXT_EX *)(Source + 104);
v6 = (_CONTEXT_EX *)(Destination + 104);
}
else if( (v3 & 0x400000) != 0 )
{
SourceLayout = (_CONTEXT_EX *)(Source + 228);
v6 = (_CONTEXT_EX *)(Destination + 228);
}
}
if( (ChunksMask & 2) == 0 )
return v16;
result = RtlpCopyXStateChunk(1, v6, v6, SourceLayout, SourceLayout);
v16 = result;
if( result >= 0 )
return v16;
}
}
}
}
}
return result;
}Referenced by:
PspGetSetContextInternal
PspInitializeThunkContext
PspSetContextState
PspWow64GetContextThread
PspWow64SetContextThread