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