PpmParkComputeUnparkMask

__int64 __fastcall PpmParkComputeUnparkMask(
        unsigned __int16 a1,
        UINT64 a2,
        __int64 a3,
        __int64 a4,
        unsigned int UnparkCount,
        unsigned int a6,
        UINT64 OsUnpark,
        UINT64 PlatformPark,
        UINT64 *a9,
        UINT64 *a10,
        _DWORD *a11){
  __int64 v13; 
  __int64 result; 
  UINT64 v15; 
  UINT64 v16; 
  __int64(__fastcall *v17)(_QWORD, _QWORD, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *); 
  __int16 v18; 
  unsigned __int16 v19; 
  __int64 v20; 
  UINT64 v21; 
  __int64 v22; 
  UINT64 PlatformUnpark; 
  UINT64 a7; 
  UINT64 v25; 
  UINT64 v26; 
  UINT64 v27; 
  UINT64 v28; 
  UINT64 v29; 
  __int64 v30; 
  UINT64 v31; 
  UINT64 v32; 
  unsigned __int64 v33; 
  _KPRCB *Prcb; 
  _KPRCB *v35; 
  unsigned __int64 CoreProcessorSet; 
  unsigned __int64 v37; 
  unsigned int v38; 
  unsigned __int64 v39; 
  UINT64 v40; 
  void(__fastcall *v42)(_QWORD, __int64, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *); 
  UINT64 v43; 
  unsigned int v45; 
  UINT64 v46; 
  __int64 v48; 
  __int64 v49[22]; 
  __int64 v50[22]; 
  UINT64 v51[22]; 
  UINT64 v52[22]; 
  int v53[44]; 

  v13 = a1;
  memset(v53, 0i64, 0xA8u);
  memset(v49, 0i64, 0xA8u);
  memset(v51, 0i64, 0xA8u);
  memset(v50, 0i64, 0xA8u);
  result = (__int64)memset(v52, 0i64, 0xA8u);
  *a9 = 0i64;
  *a10 = 0i64;
  if( !a6 )
  {
    *a9 = a2;
    return result;
  }
  v15 = a2 - ((a2 >> 1) & 0x5555555555555555i64);
  result = (0x101010101010101i64
          * (((v15 & 0x3333333333333333i64)
            + ((v15 >> 2) & 0x3333333333333333i64)
            + (((v15 & 0x3333333333333333i64) + ((v15 >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
  if( a6 == (_DWORD)result && !UnparkCount )
  {
    *a10 = a2;
    return result;
  }
  v16 = (v15 & 0x3333333333333333i64) + (((a2 - ((a2 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64);
  result = (0x101010101010101i64 * ((v16 + (v16 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
  if( UnparkCount != (_DWORD)result )
  {
    if( UnparkCount
      && (v42 = (void(__fastcall *)(_QWORD, __int64, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *))*(&stru_140C23628 + 479)) != 0i64 )
    {
      LODWORD(v50[0]) = 1310721;
      memset((char *)v50 + 4, 0i64, 0xA4u);
      v53[0] = 1310721;
      memset(&v53[1], 0i64, 0xA4u);
      LODWORD(v49[0]) = 1310721;
      memset((char *)v49 + 4, 0i64, 0xA4u);
      LODWORD(v51[0]) = 1310721;
      memset((char *)v51 + 4, 0i64, 0xA4u);
      LODWORD(v52[0]) = 1310721;
      memset((char *)v52 + 4, 0i64, 0xA4u);
      v18 = 1;
      if( (_WORD)v13 )
        v18 = v13 + 1;
      LOWORD(v50[0]) = v18;
      v19 = v49[0];
      v50[v13 + 1] |= a2;
      if( v19 <= (unsigned __int16)v13 )
        v19 = v13 + 1;
      LOWORD(v49[0]) = v19;
      v49[v13 + 1] |= OsUnpark;
      v20 = v49[v13 + 1];
      if( LOWORD(v49[0]) <= (unsigned __int16)v13 )
      {
        LOWORD(v49[0]) = v13 + 1;
        v20 = v49[v13 + 1];
      }
      v21 = PlatformPark;
      v22 = *(&PopIrpWorkerControlEvent + 152);
      v49[v13 + 1] = PlatformPark | v20;
      v42(0i64, v22, UnparkCount, v50, v53, v49, v51, v52);
      if( (unsigned __int16)v13 >= LOWORD(v51[0]) )
        PlatformUnpark = 0i64;
      else
        PlatformUnpark = v51[v13 + 1];
      if( (unsigned __int16)v13 >= LOWORD(v52[0]) )
        a7 = 0i64;
      else
        a7 = v52[v13 + 1];
      PpmEventParkNodePreference(v13, a2, UnparkCount, OsUnpark, PlatformPark, PlatformUnpark, a7);
      v25 = ~(PlatformPark | OsUnpark);
      v26 = v25 & PlatformUnpark;
      v27 = v25 & a7;
    }
    else
    {
      v21 = PlatformPark;
      v26 = 0i64;
      v27 = 0i64;
    }
    v46 = v26;
    *a9 = a2;
    v28 = a2 & ~(v21 | OsUnpark | v26 | v27);
    if( (a2 & v21) != 0 )
    {
      *a11 |= 0x200u;
      v29 = PlatformPark & *a9;
    }
    else if( (a2 & v27) != 0 )
    {
      *a11 |= 0x400u;
      v29 = v27 & *a9;
    }
    else if( (a2 & ~(v21 | OsUnpark | v26 | v27)) != 0 )
    {
      *a11 |= 0x800u;
      v29 = v28 & *a9;
    }
    else
    {
      v29 = v26 & a2;
      if( (v26 & a2) != 0 )
        *a11 |= 0x80000u;
      else
        v29 = 0i64;
    }
    v30 = a3;
    v31 = v29;
    v43 = v29;
    result = a4 & (a2 ^ a3);
    v45 = 0;
    v48 = result;
    while( 1 )
    {
      if( !v31 )
        return result;
      if( ((PopHeteroSystem - 3) & 0xFFFFFFFD) == 0 )
      {
        *a11 |= 0x8000u;
        v32 = PpmHeteroRestrictToFavoredClass(v31);
        v30 = a3;
        v31 = v32;
      }
      if( (v48 & v31) != 0 )
      {
        *a11 |= 0x1000u;
        v31 &= v48;
      }
      if( (v31 & ~v30) != 0 )
      {
        *a11 |= 0x2000u;
        v31 &= ~v30;
      }
      _BitScanForward64(&v33, v31);
      Prcb = KeGetPrcb((unsigned int)KiProcessorNumberToIndexMappingTable[64 * a1 + (v33 & 0x3F)]);
      v35 = Prcb;
      if( PpmParkCoreMask )
        CoreProcessorSet = Prcb->CoreProcessorSet;
      else
        CoreProcessorSet = Prcb->GroupSetMember;
      *a9 &= ~CoreProcessorSet;
      if( v45 >= UnparkCount )
        *a10 |= CoreProcessorSet;
      v37 = ((CoreProcessorSet - ((CoreProcessorSet >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
          + (((CoreProcessorSet - ((CoreProcessorSet >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64);
      v38 = ((unsigned int)((0x101010101010101i64 * ((v37 + (v37 >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24) + v45;
      v45 = v38;
      v31 &= ~Prcb->ParentNode->Affinity.Mask;
      v39 = ~Prcb->PackageProcessorSet.Bitmap[Prcb->Group] & v43;
      result = ~Prcb->CoreProcessorSet;
      v29 &= result;
      v43 &= ~v35->PackageProcessorSet.Bitmap[v35->Group];
      if( !v31 )
        break;
LABEL_65:
      v30 = a3;
      if( v38 >= a6 )
        return result;
    }
    if( v39 )
    {
LABEL_64:
      v31 = v39;
      goto LABEL_65;
    }
    if( !v29 )
    {
      v40 = *a9;
      result = PlatformPark;
      if( (*a9 & PlatformPark) != 0 )
      {
        *a11 |= 0x200u;
      }
      else
      {
        if( (v40 & v27) == 0 )
        {
          if( (v40 & v28) != 0 )
          {
            *a11 |= 0x800u;
            v29 = v28 & *a9;
          }
          else if( (v40 & v46) != 0 )
          {
            *a11 |= 0x80000u;
            v29 = v46 & *a9;
          }
          else
          {
            v29 = 0i64;
          }
          goto LABEL_63;
        }
        *a11 |= 0x400u;
      }
      v29 = PlatformPark & *a9;
    }
LABEL_63:
    v39 = v29;
    v43 = v29;
    goto LABEL_64;
  }
  v17 = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD, __int64 *, int *, __int64 *, UINT64 *, UINT64 *))*(&stru_140C23628 + 479);
  if( *(&stru_140C23628 + 479) && a3 )
  {
    LODWORD(v50[0]) = 1310721;
    memset((char *)v50 + 4, 0i64, 0xA4u);
    v53[0] = 1310721;
    memset(&v53[1], 0i64, 0xA4u);
    LODWORD(v49[0]) = 1310721;
    memset((char *)v49 + 4, 0i64, 0xA4u);
    LODWORD(v51[0]) = 1310721;
    memset((char *)v51 + 4, 0i64, 0xA4u);
    LODWORD(v52[0]) = 1310721;
    memset((char *)v52 + 4, 0i64, 0xA4u);
    if( (_WORD)v13 )
      LOWORD(v50[0]) = v13 + 1;
    v50[v13 + 1] |= a2;
    return v17(0i64, *(&PopIrpWorkerControlEvent + 152), UnparkCount, v50, v53, v49, v51, v52);
  }
  return result;
}

Referenced by:

PpmParkCalculateCoreParkingMask