KeUpdateUmsThreadState
INT64 __fastcall KeUpdateUmsThreadState(INT64 a1, INT64 a2, CHAR a3){
_ETHREAD *CurrentThread;
int v5;
int v6;
__int64 v7;
signed __int64 *v8;
signed __int64 v9;
signed __int64 v10;
struct _KEVENT *Event;
__int64 v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Event = 0i64;
v5 = a2 - 1;
if( v5 )
{
v6 = v5 - 1;
if( v6 )
{
if( v6 == 1 )
_interlockedbittestandreset((volatile signed __int32 *)(a1 + 1264), 1u);
}
else
{
_interlockedbittestandset((volatile signed __int32 *)(a1 + 1264), 3u);
}
}
else
{
_interlockedbittestandset((volatile signed __int32 *)(a1 + 1264), 1u);
}
if( a3 )
{
KeRemoveUmsThreadCidOwnership(a1, 0);
v7 = *((_QWORD *)CurrentThread + 62);
v13 = v7;
v8 = *(signed __int64 **)(v7 + 8);
if( ((unsigned __int8)v8 & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)(v8 + 1) > 0x7FFFFFFF0000i64 || v8 + 1 < v8 )
{
MEMORY[0x7FFFFFFF0000] = 0;
v8 = *(signed __int64 **)(v7 + 8);
}
_m_prefetchw(v8);
v9 = *v8;
do
{
*(_QWORD *)a1 = v9;
v10 = v9;
v9 = _InterlockedCompareExchange64(v8, a1, v9);
}
while( v9 != v10 );
if( !v9 )
Event = *(struct _KEVENT **)(v13 + 16);
}
if( Event )
KeSetEvent(Event, 0);
return 0i64;
}Referenced by:
KiParkUmsThread
KiResumeUmsThread
KiSuspendUmsThread
PspDisassociateUmsThreadFromPrimary
PspGetSetContextInternal
PspInsertThread
PspUmsInitThread
PspUmsUnInitThread