PspSetContextState
INT64 __fastcall PspSetContextState(INT64 a1, CONTEXT *a2){
_CONTEXT *v4;
int v5;
UINT64 ContextFlags;
INT64 result;
size_t Size;
__int64 a3;
LODWORD(Size) = 0;
v4 = *(_CONTEXT **)(a1 + 1560);
if( (*(_BYTE *)(a1 + 3) & 8) == 0 )
{
v5 = KUSER_SHARED_DATA.XState.EnabledFeatures != 0 ? 0x40 : 0;
RtlGetExtendedContextLength((unsigned int)(v5 + 0x100000), &Size);
memset((INT64)v4, 0i64);
RtlInitializeExtendedContext((INT64)v4, (unsigned int)(v5 + 0x100000), &a3);
v4->ContextFlags = 0x100000;
_interlockedbittestandset((volatile signed __int32 *)a1, 0x1Bu);
}
ContextFlags = a2->ContextFlags;
if( (a2->ContextFlags & 0x100040) == 1048640 )
{
v4->ContextFlags |= 0x100040u;
ContextFlags = a2->ContextFlags;
}
RtlCopyContext(v4, ContextFlags, a2);
result = a2->ContextFlags & 0x100008;
if( (_DWORD)result == 1048584 )
{
LODWORD(Size) = _mm_getcsr();
a2->FltSave.MxCsr = Size;
result = 7999i64;
a2->FltSave.ControlWord &= 0x1F3Fu;
}
return result;
}Referenced by:
PspGetSetContextInternal