PpmParkRegisterParking

INT64 __fastcall PpmParkRegisterParking(INT64 a1){
  UINT64 v1; 
  __int64 v2; 
  __int64 v3; 
  INT64 v4; 
  unsigned __int8 v5; 
  unsigned __int64 v6; 
  _BYTE *v7; 
  unsigned int v8; 
  unsigned int v9; 
  char *PoolWithTag; 
  char *v11; 
  unsigned __int64 v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  int v16; 
  unsigned __int16 Group; 
  INT64 v18; 
  unsigned __int64 v19; 
  char *v20; 
  unsigned __int8 v21; 
  __int64 v22; 
  __int64 v23; 
  char *v24; 
  unsigned int v25; 
  char v26; 
  __int64 v27; 
  unsigned int v28; 
  unsigned __int8 *v29; 
  int v30; 
  __int64 v31; 
  __int64 v32; 
  _QWORD *v33; 
  unsigned __int8 v34; 
  unsigned int v35; 
  unsigned __int8 v36; 
  UINT8 *v37; 
  UINT8 *v38; 
  UINT64 v39; 
  UINT8 *v40; 
  unsigned int *v41; 
  INT64 v42; 
  unsigned int v43; 
  UINT8 *v44; 
  UINT64 v45; 
  UINT8 *v46; 
  UINT8 *v47; 
  unsigned __int8 *v48; 
  unsigned __int8 v49; 
  unsigned __int64 v50; 
  PVOID v51; 
  PVOID *v52; 
  __int64 v53; 
  __int64 v54; 
  PVOID *v55; 
  INT64 v56; 
  INT64 v57; 
  INT64 v58; 
  INT64 v59; 
  INT64 v60; 
  __int64 v61; 
  __int64 v62; 
  __int64 *v63; 
  int v64; 
  __int64 v65; 
  __int64 v66; 
  char *v67; 
  __int64 v68; 
  unsigned int *v69; 
  unsigned int *v70; 
  int v71; 
  UINT8 *v72; 
  unsigned int v73; 
  UINT64 v74; 
  UINT8 *v75; 
  UINT8 *v76; 
  PVOID *v77; 
  __int64 v78; 
  __int64 v79; 
  PVOID *v80; 
  INT64 Count; 
  INT64 a6; 
  INT64 a7; 
  INT64 a8; 
  INT64 a9; 
  PVOID P; 
  INT64 a11; 
  PVOID v88; 
  __int128 v89; 
  __int64 Affinity; 
  struct _GROUP_AFFINITY Affinity_8; 
  int result; 
  _BYTE result_4[172]; 
  memset((INT64)&result, 0i64);
  LODWORD(v2) = 0;
  v89 = 0i64;
  Affinity = 0i64;
  LODWORD(a6) = 0;
  Affinity_8 = 0i64;
  LOWORD(Count) = 0;
  P = 0i64;
  v88 = 0i64;
  LODWORD(a7) = 0;
  if( PpmParkNodes )
  {
    KeAcquireSpinLockRaiseToDpc(&PpmParkStateLock, v1);
    v3 = (unsigned int)PpmParkNumNodes;
    v4 = PpmParkNodes;
    v6 = v5;
    v88 = (PVOID)PpmParkHistograms;
    LODWORD(a7) = PpmParkNumNodes;
    P = (PVOID)PpmParkNodes;
    LODWORD(PpmParkNumNodes) = 0;
    PpmParkNodes = 0i64;
    PpmParkHistograms = 0i64;
    KxReleaseSpinLock(&PpmParkStateLock);
    __writecr8(v6);
    if( (_DWORD)v3 )
    {
      v7 = (_BYTE *)(v4 + 146);
      do
      {
        if( *(_QWORD *)(v7 - 74) && (*v7 & 8) != 0 )
        {
          result = 1310721;
          memset((INT64)result_4, 0i64);
          v61 = *((unsigned __int16 *)v7 - 71);
          v62 = *(_QWORD *)(v7 - 138);
          if( (unsigned __int16)result <= (unsigned __int16)v61 )
            LOWORD(result) = v61 + 1;
          *(_QWORD *)&result_4[8 * v61 + 4] |= v62;
          PopExecuteOnTargetProcessors((INT64)&result, (INT64)PpmIdleRemoveConcurrency, 0i64, 0i64);
        }
        v7 += 272;
        --v3;
      }
      while( v3 );
    }
  }
  v8 = 0;
  HIDWORD(a6) = 0;
  v9 = 0;
  if( KeNumberNodes )
  {
    do
    {
      KeQueryNodeActiveAffinity(v9, 0i64, (PUSHORT)&Count);
      if( (_WORD)Count )
        ++v8;
      ++v9;
    }
    while( v9 < (unsigned __int16)KeNumberNodes );
    HIDWORD(a6) = v8;
  }
  PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, 272 * v8, 0x704D5050ui64);
  a11 = (INT64)PoolWithTag;
  v11 = PoolWithTag;
  a9 = 0i64;
  if( !PoolWithTag )
    goto LABEL_64;
  memset((INT64)PoolWithTag, 0i64);
  PpmParkGranularity = 1;
  PpmParkCoreMask = PpmParkUseCoreGranularity != 0;
  PpmParkUnparkCores = PpmParkUseCoreGranularity == 2;
  if( PpmParkUseCoreGranularity )
  {
    LODWORD(v12) = 0;
    *((_QWORD *)&v89 + 1) = qword_140C11268[0];
    *(_QWORD *)&v89 = &PpmCheckRegistered;
    while( !(unsigned int)KeEnumerateNextProcessor(&a6, (unsigned __int16 **)&v89) )
    {
      KeGetPrcb((unsigned int)a6);
      v14 = *(_QWORD *)(v13 + 33880) - ((*(_QWORD *)(v13 + 33880) >> 1) & 0x5555555555555555i64);
      if( (_DWORD)v12 )
      {
        if( (_DWORD)v12 != (unsigned int)((0x101010101010101i64
                                          * (((v14 & 0x3333333333333333i64)
                                            + ((v14 >> 2) & 0x3333333333333333i64)
                                            + (((v14 & 0x3333333333333333i64) + ((v14 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24 )
          PpmParkCoreMask = 0;
      }
      else
      {
        v12 = (0x101010101010101i64
             * (((v14 & 0x3333333333333333i64)
               + ((v14 >> 2) & 0x3333333333333333i64)
               + (((v14 & 0x3333333333333333i64) + ((v14 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
      }
    }
    v11 = (char *)a11;
    if( PpmParkCoreMask )
      PpmParkGranularity = v12;
  }
  HIDWORD(Count) = 0;
  v15 = 0;
  v16 = 0;
  HIDWORD(a7) = 0;
  if( !KeNumberNodes )
  {
LABEL_54:
    v37 = (UINT8 *)ExAllocatePoolWithTag(NonPagedPoolNx, 8i64 * v15, 0x704D5050ui64);
    a9 = (INT64)v37;
    v38 = v37;
    if( v37 )
    {
      memset((INT64)v37, 0i64);
      v40 = v38;
      if( v8 )
      {
        v41 = (unsigned int *)(v11 + 120);
        v42 = v8;
        a8 = v8;
        do
        {
          v43 = *((unsigned __int8 *)v41 - 114);
          v44 = v40;
          *((_QWORD *)v41 - 5) = v40;
          v45 = 8i64 * ++v43;
          v46 = &v40[v45];
          *v41 = v43;
          *((_QWORD *)v41 - 4) = v46;
          v47 = &v46[v45];
          *((_QWORD *)v41 - 3) = v47;
          v40 = &v47[v45];
          memmove(v44, (UINT8 *)(*((_QWORD *)v41 - 6) + 32i64), v45);
          memmove(*((UINT8 **)v41 - 4), (UINT8 *)(*((_QWORD *)v41 - 6) + 32i64), 8i64 * *v41);
          v48 = (unsigned __int8 *)(v41 + 2);
          *((_QWORD *)v41 - 2) = *(_QWORD *)(*((_QWORD *)v41 - 6) + 24i64);
          *((_QWORD *)v41 - 1) = *(_QWORD *)(*((_QWORD *)v41 - 6) + 24i64);
          if( *((_BYTE *)v41 - 114) != *((_BYTE *)v41 + 8) )
          {
            v68 = 2i64;
            v69 = v41 + 8;
            v70 = v41 + 22;
            do
            {
              v71 = *v48;
              v72 = v40;
              if( (_BYTE)v71 )
              {
                *((_QWORD *)v70 - 5) = v40;
                v73 = v71 + 1;
                v74 = 8i64 * v73;
                v75 = &v40[v74];
                *v70 = v73;
                *((_QWORD *)v70 - 4) = v75;
                v76 = &v75[v74];
                *((_QWORD *)v70 - 3) = v76;
                v40 = &v76[v74];
                memmove(v72, (UINT8 *)(*(_QWORD *)v69 + 32i64), v74);
                memmove(*((UINT8 **)v70 - 4), (UINT8 *)(*(_QWORD *)v69 + 32i64), 8i64 * *v70);
                *((_QWORD *)v70 - 2) = *(_QWORD *)(*(_QWORD *)v69 + 24i64);
                *((_QWORD *)v70 - 1) = *(_QWORD *)(*(_QWORD *)v69 + 24i64);
              }
              v69 += 2;
              v70 += 12;
              ++v48;
              --v68;
            }
            while( v68 );
            v42 = a8;
          }
          v41 += 68;
          a8 = --v42;
        }
        while( v42 );
        v11 = (char *)a11;
        v8 = HIDWORD(a6);
        v38 = (UINT8 *)a9;
      }
      KeAcquireSpinLockRaiseToDpc(&PpmParkStateLock, v39);
      v50 = v49;
      LODWORD(PpmParkNumNodes) = v8;
      PpmParkNodes = (INT64)v11;
      PpmParkHistograms = (INT64)v38;
      KxReleaseSpinLock(&PpmParkStateLock);
      __writecr8(v50);
      v11 = 0i64;
      v38 = 0i64;
    }
    goto LABEL_61;
  }
  while( 1 )
  {
    KeQueryNodeActiveAffinity(v2, &Affinity_8, 0i64);
    Group = Affinity_8.Group;
    v18 = Affinity_8.Group >= (unsigned __int16)PpmCheckRegistered ? 0i64 : *(&PpmCheckRegistered + Affinity_8.Group + 1);
    v19 = v18 & Affinity_8.Mask;
    Affinity_8.Mask &= v18;
    if( Affinity_8.Mask )
      break;
LABEL_52:
    LODWORD(v2) = v2 + 1;
    HIDWORD(a7) = v2;
    if( (unsigned int)v2 >= (unsigned __int16)KeNumberNodes )
    {
      v8 = HIDWORD(a6);
      v15 = HIDWORD(Count);
      goto LABEL_54;
    }
  }
  LODWORD(a8) = v16 + 1;
  v20 = &v11[272 * v16];
  v21 = 0;
  *((_WORD *)v20 + 2) = Affinity_8.Group;
  *((_QWORD *)v20 + 1) = v19;
  do
  {
    v22 = v21;
    if( v21 )
      v22 = PpmHeteroPolicy != 0 ? v21 : 0;
    LOWORD(Affinity) = Group;
    *((_QWORD *)&v89 + 1) = v19;
    *(_QWORD *)&v89 = 0i64;
    while( !(unsigned int)KeEnumerateNextProcessor(&a6, (unsigned __int16 **)&v89) )
    {
      KeGetPrcb((unsigned int)a6);
      if( *(_BYTE *)(v23 + 33208) == v21 )
      {
        ++v20[v22 + 128];
        *(_QWORD *)&v20[8 * v22 + 16] |= *(_QWORD *)(v23 + 200);
      }
    }
    ++v21;
  }
  while( v21 < 2u );
  v2 = HIDWORD(a7);
  v24 = v20 + 128;
  v11 = (char *)a11;
  v25 = 0;
  v26 = v20[129];
  if( !v20[128] )
  {
    *v24 = v26;
    *((_QWORD *)v20 + 2) = *((_QWORD *)v20 + 3);
    v26 = 0;
    v20[129] = 0;
    *((_QWORD *)v20 + 3) = 0i64;
  }
  if( !v26 )
    v20[146] |= 4u;
  v27 = 2i64;
  v28 = 0;
  v29 = (unsigned __int8 *)(v20 + 128);
  do
  {
    v30 = *v29;
    v29[10] = v30;
    v28 += v30;
    v29[15] = v30;
    ++v29;
    --v27;
  }
  while( v27 );
  result = 1310721;
  HIDWORD(Count) += v28 + 2 * v28 + 3;
  memset((INT64)result_4, 0i64);
  v31 = *((unsigned __int16 *)v20 + 2);
  v32 = *((_QWORD *)v20 + 1);
  if( (unsigned __int16)result <= (unsigned __int16)v31 )
    LOWORD(result) = v31 + 1;
  *(_QWORD *)&result_4[8 * v31 + 4] |= v32;
  if( (unsigned int)v2 < (unsigned int)a7 )
    v33 = (char *)P + 272 * v2 + 72;
  else
    v33 = 0i64;
  if( (int)PpmIdleInitializeConcurrency((unsigned __int16 *)&result, (_QWORD *)v20 + 9, v33) < 0 )
  {
    v38 = 0i64;
    goto LABEL_61;
  }
  if( v28 == (unsigned __int8)*v24 )
  {
LABEL_47:
    v34 = PpmParkGranularity;
    v35 = 1;
    v16 = a8;
    v20[6] = v28;
    v20[135] = v28;
    v20[137] = v28;
    if( !PpmParkMultiparkGranularity )
      v35 = PpmParkMultiparkGranularity;
    v36 = v28 / v35;
    if( v36 < v34 )
      v36 = v34;
    v20[145] = v36;
    goto LABEL_52;
  }
  v63 = (__int64 *)(v20 + 16);
  while( 1 )
  {
    v64 = (unsigned __int8)*v24;
    if( (_BYTE)v64 )
    {
      result = 1310721;
      HIDWORD(Count) += v64 + 2 * v64 + 3;
      memset((INT64)result_4, 0i64);
      v65 = *((unsigned __int16 *)v20 + 2);
      v66 = *v63;
      if( (unsigned __int16)result <= (unsigned __int16)v65 )
        LOWORD(result) = v65 + 1;
      *(_QWORD *)&result_4[8 * v65 + 4] |= v66;
      v67 = (unsigned int)v2 >= (unsigned int)a7 ? 0i64 : (char *)P + 272 * v2 + 8 * v25 + 152;
      if( (int)PpmIdleInitializeConcurrency((unsigned __int16 *)&result, &v20[8 * v25 + 152], v67) < 0 )
        break;
    }
    ++v63;
    ++v25;
    ++v24;
    if( v25 >= 2 )
      goto LABEL_47;
  }
  v38 = (UINT8 *)a9;
LABEL_61:
  if( v11 )
  {
    if( HIDWORD(a6) )
    {
      v77 = (PVOID *)(v11 + 72);
      v78 = HIDWORD(a6);
      do
      {
        if( *v77 )
          ExFreePoolWithTag(*v77, 0x704D5050u);
        v79 = 2i64;
        v80 = v77 + 10;
        do
        {
          if( *v80 )
            ExFreePoolWithTag(*v80, 0x704D5050u);
          ++v80;
          --v79;
        }
        while( v79 );
        v77 += 34;
        --v78;
      }
      while( v78 );
    }
    ExFreePoolWithTag(v11, 0x704D5050u);
  }
  if( v38 )
    ExFreePoolWithTag(v38, 0x704D5050u);
LABEL_64:
  v51 = P;
  if( P )
  {
    if( (_DWORD)a7 )
    {
      v52 = (PVOID *)((char *)P + 72);
      v53 = (unsigned int)a7;
      do
      {
        if( *v52 )
          ExFreePoolWithTag(*v52, 0x704D5050u);
        v54 = 2i64;
        v55 = v52 + 10;
        do
        {
          if( *v55 )
            ExFreePoolWithTag(*v55, 0x704D5050u);
          ++v55;
          --v54;
        }
        while( v54 );
        v52 += 34;
        --v53;
      }
      while( v53 );
    }
    ExFreePoolWithTag(v51, 0x704D5050u);
  }
  if( v88 )
    ExFreePoolWithTag(v88, 0x704D5050u);
  PpmParkApplyPolicy();
  PpmParkParkingAvailable(v57, v56, v58, v59, Count, a6, a7, a8, a9, (INT64)P, a11, (INT64)v88, v89);
  return v60;
}

Referenced by:

PpmCheckInitProcessors