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