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