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