KiMoveScbThreadsToNewReadylist

VOID __stdcall KiMoveScbThreadsToNewReadylist(
        _KSCB *Scb,
        _KSCB *TargetScb,
        _KPRCB *Prcb,
        _SINGLE_LIST_ENTRY *ReadyList){
  _KSCB *v4; 
  char v6; 
  unsigned int ReadySummary; 
  char v9; 
  char v10; 
  unsigned int v11; 
  int v12; 
  _KPRCB **v13; 
  INT64 v14; 
  __int64 v15; 
  _KPRCB **v16; 
  INT64 v17; 
  _KSCB *v18; 
  __int64 v19; 
  _KPRCB *v20; 
  _LIST_ENTRY *v21; 
  _LIST_ENTRY **p_Flink; 
  int v23; 
  unsigned int v24; 
  _LIST_ENTRY *ReadyListHead; 
  char v26; 
  UINT8 ShareRankNonZero; 
  _KPRCB *v28; 
  INT64 v29; 
  v29 = (INT64)ReadyList;
  v28 = Prcb;
  v4 = 0i64;
  v26 = 0;
  v6 = 0;
  ShareRankNonZero = 0;
  ReadyListHead = 0i64;
  ReadySummary = Scb->ReadySummary;
  v9 = 0;
  v10 = 0;
  if( TargetScb )
  {
    TargetScb->ReadySummary |= ReadySummary;
    ReadyListHead = TargetScb->ReadyListHead;
    v9 = 1;
  }
  else if( Prcb )
  {
    v6 = 1;
    v26 = 1;
  }
  else if( ReadyList )
  {
    v10 = 1;
  }
  if( !ReadySummary )
    goto LABEL_15;
  while( 2 )
  {
    _BitScanReverse(&v11, ReadySummary);
    v12 = ReadySummary ^ (1 << v11);
    v13 = (_KPRCB **)&Scb->ReadyListHead[v11];
    v24 = v11;
    v14 = v29;
    v23 = v12;
    v15 = (__int64)v28;
    v16 = (_KPRCB **)*v13;
    do
    {
      v17 = (INT64)(v16 - 27);
      if( v9 )
      {
        v18 = TargetScb;
      }
      else
      {
        *(_DWORD *)(v17 + 116) &= ~0x2000u;
        v18 = v4;
      }
      *(_QWORD *)(v17 + 944) = v18;
      v16 = (_KPRCB **)*v16;
      if( v10 )
      {
        KiInsertDeferredReadyList(v14, v17);
      }
      else
      {
        if( !v6 )
          continue;
        KiGetThreadEffectiveRankNonZero((_ETHREAD *)v17, Scb, Prcb, 0, &ShareRankNonZero);
        KiAddThreadToPrcbQueue(v15, v19, *(char *)(v19 + 195), 0, ShareRankNonZero);
        v4 = 0i64;
      }
      v6 = v26;
    }
    while( v16 != v13 );
    ReadySummary = v23;
    if( v9 )
    {
      v20 = *v13;
      Prcb = v13[1];
      if( *((_KPRCB ***)*v13 + 1) != v13
        || *(_KPRCB ***)Prcb != v13
        || (*(_QWORD *)Prcb = v20,
            *((_QWORD *)v20 + 1) = Prcb,
            v21 = &ReadyListHead[v24],
            p_Flink = &v21->Blink->Flink,
            v21->Flink->Blink != v21)
        || *p_Flink != v21
        || *(_KPRCB **)(*(_QWORD *)v20 + 8i64) != v20
        || *(_KPRCB **)Prcb != v20 )
      {
        __fastfail(3u);
      }
      *p_Flink = (_LIST_ENTRY *)v20;
      v21->Blink = (_LIST_ENTRY *)*((_QWORD *)v20 + 1);
      **((_QWORD **)v20 + 1) = v21;
      *((_QWORD *)v20 + 1) = p_Flink;
    }
    v13[1] = (_KPRCB *)v13;
    *v13 = (_KPRCB *)v13;
    if( v23 )
    {
      v6 = v26;
      continue;
    }
    break;
  }
LABEL_15:
  Scb->ReadySummary = (unsigned __int16)v4;
}

Referenced by:

KeSetSchedulingGroupRankBias
KiResetScb