KeCopyContextToUmsContext
NTSTATUS __stdcall KeCopyContextToUmsContext(INT64 a1, INT64 a2){
__int64 v4;
int v5;
_OWORD *v6;
_OWORD *v7;
_WORD *v9;
UINT64 ContextFlags;
int v11;
v11 = *(_DWORD *)(a2 + 48);
LODWORD(ContextFlags) = v11 & 0x100013;
RtlpSanitizeContextFlags(&ContextFlags, 1);
RtlpCopyLegacyContext(1, (_CONTEXT *)(a1 + 16), (unsigned int)ContextFlags, (_CONTEXT *)a2);
v9 = (_WORD *)((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64);
v4 = 4i64;
if( (*(_DWORD *)(a1 + 1264) & 4) == 0 )
{
*(_WORD *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 2) = 0;
*(_BYTE *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 4) = 0;
if( KUSER_SHARED_DATA.XState.EnabledFeatures )
{
memset(v9 + 256, 0i64, 0x40u);
*(_QWORD *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x200) = 3i64;
}
}
*(_DWORD *)(a1 + 1264) |= 4u;
v5 = v11;
if( (v11 & 0x100040) == 1048640 && KUSER_SHARED_DATA.XState.EnabledFeatures )
KiCopyXStateArea(
(INT64)v9,
KUSER_SHARED_DATA.XState.EnabledFeatures & 0xFFFFFFFFFFFFFFFCui64,
*(int *)(a2 + 1248) + a2 + 720);
if( (v5 & 0x100008) == 1048584 )
{
v6 = (_OWORD *)((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64);
v7 = (_OWORD *)(a2 + 256);
do
{
*v6 = *v7;
v6[1] = v7[1];
v6[2] = v7[2];
v6[3] = v7[3];
v6[4] = v7[4];
v6[5] = v7[5];
v6[6] = v7[6];
v6 += 8;
*(v6 - 1) = v7[7];
v7 += 8;
--v4;
}
while( v4 );
*v9 = *(_WORD *)(a2 + 256) & 0x1F3F;
*(_DWORD *)(((a1 + 1375) & 0xFFFFFFFFFFFFFFC0ui64) + 0x18) = KiMxCsrMask & *(_DWORD *)(a2 + 52);
}
if( (v5 & 0x100010) == 1048592 )
{
if( (*(_DWORD *)(a1 + 128) & 0x355i64) != 0 )
_interlockedbittestandset((volatile signed __int32 *)(a1 + 1264), 4u);
else
_interlockedbittestandreset((volatile signed __int32 *)(a1 + 1264), 4u);
}
return 0;
}Referenced by:
PspSetUmsThreadContext