KeCopyContextFromUch
INT64 __stdcall KeCopyContextFromUch(CONTEXT *ContextFrame, INT64 a2){
unsigned int ContextFlags;
__int64 P3Home_low;
INT64 result;
$A4EAF4AB0A1E48B90F4960D2627C8AED *v7;
_OWORD *v8;
__int64 v9;
__int128 v10;
unsigned int v11;
char v12;
int v13;
UINT64 v14;
ContextFlags = ContextFrame->ContextFlags;
LODWORD(v14) = ContextFlags & 0x100013;
RtlpSanitizeContextFlags(&v14, 1);
ContextFrame->ContextFlags = v14;
KeContextFromKframes(*(_KTRAP_FRAME **)(a2 + 80), *(_KEXCEPTION_FRAME **)(a2 + 88), ContextFrame);
if( (ContextFlags & 0x100040) == 1048640 && KUSER_SHARED_DATA.XState.EnabledFeatures )
{
ContextFrame->ContextFlags |= 0x100040u;
P3Home_low = SLODWORD(ContextFrame[1].P3Home);
if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
KiCopyXStateArea(
(INT64)&ContextFrame->1 + P3Home_low + 464,
KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64,
*(_QWORD *)(a2 + 64));
else
*(unsigned __int64 *)((char *)&ContextFrame[1].P1Home + P3Home_low) = 0i64;
}
result = ContextFlags & 0x100008;
if( (_DWORD)result == 1048584 )
{
ContextFrame->ContextFlags |= 0x100008u;
v7 = &ContextFrame->256;
if( (*(_BYTE *)(a2 + 72) & 1) != 0 )
{
v8 = *(_OWORD **)(a2 + 64);
v9 = 4i64;
do
{
*(_OWORD *)&v7->FltSave.ControlWord = *v8;
v7->Header[1] = (_M128A)v8[1];
v7->Legacy[0] = (_M128A)v8[2];
v7->Legacy[1] = (_M128A)v8[3];
v7->Legacy[2] = (_M128A)v8[4];
v7->Legacy[3] = (_M128A)v8[5];
v7->Legacy[4] = (_M128A)v8[6];
v7 = ($A4EAF4AB0A1E48B90F4960D2627C8AED *)((char *)v7 + 128);
v10 = v8[7];
v8 += 8;
*((_OWORD *)&v7[-1].1 + 31) = v10;
--v9;
}
while( v9 );
ContextFrame->Xmm0 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 112i64);
ContextFrame->Xmm1 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 128i64);
ContextFrame->Xmm2 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 144i64);
ContextFrame->Xmm3 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 160i64);
ContextFrame->Xmm4 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 176i64);
ContextFrame->Xmm5 = *(_M128A *)(*(_QWORD *)(a2 + 80) + 192i64);
}
else
{
memset((INT64)&ContextFrame->256, 0i64);
v7->FltSave.ControlWord = **(_WORD **)(a2 + 64);
}
ContextFrame->Xmm6 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 48i64);
ContextFrame->Xmm7 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 64i64);
ContextFrame->Xmm8 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 80i64);
ContextFrame->Xmm9 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 96i64);
ContextFrame->Xmm10 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 112i64);
ContextFrame->Xmm11 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 128i64);
ContextFrame->Xmm12 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 144i64);
ContextFrame->Xmm13 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 160i64);
ContextFrame->Xmm14 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 176i64);
ContextFrame->Xmm15 = *(_M128A *)(*(_QWORD *)(a2 + 88) + 192i64);
ContextFrame->FltSave.MxCsr = *(_DWORD *)(*(_QWORD *)(a2 + 80) + 44i64);
result = *(_QWORD *)(a2 + 80);
ContextFrame->MxCsr = *(_DWORD *)(result + 44);
}
if( (ContextFlags & 0x40000000) != 0 )
{
v11 = ContextFrame->ContextFlags | 0x80000000;
ContextFrame->ContextFlags = v11;
result = *(_QWORD *)(a2 + 80);
v12 = *(_BYTE *)(result + 43);
if( v12 == 1 )
{
v13 = v11 | 0x8000000;
}
else
{
if( v12 != 2 )
return result;
v13 = v11 | 0x10000000;
}
ContextFrame->ContextFlags = v13;
}
return result;
}Referenced by:
PspGetSetContextInternal