KiResumeThread

VOID __stdcall KiResumeThread(_ETHREAD *Thread, _KPRCB *Prcb, UINT8 ForceResume){
  _ETHREAD *v6; 
  _ETHREAD *v7; 
  unsigned __int8 v8; 
  unsigned __int8 i; 
  __int64 v10; 
  _BYTE *v11; 
  char v12; 
  __int64 *v13; 
  int v14; 
  unsigned int v15; 
  char v16; 
  _KWAIT_BLOCK *v17; 
  unsigned __int8 WaitType; 
  INT64 WaitKey; 
  _LARGE_INTEGER v20; 
  _KQUEUE *NotificationQueue; 
  _LIST_ENTRY *p_WaitListHead; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v24; 
  int SignalState; 
  _LIST_ENTRY *Blink; 
  UINT64 SpinCount; 
  UINT64 Hand; 
  UINT64 v29; 
  LODWORD(Hand) = 0;
  *((_DWORD *)Thread + 185) = 1;
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)Thread + 8) );
  }
  if( *((_BYTE *)Thread + 388) == 5 && (*((_BYTE *)Thread + 112) & 7) == 4 )
  {
    if( !ForceResume )
    {
      *((_BYTE *)Thread + 112) = *((_BYTE *)Thread + 112) & 0xF8 | 5;
      KiReleaseThreadLockSafe((INT64)Thread);
      v8 = *((_BYTE *)Thread + 587);
      for( i = 0; i < v8; ++i )
      {
        v10 = *((_QWORD *)Thread + 26) + 48i64 * i;
        if( *(_BYTE *)(v10 + 17) == 6 )
        {
          v11 = *(_BYTE **)(v10 + 32);
          *(_BYTE *)(v10 + 17) = 4;
          KiAcquireKobjectLockSafe(v11);
          if( *((int *)v11 + 1) > 0 || (v12 = *v11 & 0x7F, v12 == 2) )
          {
            _InterlockedAnd((volatile signed __int32 *)v11, 0xFFFFFF7F);
            *(_BYTE *)(v10 + 17) = 5;
            ForceResume = 1;
            break;
          }
          v13 = (__int64 *)*((_QWORD *)v11 + 2);
          if( (_BYTE *)*v13 != v11 + 8 )
LABEL_60:
            __fastfail(3u);
          *(_QWORD *)v10 = v11 + 8;
          *(_QWORD *)(v10 + 8) = v13;
          *v13 = v10;
          *((_QWORD *)v11 + 2) = v10;
          _InterlockedAnd((volatile signed __int32 *)v11, 0xFFFFFF7F);
        }
      }
      v14 = 0;
      if( (*((_DWORD *)Thread + 29) & 0x20000) != 0 && !ForceResume )
      {
        v20 = *(_LARGE_INTEGER *)((char *)Thread + 280);
        *((_DWORD *)Thread + 64) |= 0x40000080u;
        if( (unsigned int)KiComputeDueTime((_KTIMER *)((char *)Thread + 256), v20, 0, &Hand) )
        {
          if( KiInsertTimerTable(Prcb, (_KTIMER *)((char *)Thread + 256), 0i64, (unsigned int)Hand, 0i64) )
            _InterlockedAnd((volatile signed __int32 *)Thread + 64, 0xFFFFFF7F);
          else
            KiTimerWaitTest(Prcb, (_KTIMER *)((char *)Thread + 256), 0i64);
          v14 = 1;
        }
        else
        {
          ForceResume = 1;
          v14 = 0;
        }
      }
      LODWORD(v29) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
      {
        do
          KeYieldProcessorEx(&v29);
        while( *((_QWORD *)Thread + 8) );
      }
      v15 = *((_DWORD *)Thread + 29) & 0xFFFDFDFF | (v14 << 9) & 0xFFFDFFFF;
      v16 = *((_BYTE *)Thread + 112) & 0xE7;
      *((_DWORD *)Thread + 29) = v15;
      if( v16 != 5
        || (unsigned int)KiTestForAlertPending((__int64)Thread, (v15 & 0x10) != 0, *((_BYTE *)Thread + 391), 0) )
      {
        ForceResume = 1;
      }
      else if( *((_BYTE *)Thread + 643) == 37 && (*((_BYTE *)Thread + 120) & 0x10) != 0 )
      {
        ForceResume = 1;
      }
    }
    *((_BYTE *)Thread + 112) = *((_BYTE *)Thread + 112) & 0xF8 | 1;
  }
  if( ForceResume )
  {
    if( (*((_DWORD *)Thread + 30) & 0x8000) != 0 )
    {
      if( *((_BYTE *)Thread + 388) == 5 )
        KiSignalThread(Prcb, Thread, 256i64, 0i64);
    }
    else
    {
      KiSignalThreadForApc(Prcb, (_KAPC *)((char *)Thread + 648), 2u);
    }
  }
  KiReleaseThreadLockSafe((INT64)Thread);
  v6 = (_ETHREAD *)((char *)Thread + 744);
  v7 = (_ETHREAD *)*((_QWORD *)Thread + 93);
  if( v7 != (_ETHREAD *)((char *)Thread + 744) )
  {
    while( 1 )
    {
      v17 = (_KWAIT_BLOCK *)v7;
      v7 = *(_ETHREAD **)v7;
      WaitType = v17->WaitType;
      if( WaitType == 1 )
        break;
      if( WaitType != 2 )
      {
        WaitKey = 256i64;
        goto LABEL_29;
      }
      v17->BlockState = 5;
      NotificationQueue = v17->NotificationQueue;
      v17->WaitListEntry.Flink = 0i64;
      p_WaitListHead = &NotificationQueue->Header.WaitListHead;
      KeGetCurrentIrql();
      __writecr8(2ui64);
      CurrentPrcb = KeGetCurrentPrcb();
      v24 = *((_QWORD *)CurrentPrcb + 1);
      KiAcquireKobjectLockSafe(NotificationQueue);
      if( p_WaitListHead->Flink == p_WaitListHead
        || NotificationQueue->CurrentCount >= NotificationQueue->MaximumCount
        || *(_KQUEUE **)(v24 + 232) == NotificationQueue && *(_BYTE *)(v24 + 643) == 15
        || !KiWakeQueueWaiter(CurrentPrcb, NotificationQueue, (INT64)v17) )
      {
        SignalState = NotificationQueue->Header.SignalState;
        NotificationQueue->Header.SignalState = SignalState + 1;
        Blink = NotificationQueue->EntryListHead.Blink;
        if( Blink->Flink != &NotificationQueue->EntryListHead )
          goto LABEL_60;
        v17->WaitListEntry.Flink = &NotificationQueue->EntryListHead;
        v17->WaitListEntry.Blink = Blink;
        Blink->Flink = &v17->WaitListEntry;
        NotificationQueue->EntryListHead.Blink = &v17->WaitListEntry;
        if( !SignalState && p_WaitListHead->Flink != p_WaitListHead )
          KiWakeOtherQueueWaiters(CurrentPrcb, NotificationQueue);
      }
      _InterlockedAnd(&NotificationQueue->Header.Lock, 0xFFFFFF7F);
LABEL_30:
      if( v7 == v6 )
        goto LABEL_8;
    }
    WaitKey = v17->WaitKey;
LABEL_29:
    KiTryUnwaitThread(Prcb, v17, WaitKey, 0i64);
    goto LABEL_30;
  }
LABEL_8:
  *((_QWORD *)v6 + 1) = v6;
  *(_QWORD *)v6 = v6;
}

Referenced by:

KeForceResumeThread
KeResumeThread
KiAdjustThreadTimer
KiThawSingleThread