KiSignalThread

VOID __stdcall KiSignalThread(_KPRCB *Prcb, _ETHREAD *Thread, INT64 WaitStatus, _KWAIT_BLOCK *WaitBlock){
  char v6; 
  int v8; 
  __int64 v9; 
  __int64 v10; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v12; 
  _ETHREAD **v13; 
  char v14; 
  __int64 v15; 
  __int64 v16; 
  UINT64 SpinCount; 
  v6 = *((_BYTE *)Thread + 112);
  v8 = v6 & 7;
  if( v8 == 1 || v8 == 4 )
  {
    v9 = *((_QWORD *)Thread + 29);
    if( v9 )
    {
      if( (*(_BYTE *)v9 & 0x7F) == 21 )
      {
        *((_DWORD *)Thread + 135) = (unsigned __int8)*((_DWORD *)Thread + 135);
        _InterlockedIncrement((volatile signed __int32 *)(v9 + 4i64 * *((unsigned int *)Thread + 135) + 536));
      }
      else
      {
        _InterlockedIncrement((volatile signed __int32 *)(v9 + 40));
      }
    }
    v10 = *((_QWORD *)Thread + 89);
    if( v10 )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v10 + 31760), 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(_QWORD *)(v10 + 31760) );
        v16 = *((_QWORD *)CurrentPrcb + 4247);
        if( v16 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
          ++*(_DWORD *)(v16 + 24);
      }
      if( *((_QWORD *)Thread + 89) )
      {
        v12 = *((_QWORD *)Thread + 27);
        v13 = (_ETHREAD **)*((_QWORD *)Thread + 28);
        if( *(_ETHREAD **)(v12 + 8) != (_ETHREAD *)((char *)Thread + 216) || *v13 != (_ETHREAD *)((char *)Thread + 216) )
          __fastfail(3u);
        *v13 = (_ETHREAD *)v12;
        *(_QWORD *)(v12 + 8) = v13;
        *((_QWORD *)Thread + 89) = 0i64;
      }
      _InterlockedAnd64((volatile signed __int64 *)(v10 + 31760), 0i64);
    }
    v14 = *((_BYTE *)Thread + 388);
    if( v14 == 1 )
    {
      *((_DWORD *)Thread + 29) |= 2u;
    }
    else if( v14 == 5 )
    {
      v15 = KUSER_SHARED_DATA.TickCount.LowPart - *((_DWORD *)Thread + 109);
      if( *((_BYTE *)Thread + 391) )
        *((_QWORD *)Thread + 125) += v15;
      else
        *((_QWORD *)Thread + 124) += v15;
    }
    *((_BYTE *)Thread + 388) = 7;
    *((_QWORD *)Thread + 27) = *((_QWORD *)Prcb + 1441);
    *((_QWORD *)Prcb + 1441) = (char *)Thread + 216;
    *((_QWORD *)Thread + 25) = WaitStatus;
    *((_QWORD *)Thread + 122) = 0i64;
  }
  else if( WaitBlock )
  {
    if( (v6 & 7) != 0 )
    {
      if( v8 == 5 )
      {
        *((_BYTE *)Thread + 112) = v6 & 0xF8 | 6;
      }
      else if( v8 == 3 )
      {
        WaitBlock->BlockState = 2;
      }
    }
    else
    {
      *((_BYTE *)Thread + 112) = v6 & 0xF8 | 2;
      *((_QWORD *)Thread + 25) = WaitStatus;
      *((_QWORD *)Thread + 122) = 0i64;
      WaitBlock->BlockState = 0;
    }
  }
}

Referenced by:

KeAlertThread
KeAlertThreadByThreadId
KiResumeThread
KiSuspendThread
KiTryUnwaitThreadWithPriority
KiWakeOtherQueueWaiters
KiWakeQueueWaiter