KiConfigureHeteroProcessorsTarget

VOID __stdcall KiConfigureHeteroProcessorsTarget(
        _KDPC *Dpc,
        VOID *Context,
        VOID *SystemArgument1,
        VOID *SystemArgument2){
  signed __int32 v7; 
  unsigned int v8; 
  _KPRCB **v9; 
  unsigned __int8 *v10; 
  __int64 v11; 
  _KPRCB *v12; 
  __int64 Group; 
  __int64 *v14; 
  unsigned __int64 GroupSetMember; 
  __int64 v16; 
  unsigned __int16 i; 
  unsigned __int64 v18; 
  __int64 v19; 
  int v20; 
  __int64 v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  __int64 v28; 
  __int64 v29; 
  unsigned int v30; 
  __int64 *v31; 
  signed __int32 v32; 
  unsigned int v33; 
  __int64 v34[7]; 
  UINT64 SpinCount; 

  LODWORD(SpinCount) = 0;
  v7 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
  v8 = ~v7 & 0x80000000;
  if( (v7 & 0x7FFFFFFF) != 0 )
  {
    while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v8 )
      KeYieldProcessorEx(&SpinCount);
  }
  else
  {
    *(_DWORD *)SystemArgument2 = v8 | *((_DWORD *)SystemArgument2 + 1);
  }
  if( !KeGetPcr()->Prcb.Number )
  {
    if( (_DWORD)KeNumberProcessors_0 )
    {
      v9 = &KiProcessorBlock;
      v10 = (unsigned __int8 *)(*(_QWORD *)Context + 8i64);
      v11 = (unsigned int)KeNumberProcessors_0;
      do
      {
        v12 = *v9;
        Group = (*v9)->Group;
        v12->PowerState.EfficiencySchedulingClass = *(v10 - 1);
        v12->PowerState.PerformanceSchedulingClass = *v10;
        v12->PowerState.ArchitecturalEfficiencyClass = *(v10 - 2);
        v14 = &qword_140CFCA78[2 * Group];
        GroupSetMember = v12->GroupSetMember;
        if( *v10 )
          *v14 &= ~GroupSetMember;
        else
          *v14 |= GroupSetMember;
        v10 += 3;
        ++v9;
        --v11;
      }
      while( v11 );
    }
    v16 = 0i64;
    for( i = 0; i < (unsigned __int16)KeNumberNodes; ++i )
    {
      v18 = *(_QWORD *)(KeNodeBlock[i] + 136) - ((*(_QWORD *)(KeNodeBlock[i] + 136) >> 1) & 0x5555555555555555i64);
      if( (unsigned int)((0x101010101010101i64
                         * (((v18 & 0x3333333333333333i64)
                           + ((v18 >> 2) & 0x3333333333333333i64)
                           + (((v18 & 0x3333333333333333i64) + ((v18 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 )
      {
        if( v16 )
        {
          v16 = 0i64;
          break;
        }
        v16 = KeNodeBlock[i];
      }
    }
    KeHeteroSystem = 0;
    KeHeteroSystemVirtual = 0;
    KeHeteroSystemQos = 0;
    if( v16 )
    {
      if( *((_DWORD *)Context + 3) )
      {
        KeHeteroSystem = 1;
        KeHeteroSystemVirtual = 1;
        KeHeteroSystemQos = 1;
        goto LABEL_48;
      }
      if( *((_DWORD *)Context + 4) )
      {
        v19 = *(unsigned __int16 *)(v16 + 144);
        v20 = *((_DWORD *)Context + 2);
        KeHeteroSystem = 1;
        KeHeteroSystemQos = v20;
        if( (unsigned __int16)v19 >= *((_WORD *)Context + 12) )
          v21 = 0i64;
        else
          v21 = *((_QWORD *)Context + v19 + 4);
        if( (unsigned __int16)v19 >= *((_WORD *)Context + 96) )
          v22 = 0i64;
        else
          v22 = *((_QWORD *)Context + v19 + 25);
        if( (unsigned __int16)v19 >= *((_WORD *)Context + 180) )
          v23 = 0i64;
        else
          v23 = *((_QWORD *)Context + v19 + 46);
        if( (unsigned __int16)v19 >= *((_WORD *)Context + 264) )
          v24 = 0i64;
        else
          v24 = *((_QWORD *)Context + v19 + 67);
        v25 = *(_QWORD *)(v16 + 136);
        v26 = v25 & v21;
        v27 = v25 & v22;
        v28 = v25 & v23;
        v29 = v25 & v24;
      }
      else
      {
        v28 = *(_QWORD *)(v16 + 136);
        v29 = v28;
        v26 = v28;
        v27 = v28;
      }
      v30 = 1;
      v31 = (__int64 *)(v16 + 224);
      while( 1 )
      {
        if( v30 == 1 )
        {
          *(v31 - 2) = v27;
          *(v31 - 1) = v26;
          *v31 = v26;
          goto LABEL_47;
        }
        if( v30 == 2 )
          break;
        if( v30 == 3 )
        {
          *(v31 - 2) = v29;
          *(v31 - 1) = v28;
          *v31 = v28;
        }
        else if( v30 == 4 )
        {
          *(v31 - 2) = v29;
          *(v31 - 1) = v28;
LABEL_45:
          *v31 = *(_QWORD *)(v16 + 136);
        }
LABEL_47:
        ++v30;
        v31 += 3;
        if( v30 >= 5 )
          goto LABEL_48;
      }
      *(v31 - 2) = v27;
      *(v31 - 1) = v26;
      goto LABEL_45;
    }
  }
LABEL_48:
  v32 = _InterlockedDecrement((volatile signed __int32 *)SystemArgument2);
  v33 = ~v32 & 0x80000000;
  if( (v32 & 0x7FFFFFFF) != 0 )
  {
    LODWORD(v34[0]) = 0;
    while( (*(_DWORD *)SystemArgument2 & 0x80000000) != v33 )
      KeYieldProcessorEx((UINT64 *)v34);
  }
  else
  {
    *(_DWORD *)SystemArgument2 = v33 | *((_DWORD *)SystemArgument2 + 1);
  }
  _InterlockedDecrement((volatile signed __int32 *)SystemArgument1);
}

Referenced by:

No references.