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; 
  _KPRCB *v15; 
  _KPRCB **v16; 
  _ETHREAD *v17; 
  _KSCB *v18; 
  _ETHREAD *v19; 
  _KPRCB *v20; 
  _LIST_ENTRY *v21; 
  _ETHREAD *Blink; 
  int v23; 
  unsigned int v24; 
  _LIST_ENTRY *ReadyListHead; 
  char v26; 
  UINT8 ShareRankNonZero; 
  _KPRCB *Prcba; 
  INT64 v29; 

  v29 = (INT64)ReadyList;
  Prcba = 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 = Prcba;
    v16 = (_KPRCB **)*v13;
    do
    {
      v17 = (_ETHREAD *)(v16 - 27);
      if( v9 )
      {
        v18 = TargetScb;
      }
      else
      {
        v17->Tcb._bf_0 &= ~0x2000u;
        v18 = v4;
      }
      v17->Tcb.QueuedScb = v18;
      v16 = (_KPRCB **)*v16;
      if( v10 )
      {
        KiInsertDeferredReadyList(v14, (INT64)v17);
      }
      else
      {
        if( !v6 )
          continue;
        KiGetThreadEffectiveRankNonZero(v17, Scb, Prcb, 0, &ShareRankNonZero);
        KiAddThreadToPrcbQueue(v15, &v19->Tcb, (unsigned int)v19->Tcb.Priority, 0i64, ShareRankNonZero);
        v4 = 0i64;
      }
      v6 = v26;
    }
    while( v16 != v13 );
    ReadySummary = v23;
    if( v9 )
    {
      v20 = *v13;
      Prcb = v13[1];
      if( (_KPRCB **)(*v13)->CurrentThread != v13
        || *(_KPRCB ***)&Prcb->_MxCsr != v13
        || (*(_QWORD *)&Prcb->_MxCsr = v20,
            v20->CurrentThread = (_ETHREAD *)Prcb,
            v21 = &ReadyListHead[v24],
            Blink = (_ETHREAD *)v21->Blink,
            v21->Flink->Blink != v21)
        || *(_LIST_ENTRY **)Blink->Tcb.gap0 != v21
        || *(_KPRCB **)(*(_QWORD *)&v20->_MxCsr + 8i64) != v20
        || *(_KPRCB **)&Prcb->_MxCsr != v20 )
      {
        __fastfail(3u);
      }
      *(_QWORD *)Blink->Tcb.gap0 = v20;
      v21->Blink = (_LIST_ENTRY *)v20->CurrentThread;
      *(_QWORD *)v20->CurrentThread = v21;
      v20->CurrentThread = Blink;
    }
    v13[1] = (_KPRCB *)v13;
    *v13 = (_KPRCB *)v13;
    if( v23 )
    {
      v6 = v26;
      continue;
    }
    break;
  }
LABEL_15:
  Scb->ReadySummary = (unsigned __int16)v4;
}

Referenced by:

KeSetSchedulingGroupRankBias
KiResetScb