PpmParkApplyPolicy

VOID __stdcall PpmParkApplyPolicy(){
  int v0; 
  __int64 v1; 
  __int64 v2; 
  unsigned int v3; 
  int v4; 
  int v5; 
  unsigned int v6; 
  unsigned __int16 v7; 
  unsigned int v8; 
  int v9; 
  __int64 v10; 
  char v11; 
  unsigned __int8 v12; 
  int v13; 
  unsigned __int8 v14; 
  __int64 v15; 
  _QWORD *v16; 
  __int64 v17; 
  NPTEXTMETRIC *v18; 
  unsigned int v19; 
  __int64 v20; 
  int v21; 
  unsigned int v22; 
  unsigned __int8 v23; 
  unsigned int v24; 
  unsigned __int8 v25; 
  char v26; 
  unsigned __int8 v27; 
  unsigned __int16 v28; 
  int v29; 
  _KPRCB *Prcb; 
  unsigned __int16 v31; 
  __int64 v32; 
  int v33; 
  char v34; 
  unsigned __int8 v35; 
  unsigned __int8 v36; 
  char v37; 
  char v38; 
  char v39; 
  char v40; 
  char v41; 
  char v42; 
  char v43; 
  char v44; 
  unsigned __int16 v45; 
  __int64 v46; 
  unsigned __int8 v47; 
  int v48; 
  unsigned __int8 v49; 
  unsigned __int16 v50; 
  __int64 v51; 
  unsigned __int8 v52; 
  int v53; 
  unsigned __int8 v54; 
  char v55; 
  struct _KPRCB *CurrentPrcb; 
  UINT64 v57; 
  unsigned __int16 v58; 
  unsigned int v59; 
  UINT64 ProcIndex; 
  unsigned int v61; 
  unsigned int v62; 
  __int64 v63; 
  NPTEXTMETRIC *v64; 
  _QWORD *v65; 
  __int64 v66; 
  __int64 v67; 
  _KAFFINITY_ENUMERATION_CONTEXT Context; 
  char v69; 
  unsigned __int8 v70; 
  __int16 v71; 
  __int16 v72; 

  v0 = 0;
  memset(&Context, 0, sizeof(Context));
  LODWORD(ProcIndex) = 0;
  if( PpmParkNodes )
  {
    v1 = *(&stru_140C00F40 + 365) + 2736i64 * *(&stru_140C23628 + 441);
    v67 = v1;
    v72 = *(_WORD *)(v1 + 180);
    v71 = *(_WORD *)(v1 + 182);
    LODWORD(v2) = 64;
    if( !KeGetPrcb(0i64)->PowerState.CheckContext.Domain )
    {
      v34 = PpmParkInitialClass1UnParkCount;
      if( (unsigned int)PpmParkInitialClass1UnParkCount > 0x40 )
        v34 = 64;
      HIBYTE(v72) = 0;
      LOBYTE(v2) = v34;
    }
    v3 = PpmParkNumNodes;
    v4 = *(&stru_140CF2E80 + 1951);
    v5 = *(&stru_140CF2E80 + 1952);
    HIDWORD(ProcIndex) = v2;
    v58 = 0;
    v6 = *(&stru_140CF2E80 + 1951) / (unsigned int)PpmParkNumNodes
       - *(&stru_140CF2E80 + 1951) / (unsigned int)PpmParkNumNodes % (unsigned __int8)PpmParkGranularity;
    v62 = v6;
    v7 = 0;
    v8 = *(&stru_140CF2E80 + 1952) / (unsigned int)PpmParkNumNodes
       - *(&stru_140CF2E80 + 1952) / (unsigned int)PpmParkNumNodes % (unsigned __int8)PpmParkGranularity;
    v61 = v8;
    if( (_DWORD)PpmParkNumNodes )
    {
      do
      {
        v9 = (unsigned __int8)v6;
        v10 = PpmParkNodes + 272i64 * v7;
        v11 = PpmParkGranularity;
        v12 = *(_BYTE *)(v10 + 6);
        v13 = v12 - (unsigned __int8)PpmParkGranularity;
        if( v9 > v13 )
          LOBYTE(v9) = v12 - PpmParkGranularity;
        *(_BYTE *)(v10 + 134) = v9;
        v4 -= (unsigned __int8)v9;
        v14 = v8;
        if( (unsigned __int8)v8 > v13 )
          v14 = v12 - v11;
        v5 -= v14;
        *(_BYTE *)(v10 + 136) = v14;
        v69 = 0;
        v15 = v10 - (_QWORD)&v71;
        v63 = 0i64;
        v16 = (_QWORD *)(v10 + 56);
        v66 = v10 - (_QWORD)&v71;
        v17 = 0i64;
        v64 = 0i64;
        v18 = 0i64;
        v59 = 0;
        v19 = 0;
        v65 = (_QWORD *)(v10 + 56);
        v20 = 0i64;
        do
        {
          v21 = *((unsigned __int8 *)&v71 + v20 + v15 + 128);
          if( (_BYTE)v21 )
          {
            v22 = (v21 * (unsigned int)*((unsigned __int8 *)&v71 + v20) + 50) / 0x64;
            v23 = (v21 - (unsigned __int8)v22) % (unsigned __int8)PpmParkGranularity + v22;
            v24 = (v21 * (unsigned int)*((unsigned __int8 *)&v72 + v20) + 50) / 0x64;
            v25 = (v21 - (unsigned __int8)v24) % (unsigned __int8)PpmParkGranularity + v24;
            if( v59 )
            {
              v35 = v23;
              if( v23 >= (unsigned __int8)v2 )
                v35 = v2;
              v23 = v35;
            }
            if( v25 )
            {
              v26 = v25;
              if( (unsigned __int8)PpmParkGranularity > v25 )
                v26 = PpmParkGranularity;
              v25 = v26;
            }
            v27 = v25;
            v2 = 0i64;
            Context.Affinity = 0i64;
            if( v23 >= v25 )
              v27 = v23;
            v28 = *(_WORD *)(v10 + 4);
            v70 = v27;
            Context.CurrentMask = *(v16 - 5);
            Context.CurrentIndex = v28;
            while( 1 )
            {
              KeEnumerateNextProcessor(&ProcIndex, &Context);
              if( v29 )
                break;
              Prcb = KeGetPrcb((unsigned int)ProcIndex);
              if( Prcb->PowerState.HwFeedbackParkHint )
                v2 |= Prcb->GroupSetMember;
            }
            v16 = v65;
            v18 = (NPTEXTMETRIC *)(v2 | (unsigned __int64)v64);
            v17 = *v65 | v63;
            v69 += v25;
            v15 = v66;
            *v65 = v2;
            LOBYTE(v2) = BYTE4(ProcIndex);
            *(_BYTE *)(v10 + v20 + 132) = v70;
            v19 = v59;
            *(_BYTE *)(v10 + v20 + 130) = v25;
            v63 = v17;
            v64 = v18;
          }
          ++v19;
          ++v16;
          ++v20;
          v59 = v19;
          v65 = v16;
        }
        while( v19 < 2 );
        if( (NPTEXTMETRIC *)v17 != v18 )
          PpmEventParkNodeParkHintChanged(*(_WORD *)(v10 + 4), *(_QWORD *)(v10 + 8), v18);
        if( !v69 )
        {
          v36 = PpmParkGranularity;
          *(_BYTE *)(v10 + 130) = PpmParkGranularity;
          if( v36 <= *(_BYTE *)(v10 + 132) )
            v36 = *(_BYTE *)(v10 + 132);
          *(_BYTE *)(v10 + 132) = v36;
        }
        if( PpmHeteroPolicy == 2 )
        {
          v37 = *(_BYTE *)(v10 + 130);
          v38 = 1;
          *(_BYTE *)(v10 + 139) = 0;
          *(_BYTE *)(v10 + 131) = 0;
          if( (unsigned __int8)v37 > 1u )
            v38 = v37;
          *(_BYTE *)(v10 + 133) = 0;
          v39 = *(_BYTE *)(v10 + 132);
          *(_BYTE *)(v10 + 130) = v38;
          v40 = 1;
          if( (unsigned __int8)v39 > 1u )
            v40 = v39;
          *(_BYTE *)(v10 + 132) = v40;
          *(_BYTE *)(v10 + 146) |= 4u;
        }
        else if( PpmHeteroPolicy == 3 && *(_BYTE *)(v10 + 129) )
        {
          v41 = *(_BYTE *)(v10 + 131);
          v42 = 1;
          *(_BYTE *)(v10 + 138) = 0;
          *(_BYTE *)(v10 + 130) = 0;
          if( (unsigned __int8)v41 > 1u )
            v42 = v41;
          *(_BYTE *)(v10 + 132) = 0;
          v43 = *(_BYTE *)(v10 + 133);
          *(_BYTE *)(v10 + 131) = v42;
          v44 = 1;
          if( (unsigned __int8)v43 > 1u )
            v44 = v43;
          *(_BYTE *)(v10 + 146) |= 2u;
          *(_BYTE *)(v10 + 133) = v44;
        }
        v3 = PpmParkNumNodes;
        v7 = v58 + 1;
        LOBYTE(v8) = v61;
        LOBYTE(v6) = v62;
        ++v58;
      }
      while( v58 < (unsigned int)PpmParkNumNodes );
      v1 = v67;
    }
    do
    {
LABEL_30:
      if( !v4 )
        goto LABEL_31;
      v45 = 0;
    }
    while( !v3 );
    while( v4 )
    {
      v46 = PpmParkNodes + 272i64 * v45;
      v47 = *(_BYTE *)(v46 + 6);
      if( v47 )
      {
        v48 = (unsigned __int8)PpmParkGranularity;
        v49 = PpmParkGranularity + *(_BYTE *)(v46 + 134);
        if( v49 < v47 )
        {
          *(_BYTE *)(v46 + 134) = v49;
          v4 -= v48;
        }
      }
      if( ++v45 >= v3 )
        goto LABEL_30;
    }
LABEL_31:
    while( v5 )
    {
      v50 = 0;
      if( v3 )
      {
        while( v5 )
        {
          v51 = PpmParkNodes + 272i64 * v50;
          v52 = *(_BYTE *)(v51 + 6);
          if( v52 )
          {
            v53 = (unsigned __int8)PpmParkGranularity;
            v54 = PpmParkGranularity + *(_BYTE *)(v51 + 136);
            if( v54 < v52 )
            {
              *(_BYTE *)(v51 + 136) = v54;
              v5 -= v53;
            }
          }
          if( ++v50 >= v3 )
            goto LABEL_31;
        }
        break;
      }
    }
    v31 = 0;
    if( v3 )
    {
      do
      {
        v32 = PpmParkNodes + 272i64 * v31;
        v33 = *(unsigned __int8 *)(v32 + 134);
        if( *(unsigned __int8 *)(v32 + 135) != *(unsigned __int8 *)(v32 + 6) - v33
          || *(unsigned __int8 *)(v32 + 137) != *(unsigned __int8 *)(v32 + 6) - *(unsigned __int8 *)(v32 + 136) )
        {
          PpmEventParkNodeCapChange(*(_WORD *)(v32 + 4), *(_QWORD *)(v32 + 8), v33, *(_BYTE *)(v32 + 136));
          v55 = *(_BYTE *)(v32 + 6) - *(_BYTE *)(v32 + 134);
          *(_BYTE *)(v32 + 137) = *(_BYTE *)(v32 + 6) - *(_BYTE *)(v32 + 136);
          *(_BYTE *)(v32 + 135) = v55;
        }
        ++v31;
      }
      while( v31 < (unsigned int)PpmParkNumNodes );
    }
    if( *(_DWORD *)(v1 + 184) )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      v57 = *(unsigned int *)(v1 + 184);
      PpmParkSoftParkingEnabled = 1;
      v0 = PpmConvertTime(1000000i64 * CurrentPrcb->MHz, 0xF4240ui64, v57);
    }
    else
    {
      PpmParkSoftParkingEnabled = 0;
    }
  }
  KeSoftParkedQueueThreshold = v0;
}

Referenced by:

PpmParkApplyForcedMask
PpmParkClearForcedMask
PpmParkRegisterParking
PpmParkSetLpiCap
PpmReapplyPerfPolicy
PpmRegisterPerfStates