KiForwardTick

VOID __stdcall KiForwardTick(
        _KPRCB *Prcb,
        UINT64 ProcCount,
        UINT64 CurrentHand,
        UINT8 GenerationEnd,
        _KAFFINITY_EX *TickMask){
  unsigned int v6; 
  UINT8 *v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned __int16 v11; 
  unsigned int Count; 
  unsigned __int64 *Bitmap; 
  __int64 v14; 
  __int64 v15; 
  unsigned __int16 Size; 
  unsigned __int16 v17; 
  unsigned __int16 i; 
  __int64 v19; 
  __int64 v20; 
  unsigned int v21; 
  unsigned __int16 v22; 
  _KAFFINITY_EX *v23; 
  unsigned __int16 v24; 
  _KPRCB *v25; 
  unsigned int v26; 
  __int64 v27; 
  _KAFFINITY_EX *v28; 
  unsigned __int16 v29; 
  unsigned __int16 v30; 
  int v31; 
  char v32; 
  unsigned __int16 v33; 
  unsigned int v34; 
  __int64 v35; 
  __int64 v36; 
  __int64 v37; 
  unsigned int v39; 
  int v40; 
  __int128 v41; 
  __int64 v42; 
  _KAFFINITY_EX Affinity2; 
  INT64 v44[22]; 
  v40 = CurrentHand;
  v39 = ProcCount;
  memset((INT64)Affinity2.Bitmap, 0i64);
  v6 = 1;
  if( PoSkipTickMode == 2 )
    goto LABEL_52;
  *(_DWORD *)&Affinity2.Count = 1310721;
  memset((INT64)&Affinity2.Reserved, 0i64);
  if( KeNumberNodes )
  {
    v7 = &KeNodeBlock;
    v8 = (unsigned __int16)KeNumberNodes;
    do
    {
      v9 = *(unsigned __int16 *)(*(_QWORD *)v7 + 144i64);
      v10 = *(_QWORD *)(*(_QWORD *)v7 + 64i64);
      if( Affinity2.Count <= (unsigned __int16)v9 )
        Affinity2.Count = v9 + 1;
      Affinity2.Bitmap[v9] |= v10;
      v7 += 8;
      --v8;
    }
    while( v8 );
  }
  v11 = 0;
  if( !Affinity2.Count )
    goto LABEL_52;
  while( !Affinity2.Bitmap[v11] )
  {
    if( ++v11 >= Affinity2.Count )
      goto LABEL_52;
  }
  Count = Affinity2.Count;
  Bitmap = Affinity2.Bitmap;
  v14 = Affinity2.Count;
  do
  {
    v15 = *Bitmap++;
    *(unsigned __int64 *)((char *)Bitmap + (char *)TickMask - (char *)Affinity2.Bitmap) = ~v15;
    --v14;
  }
  while( v14 );
  Size = Affinity2.Size;
  v17 = Affinity2.Size;
  if( Count < Affinity2.Size )
    memset(&TickMask->Bitmap[Count], 0xFFu, 8i64 * (Affinity2.Size - Count));
  TickMask->Reserved = 0;
  TickMask->Count = Size;
  TickMask->Size = Size;
  memset((INT64)v44, 0i64);
  if( Size >= KeActiveProcessors.Count )
    v17 = KeActiveProcessors.Count;
  TickMask->Count = v17;
  for( i = 0; i < TickMask->Count; TickMask->Bitmap[v19] &= KeActiveProcessors.Bitmap[v19] )
    v19 = i++;
  if( TickMask != (_KAFFINITY_EX *)v44 )
  {
    TickMask->Reserved = 0;
    for( TickMask->Size = 20; i < TickMask->Size; TickMask->Bitmap[v20] = 0i64 )
      v20 = i++;
  }
  if( GenerationEnd )
    KeOrAffinityEx(TickMask, &KiGroupSchedulingOverQuotaMask, TickMask);
  if( !KiSerializeTimerExpiration )
  {
    v32 = KiLastForwardedHand;
    *(_DWORD *)&Affinity2.Count = 1310721;
    v33 = 0;
    memset((INT64)&Affinity2.Reserved, 0i64);
    do
    {
      LOBYTE(v34) = v32 - 1;
      v35 = qword_140CFC7A8[2 * v33];
      do
      {
        v34 = (unsigned __int8)(v34 + 1);
        v36 = *(_QWORD *)(((unsigned __int64)v34 << 6) + v35);
        if( Affinity2.Count <= v33 )
          Affinity2.Count = v33 + 1;
        Affinity2.Bitmap[v33] |= v36;
      }
      while( v34 != (unsigned __int8)v40 );
      ++v33;
    }
    while( v33 < (unsigned __int16)KiActiveGroups );
    KeOrAffinityEx(TickMask, &Affinity2, TickMask);
  }
  v21 = TickMask->Count;
  v22 = KeActiveProcessors.Count;
  if( (unsigned __int16)v21 < KeActiveProcessors.Count )
  {
    v23 = &KeActiveProcessors;
    v22 = TickMask->Count;
  }
  else
  {
    v23 = TickMask;
  }
  v24 = 0;
  if( !v22 )
  {
LABEL_55:
    if( v24 < v23->Count )
    {
      while( !v23->Bitmap[v24] )
      {
        if( ++v24 >= v23->Count )
          goto LABEL_56;
      }
      goto LABEL_27;
    }
LABEL_56:
    v6 = 1;
LABEL_52:
    v25 = Prcb;
LABEL_53:
    v28 = 0i64;
    KeCopyAffinityEx((__int64)TickMask, &KeActiveProcessors.Count);
    goto LABEL_32;
  }
  while( TickMask->Bitmap[v24] == KeActiveProcessors.Bitmap[v24] )
  {
    if( ++v24 >= v22 )
      goto LABEL_55;
  }
LABEL_27:
  v25 = Prcb;
  v26 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)Prcb + 9)];
  v27 = v26 >> 6;
  if( v21 > (unsigned int)v27 )
    TickMask->Bitmap[v27] &= ~(1i64 << (v26 & 0x3F));
  if( PoSkipTickMode && (unsigned int)KeCountSetBitsAffinityEx(TickMask) > 3 )
  {
    v6 = 1;
    goto LABEL_53;
  }
  v6 = 0;
  v28 = TickMask;
  v29 = 0;
  if( !TickMask->Count )
    goto LABEL_39;
  while( !TickMask->Bitmap[v29] )
  {
    if( ++v29 >= TickMask->Count )
      goto LABEL_39;
  }
LABEL_32:
  v42 = 0i64;
  v41 = 0i64;
  if( v6 )
  {
    LODWORD(v41) = 4;
  }
  else
  {
    if( !v28 || (v30 = 0, !v28->Count) )
    {
LABEL_65:
      v31 = -1073741811;
LABEL_66:
      KeBugCheckEx(0x5Cu, 0x201ui64, HalpInterruptController, v31, v6);
    }
    while( !v28->Bitmap[v30] )
    {
      if( ++v30 >= v28->Count )
        goto LABEL_65;
    }
    LODWORD(v41) = 2;
    *((_QWORD *)&v41 + 1) = v28;
  }
  v31 = HalpInterruptSendIpi(&v41, 0xD2u);
  if( v31 < 0 )
    goto LABEL_66;
  KiLastForwardedHand = v40;
LABEL_39:
  if( (_BYTE)KdDebuggerEnabled )
  {
    v37 = (unsigned int)KiPollSlotNext;
    KiPollSlot = KiPollSlotNext++;
    if( KiPollSlotNext >= v39 )
      KiPollSlotNext = 0;
    if( (_DWORD)v37 != *((_DWORD *)v25 + 9)
      && ((TickMask->Bitmap[(unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v37] >> 6] >> (KiProcessorIndexToNumberMappingTable[v37] & 0x3F)) & 1) == 0 )
    {
      KiPollSlot = *((_DWORD *)v25 + 9);
    }
  }
}

Referenced by:

KiUpdateTime