KeUpdateUmsThreadState
NTSTATUS __stdcall KeUpdateUmsThreadState(INT64 a1, INT64 a2, CHAR a3){
_ETHREAD *CurrentThread;
int v5;
int v6;
_QWORD *Object;
signed __int64 *v8;
signed __int64 v9;
signed __int64 v10;
_KEVENT *Event;
_QWORD *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);
Object = CurrentThread->Tcb.WaitBlock[3].Object;
v13 = Object;
v8 = (signed __int64 *)Object[1];
if( ((unsigned __int8)v8 & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)(v8 + 1) > 0x7FFFFFFF0000i64 || v8 + 1 < v8 )
{
MEMORY[0x7FFFFFFF0000] = 0;
v8 = (signed __int64 *)Object[1];
}
_m_prefetchw(v8);
v9 = *v8;
do
{
*(_QWORD *)a1 = v9;
v10 = v9;
v9 = _InterlockedCompareExchange64(v8, a1, v9);
}
while( v9 != v10 );
if( !v9 )
Event = (_KEVENT *)v13[2];
}
if( Event )
KeSetEvent(Event, 0, 0);
return 0;
}Referenced by:
KiParkUmsThread
KiResumeUmsThread
KiSuspendUmsThread
PspDisassociateUmsThreadFromPrimary
PspGetSetContextInternal
PspInsertThread
PspUmsInitThread
PspUmsUnInitThread