KiAcquireThreadStateLock

VOID __fastcall KiAcquireThreadStateLock(
        _ETHREAD *Thread,
        _KPRCB **ControlPrcb,
        _KSHARED_READY_QUEUE **ControlReadyQueue){
  __int64 v6; 
  volatile signed __int32 *v7; 
  __int64 v8; 
  struct _KPRCB *CurrentPrcb; 
  bool v10; 
  char v11; 
  __int64 v12; 
  struct _KPRCB *v13; 
  __int64 v14; 
  struct _KPRCB *v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  struct _KPRCB *v19; 
  __int64 v20; 
  __int64 v21; 
  UINT64 v22[9]; 
  UINT64 SpinCount; 
  UINT64 v24; 
  while( 1 )
  {
    while( 1 )
    {
      while( 1 )
      {
        v6 = 0i64;
        v7 = 0i64;
        if( *((_BYTE *)Thread + 388) != 2 )
          break;
LABEL_2:
        v8 = *((unsigned int *)Thread + 134);
        if( (int)v8 >= 0 )
        {
          CurrentPrcb = KeGetCurrentPrcb();
          v6 = (__int64)*(&KiProcessorBlock + v8);
          HIDWORD(v22[0]) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 48), 0i64) )
          {
            do
              KeYieldProcessorEx((UINT64 *)((char *)v22 + 4));
            while( *(_QWORD *)(v6 + 48) );
            v17 = *((_QWORD *)CurrentPrcb + 4247);
            if( v17 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
              ++*(_DWORD *)(v17 + 24);
          }
          v10 = Thread == *(_ETHREAD **)(v6 + 8);
LABEL_6:
          if( v10 )
            goto LABEL_7;
          goto LABEL_19;
        }
      }
      if( *((_BYTE *)Thread + 388) == 1 )
        break;
      if( *((_BYTE *)Thread + 388) != 3 )
      {
        if( *((_BYTE *)Thread + 388) != 5 )
          goto LABEL_7;
        v11 = *((_BYTE *)Thread + 112) & 7;
        if( v11 == 1 || (unsigned __int8)(v11 - 3) <= 3u )
          goto LABEL_7;
        goto LABEL_2;
      }
      v12 = *((unsigned int *)Thread + 134);
      if( (int)v12 >= 0 )
      {
        v13 = KeGetCurrentPrcb();
        v6 = (__int64)*(&KiProcessorBlock + v12);
        LODWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 48), 0i64) )
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( *(_QWORD *)(v6 + 48) );
          v18 = *((_QWORD *)v13 + 4247);
          if( v18 && *((_BYTE *)v13 + 32) <= 1u )
            ++*(_DWORD *)(v18 + 24);
        }
        if( Thread == *(_ETHREAD **)(v6 + 16) )
          goto LABEL_7;
        if( *((_BYTE *)Thread + 388) == 3 && *((_DWORD *)Thread + 134) == (_DWORD)v12 )
          __fastfail(0x1Eu);
LABEL_19:
        _InterlockedAnd64((volatile signed __int64 *)(v6 + 48), 0i64);
      }
    }
    v14 = *((unsigned int *)Thread + 134);
    if( (int)v14 >= 0 )
    {
      v19 = KeGetCurrentPrcb();
      v6 = (__int64)*(&KiProcessorBlock + v14);
      LODWORD(v22[0]) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 48), 0i64) )
      {
        do
          KeYieldProcessorEx(v22);
        while( *(_QWORD *)(v6 + 48) );
        v20 = *((_QWORD *)v19 + 4247);
        if( v20 && *((_BYTE *)v19 + 32) <= 1u )
          ++*(_DWORD *)(v20 + 24);
      }
      if( *((_BYTE *)Thread + 388) != 1 )
        goto LABEL_19;
      v10 = *((_DWORD *)Thread + 134) == (_DWORD)v14;
      goto LABEL_6;
    }
    v15 = KeGetCurrentPrcb();
    v16 = (unsigned int)v14;
    LODWORD(v16) = v14 & 0x7FFFFFFF;
    LODWORD(v24) = 0;
    v7 = (volatile signed __int32 *)*((_QWORD *)*(&KiProcessorBlock + v16) + 4233);
    while( _interlockedbittestandset64(v7, 0i64) )
    {
      do
        KeYieldProcessorEx(&v24);
      while( *(_QWORD *)v7 );
      v21 = *((_QWORD *)v15 + 4247);
      if( v21 && *((_BYTE *)v15 + 32) <= 1u )
        ++*(_DWORD *)(v21 + 24);
    }
    if( *((_BYTE *)Thread + 388) == 1 && *((_DWORD *)Thread + 134) == (_DWORD)v14 )
      break;
    _InterlockedAnd64((volatile signed __int64 *)v7, 0i64);
  }
  v6 = 0i64;
LABEL_7:
  *ControlPrcb = (_KPRCB *)v6;
  *ControlReadyQueue = (_KSHARED_READY_QUEUE *)v7;
}

Referenced by:

KeAbCrossThreadDelete
KeQueryTotalCycleTimeThread
KeSetActualBasePriorityThread
KeSetIdealProcessorThreadEx
KeSetThreadSchedulerAssist
KeTryToFreezeThreadStack
KeUpdateThreadTag
KiApplyForegroundBoostThread
KiRemoveThreadFromSchedulingGroup
KiSendHeteroRescheduleIntRequestHelper
KiSetAffinityThread
KiSetHeteroPolicyThread
KiSetPriorityThread
KiSetThreadSchedulingGroup
KiUpdateThreadCpuSets