PspSetContextState

NTSTATUS __stdcall PspSetContextState(INT64 a1, _CONTEXT *a2){
  _DWORD *v4; 
  int v5; 
  UINT64 ContextFlags; 
  NTSTATUS result; 
  UINT64 ContextLength; 
  _CONTEXT_EX *ContextEx; 

  LODWORD(ContextLength) = 0;
  v4 = *(_DWORD **)(a1 + 1560);
  if( (*(_BYTE *)(a1 + 3) & 8) == 0 )
  {
    v5 = KUSER_SHARED_DATA.XState.EnabledFeatures != 0 ? 0x40 : 0;
    RtlGetExtendedContextLength((unsigned int)(v5 + 0x100000), &ContextLength);
    memset(v4, 0i64, ContextLength);
    RtlInitializeExtendedContext(v4, (unsigned int)(v5 + 0x100000), &ContextEx);
    v4[12] = 0x100000;
    _interlockedbittestandset((volatile signed __int32 *)a1, 0x1Bu);
  }
  ContextFlags = a2->ContextFlags;
  if( (a2->ContextFlags & 0x100040) == 1048640 )
  {
    v4[12] |= 0x100040u;
    ContextFlags = a2->ContextFlags;
  }
  RtlCopyContext(v4, ContextFlags, (_X86_NT5_CONTEXT *)a2);
  result = a2->ContextFlags & 0x100008;
  if( result == 1048584 )
  {
    LODWORD(ContextLength) = _mm_getcsr();
    a2->FltSave._MxCsr = ContextLength;
    result = 7999;
    a2->FltSave.ControlWord &= 0x1F3Fu;
  }
  return result;
}

Referenced by:

PspGetSetContextInternal