PpmParkRegisterParking

VOID __stdcall PpmParkRegisterParking(){
  unsigned int v0; 
  unsigned __int8 v1; 
  __int64 v2; 
  __int64 v3; 
  unsigned __int64 v4; 
  _BYTE *v5; 
  unsigned int v6; 
  unsigned int v7; 
  VOID **PoolWithTag; 
  VOID **v9; 
  unsigned __int64 v10; 
  int v11; 
  _KPRCB *Prcb; 
  unsigned __int64 v13; 
  unsigned int v14; 
  unsigned int v15; 
  unsigned __int16 Group; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  VOID **v19; 
  unsigned __int8 v20; 
  __int64 v21; 
  int v22; 
  _KPRCB *v23; 
  char *v24; 
  unsigned int v25; 
  char v26; 
  __int64 v27; 
  unsigned int v28; 
  unsigned __int8 *v29; 
  int v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  unsigned __int8 v33; 
  unsigned int v34; 
  unsigned __int8 v35; 
  size_t v36; 
  VOID **v37; 
  VOID **v38; 
  VOID **v39; 
  char *v40; 
  __int64 v41; 
  int v42; 
  VOID **v43; 
  __int64 v44; 
  VOID **v45; 
  VOID **v46; 
  unsigned __int8 *v47; 
  unsigned __int64 v48; 
  PVOID v49; 
  PVOID *v50; 
  __int64 v51; 
  __int64 v52; 
  PVOID *v53; 
  __int64 v54; 
  __int64 v55; 
  __int64 *v56; 
  int v57; 
  __int64 v58; 
  __int64 v59; 
  __int64 v60; 
  char *v61; 
  unsigned int *v62; 
  int v63; 
  VOID **v64; 
  unsigned int v65; 
  __int64 v66; 
  VOID **v67; 
  VOID **v68; 
  PVOID *v69; 
  __int64 v70; 
  __int64 v71; 
  PVOID *v72; 
  UINT64 Count; 
  UINT64 ProcIndex; 
  UINT64 Param2; 
  __int64 v76; 
  VOID **v77; 
  PVOID P; 
  VOID **v79; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  __int64 Affinity; 
  _GROUP_AFFINITY Affinity_8; 
  _KAFFINITY_EX TargetProcessors; 

  memset(&TargetProcessors, 0i64, sizeof(TargetProcessors));
  v0 = 0;
  Affinity = 0i64;
  LODWORD(ProcIndex) = 0;
  Affinity_8 = 0i64;
  LOWORD(Count) = 0;
  P = 0i64;
  memset(&Context, 0, sizeof(Context));
  LODWORD(Param2) = 0;
  if( PpmParkNodes )
  {
    v1 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 135);
    v2 = (unsigned int)PpmParkNumNodes;
    v3 = PpmParkNodes;
    v4 = v1;
    Context.Affinity = (_KAFFINITY_EX *)PpmParkHistograms;
    LODWORD(Param2) = PpmParkNumNodes;
    P = (PVOID)PpmParkNodes;
    LODWORD(PpmParkNumNodes) = 0;
    PpmParkNodes = 0i64;
    PpmParkHistograms = 0i64;
    KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 135);
    __writecr8(v4);
    if( (_DWORD)v2 )
    {
      v5 = (_BYTE *)(v3 + 146);
      do
      {
        if( *(_QWORD *)(v5 - 74) && (*v5 & 8) != 0 )
        {
          *(_DWORD *)&TargetProcessors.Count = 1310721;
          memset(&TargetProcessors.Reserved, 0i64, 0xA4u);
          v54 = *((unsigned __int16 *)v5 - 71);
          v55 = *(_QWORD *)(v5 - 138);
          if( (_WORD)v54 )
            TargetProcessors.Count = v54 + 1;
          TargetProcessors.Bitmap[v54] |= v55;
          PopExecuteOnTargetProcessors(
            &TargetProcessors,
            (INT64 *)PpmIdleRemoveConcurrency,
            0i64,
            0i64,
            Count,
            ProcIndex,
            Param2);
        }
        v5 += 272;
        --v2;
      }
      while( v2 );
    }
  }
  v6 = 0;
  HIDWORD(ProcIndex) = 0;
  v7 = 0;
  if( KeNumberNodes )
  {
    do
    {
      KeQueryNodeActiveAffinity(v7, 0i64, (PUSHORT)&Count);
      if( (_WORD)Count )
        ++v6;
      ++v7;
    }
    while( v7 < (unsigned __int16)KeNumberNodes );
    HIDWORD(ProcIndex) = v6;
  }
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 272 * v6, 1884115024i64);
  v79 = PoolWithTag;
  v9 = PoolWithTag;
  v77 = 0i64;
  if( !PoolWithTag )
    goto LABEL_62;
  memset(PoolWithTag, 0i64, 272 * v6);
  PpmParkGranularity = 1;
  PpmParkCoreMask = PpmParkUseCoreGranularity != 0;
  PpmParkUnparkCores = PpmParkUseCoreGranularity == 2;
  if( PpmParkUseCoreGranularity )
  {
    LODWORD(v10) = 0;
    *(_QWORD *)&Context.CurrentIndex = PpmCheckRegistered.Bitmap[0];
    Context.CurrentMask = (unsigned __int64)&PpmCheckRegistered;
    while( 1 )
    {
      KeEnumerateNextProcessor(&ProcIndex, (_KAFFINITY_ENUMERATION_CONTEXT *)&Context.CurrentMask);
      if( v11 )
        break;
      Prcb = KeGetPrcb((unsigned int)ProcIndex);
      v13 = Prcb->CoreProcessorSet - ((Prcb->CoreProcessorSet >> 1) & 0x5555555555555555i64);
      if( (_DWORD)v10 )
      {
        if( (_DWORD)v10 != (unsigned int)((0x101010101010101i64
                                          * (((v13 & 0x3333333333333333i64)
                                            + ((v13 >> 2) & 0x3333333333333333i64)
                                            + (((v13 & 0x3333333333333333i64) + ((v13 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 )
          PpmParkCoreMask = 0;
      }
      else
      {
        v10 = (0x101010101010101i64
             * (((v13 & 0x3333333333333333i64)
               + ((v13 >> 2) & 0x3333333333333333i64)
               + (((v13 & 0x3333333333333333i64) + ((v13 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
      }
    }
    v9 = v79;
    if( PpmParkCoreMask )
      PpmParkGranularity = v10;
  }
  HIDWORD(Count) = 0;
  v14 = 0;
  v15 = 0;
  HIDWORD(Param2) = 0;
  if( !KeNumberNodes )
  {
LABEL_52:
    v36 = 8 * v14;
    v37 = ExAllocatePoolWithTag(0x200ui64, 8i64 * v14, 1884115024i64);
    v77 = v37;
    v38 = v37;
    if( v37 )
    {
      memset(v37, 0i64, v36);
      v39 = v38;
      if( v6 )
      {
        v40 = (char *)(v9 + 15);
        v41 = v6;
        v76 = v6;
        do
        {
          v42 = (unsigned __int8)*(v40 - 114);
          v43 = v39;
          *((_QWORD *)v40 - 5) = v39;
          v44 = (unsigned int)++v42;
          v45 = &v39[v44];
          *(_DWORD *)v40 = v42;
          *((_QWORD *)v40 - 4) = v45;
          v46 = &v45[v44];
          *((_QWORD *)v40 - 3) = v46;
          v39 = &v46[v44];
          memmove(v43, (const VOID *)(*((_QWORD *)v40 - 6) + 32i64), v44 * 8);
          memmove(*((VOID **)v40 - 4), (const VOID *)(*((_QWORD *)v40 - 6) + 32i64), 8 * *(_DWORD *)v40);
          v47 = (unsigned __int8 *)(v40 + 8);
          *((_QWORD *)v40 - 2) = *(_QWORD *)(*((_QWORD *)v40 - 6) + 24i64);
          *((_QWORD *)v40 - 1) = *(_QWORD *)(*((_QWORD *)v40 - 6) + 24i64);
          if( *(v40 - 114) != v40[8] )
          {
            v60 = 2i64;
            v61 = v40 + 32;
            v62 = (unsigned int *)(v40 + 88);
            do
            {
              v63 = *v47;
              v64 = v39;
              if( (_BYTE)v63 )
              {
                *((_QWORD *)v62 - 5) = v39;
                v65 = v63 + 1;
                v66 = v65;
                v67 = &v39[v66];
                *v62 = v65;
                *((_QWORD *)v62 - 4) = v67;
                v68 = &v67[v66];
                *((_QWORD *)v62 - 3) = v68;
                v39 = &v68[v66];
                memmove(v64, (const VOID *)(*(_QWORD *)v61 + 32i64), v66 * 8);
                memmove(*((VOID **)v62 - 4), (const VOID *)(*(_QWORD *)v61 + 32i64), 8 * *v62);
                *((_QWORD *)v62 - 2) = *(_QWORD *)(*(_QWORD *)v61 + 24i64);
                *((_QWORD *)v62 - 1) = *(_QWORD *)(*(_QWORD *)v61 + 24i64);
              }
              v61 += 8;
              v62 += 12;
              ++v47;
              --v60;
            }
            while( v60 );
            v41 = v76;
          }
          v40 += 272;
          v76 = --v41;
        }
        while( v41 );
        v9 = v79;
        v6 = HIDWORD(ProcIndex);
        v38 = v77;
      }
      v48 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 135);
      LODWORD(PpmParkNumNodes) = v6;
      PpmParkNodes = (__int64)v9;
      PpmParkHistograms = (__int64)v38;
      KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 135);
      __writecr8(v48);
      v9 = 0i64;
      v38 = 0i64;
    }
    goto LABEL_59;
  }
  while( 1 )
  {
    KeQueryNodeActiveAffinity(v0, &Affinity_8, 0i64);
    Group = Affinity_8.Group;
    v17 = Affinity_8.Group >= PpmCheckRegistered.Count ? 0i64 : PpmCheckRegistered.Bitmap[Affinity_8.Group];
    v18 = v17 & Affinity_8.Mask;
    Affinity_8.Mask &= v17;
    if( Affinity_8.Mask )
      break;
LABEL_50:
    HIDWORD(Param2) = ++v0;
    if( v0 >= (unsigned __int16)KeNumberNodes )
    {
      v6 = HIDWORD(ProcIndex);
      v14 = HIDWORD(Count);
      goto LABEL_52;
    }
  }
  LODWORD(v76) = v15 + 1;
  v19 = &v9[34 * v15];
  v20 = 0;
  *((_WORD *)v19 + 2) = Affinity_8.Group;
  v19[1] = (VOID *)v18;
  do
  {
    v21 = v20;
    if( v20 )
      v21 = PpmHeteroPolicy != 0 ? v20 : 0;
    LOWORD(Affinity) = Group;
    *(_QWORD *)&Context.CurrentIndex = v18;
    Context.CurrentMask = 0i64;
    while( 1 )
    {
      KeEnumerateNextProcessor(&ProcIndex, (_KAFFINITY_ENUMERATION_CONTEXT *)&Context.CurrentMask);
      if( v22 )
        break;
      v23 = KeGetPrcb((unsigned int)ProcIndex);
      if( v23->PowerState.ArchitecturalEfficiencyClass == v20 )
      {
        ++*((_BYTE *)v19 + v21 + 128);
        v19[v21 + 2] = (VOID *)(v23->GroupSetMember | (unsigned __int64)v19[v21 + 2]);
      }
    }
    ++v20;
  }
  while( v20 < 2u );
  v0 = HIDWORD(Param2);
  v24 = (char *)(v19 + 16);
  v9 = v79;
  v25 = 0;
  v26 = *((_BYTE *)v19 + 129);
  if( !*((_BYTE *)v19 + 128) )
  {
    *v24 = v26;
    v19[2] = v19[3];
    v26 = 0;
    *((_BYTE *)v19 + 129) = 0;
    v19[3] = 0i64;
  }
  if( !v26 )
    *((_BYTE *)v19 + 146) |= 4u;
  v27 = 2i64;
  v28 = 0;
  v29 = (unsigned __int8 *)(v19 + 16);
  do
  {
    v30 = *v29;
    v29[10] = v30;
    v28 += v30;
    v29[15] = v30;
    ++v29;
    --v27;
  }
  while( v27 );
  *(_DWORD *)&TargetProcessors.Count = 1310721;
  HIDWORD(Count) += v28 + 2 * v28 + 3;
  memset(&TargetProcessors.Reserved, 0i64, 0xA4u);
  v31 = *((unsigned __int16 *)v19 + 2);
  v32 = (unsigned __int64)v19[1];
  if( (_WORD)v31 )
    TargetProcessors.Count = v31 + 1;
  TargetProcessors.Bitmap[v31] |= v32;
  if( PpmIdleInitializeConcurrency(&TargetProcessors, (PPM_CONCURRENCY_ACCOUNTING **)v19 + 9) < 0 )
  {
    v38 = 0i64;
    goto LABEL_59;
  }
  if( v28 == (unsigned __int8)*v24 )
  {
LABEL_45:
    v33 = PpmParkGranularity;
    v34 = 1;
    v15 = v76;
    *((_BYTE *)v19 + 6) = v28;
    *((_BYTE *)v19 + 135) = v28;
    *((_BYTE *)v19 + 137) = v28;
    if( !PpmParkMultiparkGranularity )
      v34 = PpmParkMultiparkGranularity;
    v35 = v28 / v34;
    if( v35 < v33 )
      v35 = v33;
    *((_BYTE *)v19 + 145) = v35;
    goto LABEL_50;
  }
  v56 = (__int64 *)(v19 + 2);
  while( 1 )
  {
    v57 = (unsigned __int8)*v24;
    if( (_BYTE)v57 )
    {
      *(_DWORD *)&TargetProcessors.Count = 1310721;
      HIDWORD(Count) += v57 + 2 * v57 + 3;
      memset(&TargetProcessors.Reserved, 0i64, 0xA4u);
      v58 = *((unsigned __int16 *)v19 + 2);
      v59 = *v56;
      if( (_WORD)v58 )
        TargetProcessors.Count = v58 + 1;
      TargetProcessors.Bitmap[v58] |= v59;
      if( PpmIdleInitializeConcurrency(&TargetProcessors, (PPM_CONCURRENCY_ACCOUNTING **)&v19[v25 + 19]) < 0 )
        break;
    }
    ++v56;
    ++v25;
    ++v24;
    if( v25 >= 2 )
      goto LABEL_45;
  }
  v38 = v77;
LABEL_59:
  if( v9 )
  {
    if( HIDWORD(ProcIndex) )
    {
      v69 = v9 + 9;
      v70 = HIDWORD(ProcIndex);
      do
      {
        if( *v69 )
          ExFreePoolWithTag(*v69, 0x704D5050u);
        v71 = 2i64;
        v72 = v69 + 10;
        do
        {
          if( *v72 )
            ExFreePoolWithTag(*v72, 0x704D5050u);
          ++v72;
          --v71;
        }
        while( v71 );
        v69 += 34;
        --v70;
      }
      while( v70 );
    }
    ExFreePoolWithTag(v9, 0x704D5050u);
  }
  if( v38 )
    ExFreePoolWithTag(v38, 0x704D5050u);
LABEL_62:
  v49 = P;
  if( P )
  {
    if( (_DWORD)Param2 )
    {
      v50 = (PVOID *)((char *)P + 72);
      v51 = (unsigned int)Param2;
      do
      {
        if( *v50 )
          ExFreePoolWithTag(*v50, 0x704D5050u);
        v52 = 2i64;
        v53 = v50 + 10;
        do
        {
          if( *v53 )
            ExFreePoolWithTag(*v53, 0x704D5050u);
          ++v53;
          --v52;
        }
        while( v52 );
        v50 += 34;
        --v51;
      }
      while( v51 );
    }
    ExFreePoolWithTag(v49, 0x704D5050u);
  }
  if( Context.Affinity )
    ExFreePoolWithTag(Context.Affinity, 0x704D5050u);
  PpmParkApplyPolicy();
  PpmParkParkingAvailable();
}

Referenced by:

PpmCheckInitProcessors