KiSendHeteroRescheduleIntRequestHelper
VOID __stdcall KiSendHeteroRescheduleIntRequestHelper(){
_QWORD *v0;
unsigned __int64 v1;
unsigned int *v2;
__int64 v3;
unsigned int v4;
__int64 v5;
_QWORD *v6;
unsigned __int64 v7;
unsigned __int64 v8;
__int64 v9;
INT64 v10;
_KPRCB *v12;
_KPRCB *v13;
int v14;
int v15;
int v16;
unsigned int v17;
UINT64 SpinCount;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
unsigned int Processor;
_QWORD *v22;
unsigned int *v23;
__int64 v24;
v24 = v3;
v23 = v2;
v22 = v0;
v4 = 0;
ControlReadyQueue = 0i64;
v5 = 0i64;
v16 = -1;
v17 = 0;
v6 = v0;
v7 = v1;
if( v1 )
{
while( 1 )
{
LODWORD(SpinCount) = 0;
_BitScanForward64(&v8, v7);
v7 ^= 1i64 << v8;
Processor = KiProcessorNumberToIndexMappingTable[64 * *(unsigned __int8 *)(v3 + 208) + (unsigned int)v8];
v9 = (__int64)*(&KiProcessorBlock + Processor);
ControlPrcb = (_KPRCB *)v9;
while( _interlockedbittestandset64((volatile signed __int32 *)(v9 + 48), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v9 + 48) );
}
v6 = v22;
v10 = *(_QWORD *)(v9 + 8);
if( (*(_BYTE *)(v9 + 35) & 1) != 0 && !*(_QWORD *)(v9 + 16) && !*(_BYTE *)(v9 + 12585) )
{
if( (unsigned int)KiCheckPreferredHeteroProcessor(*(_KTHREAD **)(v9 + 8), (_KPRCB *)v9) )
{
if( !v22 )
{
_InterlockedAdd16((volatile signed __int16 *)(v10 + 868), 1u);
_InterlockedAnd64((volatile signed __int64 *)(v9 + 48), 0i64);
HIDWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v10 + 64), 0i64) )
{
do
KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
while( *(_QWORD *)(v10 + 64) );
}
KiAcquireThreadStateLock((_ETHREAD *)v10, &ControlPrcb, &ControlReadyQueue);
_InterlockedAdd16((volatile signed __int16 *)(v10 + 868), 0xFFFFu);
if( *(_BYTE *)(v10 + 388) == 2 )
{
v13 = ControlPrcb;
if( !ControlPrcb->QuantumEnd
&& (unsigned int)KiCheckPreferredHeteroProcessor((_KTHREAD *)v10, ControlPrcb)
&& !_interlockedbittestandset((volatile signed __int32 *)(v10 + 120), 0xCu) )
{
v13->QuantumEnd = 1;
KiSendSoftwareInterrupt(Processor, 2u);
}
}
KiReleaseThreadStateLock(v12, (_KSHARED_READY_QUEUE *)ControlPrcb);
KiReleaseThreadLockSafe(v10);
goto LABEL_26;
}
if( (*(_DWORD *)(v10 + 120) & 0x1000) == 0 )
{
v5 |= 1i64 << Processor;
if( v16 == -1 || (v14 = *(char *)(v10 + 195), v14 > v16) )
{
v15 = *(char *)(v10 + 195);
v16 = v15;
v17 = Processor;
}
}
}
}
_InterlockedAnd64((volatile signed __int64 *)(v9 + 48), 0i64);
LABEL_26:
v3 = v24;
if( !v7 )
{
v2 = v23;
v4 = v17;
break;
}
}
}
if( v6 )
*v6 = v5;
if( v2 )
*v2 = v4;
}Referenced by:
KiSendHeteroRescheduleIntRequest