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