PpmInstallPlatformIdleStates

INT64 __fastcall PpmInstallPlatformIdleStates(INT64 a1){
  INT64 v1; 
  char v2; 
  unsigned int v3; 
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v6; 
  unsigned int v7; 
  _DWORD *v8; 
  int v9; 
  int v10; 
  unsigned int v11; 
  __int64 v12; 
  __int64 v13; 
  UINT64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  VOID *PoolWithTag; 
  INT64 v18; 
  UINT64 v19; 
  __int64 v20; 
  __int64 v21; 
  _QWORD *v22; 
  _DWORD *v23; 
  __int64 v24; 
  UINT64 v25; 
  __int64 v26; 
  UINT64 v27; 
  __int64 v28; 
  __int64 v29; 
  __int128 v30; 
  UINT64 v31; 
  __int64 v32; 
  unsigned int v33; 
  __int64 v34; 
  __int64 v35; 
  __int64 v36; 
  unsigned int i; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  __int64 v41; 
  __int64 v42; 
  __int64 v43; 
  __int64 v44; 
  INT64 v45; 
  __int64 v46; 
  __int64 v47; 
  unsigned int v48; 
  __int64 v49; 
  __int64 v50; 
  unsigned int v51; 
  __int64 v52; 
  __int64 v53; 
  unsigned int ProcessorIndexFromNumber; 
  __int64 v55; 
  __int64 v56; 
  int v57; 
  __int64 v58; 
  __int64 v59; 
  unsigned int j; 
  __int64 v61; 
  __int64 v62; 
  __int64 v63; 
  unsigned int v64; 
  INT64 v65; 
  __int64 v66; 
  bool v67; 
  unsigned int v69; 
  unsigned int v70; 
  UINT64 v71; 
  UINT64 v72; 
  unsigned int v74; 
  int v75; 
  __int64 v76; 
  unsigned int v77; 
  unsigned int ProcessorNumber; 
  v1 = a1;
  PopAcquireRwLockExclusive((_POP_RW_LOCK *)&PpmIdlePolicyLock);
  v2 = 1;
  if( PpmPlatformStates && !*(_BYTE *)(v1 + 48) )
  {
    v3 = -1073741431;
LABEL_75:
    PopReleaseRwLock((UINT64)&PpmIdlePolicyLock);
    return v3;
  }
  v4 = *(_DWORD *)(v1 + 4);
  if( !v4 || *(_DWORD *)(v1 + 8) > v4 )
  {
LABEL_5:
    v3 = -1073741811;
    goto LABEL_75;
  }
  PpmIdleUpdatePlatformDependencies(v1);
  v5 = KeNumberProcessors_0;
  v6 = 0;
  v7 = *(_DWORD *)(v1 + 8);
  v77 = KeNumberProcessors_0;
  if( v7 )
  {
    v8 = (_DWORD *)(v1 + 72);
    while( *v8 <= (unsigned int)KeNumberProcessors_0 )
    {
      ++v6;
      v8 += 12;
      if( v6 >= v7 )
        goto LABEL_11;
    }
    goto LABEL_5;
  }
LABEL_11:
  v9 = 0;
  v10 = 0;
  if( v7 )
  {
    v11 = 0;
    if( (_DWORD)KeNumberProcessors_0 )
    {
      while( 1 )
      {
        KeGetPrcb(v11);
        v13 = *(_QWORD *)(v12 + 0x8000);
        if( !v13 )
          goto LABEL_5;
        v9 += *(_DWORD *)(v13 + 32);
        if( ++v11 >= v5 )
        {
          v7 = *(_DWORD *)(v1 + 8);
          break;
        }
      }
    }
    v9 = v7 * (v5 + v9);
    v10 = v5 * v7;
  }
  v14 = PpmPlatformStates;
  if( PpmPlatformStates )
  {
    if( *(_DWORD *)(PpmPlatformStates + 8) != v5
      || *(_DWORD *)PpmPlatformStates != v4
      || (LODWORD(v26) = v7, *(_DWORD *)(PpmPlatformStates + 4) != 1) )
    {
      v3 = -1073741811;
      goto LABEL_74;
    }
  }
  else
  {
    v74 = (384 * v4 + 71) & 0xFFFFFFF8;
    ProcessorNumber = v74 + 24 * v10;
    v15 = ProcessorNumber + 24 * v9;
    v70 = (4 * v4 + 15) & 0xFFFFFFF8;
    v69 = (v15 + 1008 * v4 + 31) & 0xFFFFFFF8;
    v16 = v69 + v5 * v70;
    if( PpmIdleVetoList )
      v16 += (v4 * *(_DWORD *)PpmIdleVetoList) << 6;
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, v16, 0x694D5050ui64);
    v14 = (UINT64)PoolWithTag;
    if( !PoolWithTag )
    {
      v3 = -1073741670;
      goto LABEL_75;
    }
    memset((INT64)PoolWithTag, 0i64);
    *(_DWORD *)v14 = v4;
    *(_DWORD *)(v14 + 4) = *(_DWORD *)(v1 + 8) != 0;
    *(_DWORD *)(v14 + 8) = v5;
    *(_QWORD *)(v14 + 16) = *(_QWORD *)(v1 + 16);
    *(_QWORD *)(v14 + 24) = *(_QWORD *)(v1 + 24);
    *(_QWORD *)(v14 + 32) = *(_QWORD *)(v1 + 32);
    *(_QWORD *)(v14 + 40) = *(_QWORD *)(v1 + 40);
    v18 = v14 + v15;
    *(_QWORD *)(v14 + 48) = v18;
    *(_DWORD *)(v18 + 4) = v4;
    PpmResetPlatformIdleAccounting(v18);
    v19 = v14 + v69 + v5 * v70;
    v20 = 0i64;
    if( *(_DWORD *)(v1 + 4) )
    {
      do
      {
        v21 = 384 * v20;
        *(_BYTE *)(384 * v20 + v14 + 121) = 1;
        KeQueryActiveProcessorAffinity((_KAFFINITY_EX *)(384 * v20 + v14 + 128));
        *(_BYTE *)(384 * v20 + v14 + 104) = 7;
        v22 = (_QWORD *)(384 * v20 + v14 + 88);
        v22[1] = v22;
        *v22 = v22;
        if( PpmIdleDisableStatesAtBoot )
          *(_DWORD *)(v21 + v14 + 80) = 0x80000000;
        v23 = (_DWORD *)PpmIdleVetoList;
        if( PpmIdleVetoList )
        {
          if( (_DWORD)v20 == *(_DWORD *)(v1 + 4) - 1 )
            *(_BYTE *)(v21 + v14 + 105) = 1;
          *(_DWORD *)(v21 + v14 + 108) = *v23;
          *(_QWORD *)(v21 + v14 + 112) = v19;
          v19 += (unsigned __int64)(unsigned int)*v23 << 6;
          *(_QWORD *)(1008i64 * (unsigned int)v20 + v14 + v15 + 192) = v21 + v14 + 80;
        }
        v20 = (unsigned int)(v20 + 1);
      }
      while( (unsigned int)v20 < *(_DWORD *)(v1 + 4) );
      v5 = v77;
    }
    v24 = 0i64;
    v25 = v14 + v74;
    LODWORD(v26) = *(_DWORD *)(v1 + 8);
    v27 = v14 + ProcessorNumber;
    v71 = v27;
    v75 = 0;
    if( (_DWORD)v26 )
    {
      v28 = 24i64 * v5;
      do
      {
        v29 = 384 * v24;
        v30 = *(_OWORD *)(v1 + 48 * v24 + 80);
        *(_QWORD *)(v29 + v14 + 312) = v25;
        v25 += v28;
        *(_DWORD *)(v29 + v14 + 124) = v5;
        v72 = v25;
        *(_OWORD *)(v29 + v14 + 296) = v30;
        if( v5 )
        {
          v31 = v71;
          v32 = 0i64;
          v33 = 0;
          do
          {
            v34 = *(_QWORD *)(v29 + v14 + 312);
            KeGetPrcb(v33);
            v36 = *(_QWORD *)(v35 + 0x8000);
            *(_DWORD *)(v34 + v32) = v33++;
            v32 += 24i64;
            LODWORD(v35) = *(_DWORD *)(v36 + 32);
            *(_QWORD *)(v34 + v32 - 8) = v31;
            *(_DWORD *)(v34 + v32 - 16) = v35;
            v31 += 24i64 * *(unsigned int *)(v36 + 32);
          }
          while( v33 < v5 );
          v25 = v72;
          LODWORD(v24) = v75;
          v28 = 24i64 * v5;
          v71 = v31;
          v1 = a1;
        }
        LODWORD(v26) = *(_DWORD *)(v1 + 8);
        v24 = (unsigned int)(v24 + 1);
        v75 = v24;
      }
      while( (unsigned int)v24 < (unsigned int)v26 );
      v27 = v71;
    }
    for( i = 0; i < v5; ++i )
    {
      KeGetPrcb(i);
      v38 = 0i64;
      v40 = *(_QWORD *)(v39 + 0x8000);
      *(_QWORD *)(v40 + 752) = v14 + v69 + i * v70;
      *(_DWORD *)(v40 + 776) = *(_DWORD *)(v1 + 8);
      *(_QWORD *)(v40 + 784) = v27;
      v26 = *(unsigned int *)(v1 + 8);
      v27 += 24 * v26;
      if( (_DWORD)v26 )
      {
        do
        {
          v41 = 384 * v38;
          v42 = 3i64 * (unsigned int)(v26 - v38 - 1);
          v26 = *(_QWORD *)(v40 + 784);
          *(_DWORD *)(v26 + 8 * v42 + 4) = v38;
          v38 = (unsigned int)(v38 + 1);
          *(_DWORD *)(v26 + 8 * v42 + 8) = *(_DWORD *)(v41 + v14 + 124);
          *(_QWORD *)(v26 + 8 * v42 + 16) = *(_QWORD *)(v41 + v14 + 312);
          LODWORD(v26) = *(_DWORD *)(v1 + 8);
        }
        while( (unsigned int)v38 < (unsigned int)v26 );
      }
    }
  }
  v43 = 0i64;
  if( (_DWORD)v26 )
  {
    do
    {
      v44 = 0i64;
      v45 = v1 + 48 * v43;
      v46 = 384 * v43;
      *(_DWORD *)(v46 + v14 + 72) = *(_DWORD *)(v45 + 64);
      *(_DWORD *)(v46 + v14 + 76) = *(_DWORD *)(v45 + 68);
      if( *(_DWORD *)(v45 + 72) )
      {
        do
        {
          v47 = *(_QWORD *)(v45 + 96);
          v48 = 0;
          v49 = *(_QWORD *)(v46 + v14 + 312);
          v50 = 3i64 * *(unsigned int *)(v47 + 8 * v44);
          v51 = *(_DWORD *)(v49 + 24i64 * *(unsigned int *)(v47 + 8 * v44) + 8);
          if( v51 )
          {
            do
            {
              v52 = *(_QWORD *)(v49 + 8 * v50 + 16);
              v53 = 3i64 * (v51 - v48 - 1);
              *(_OWORD *)(v52 + 8 * v53) = 0i64;
              *(_QWORD *)(v52 + 8 * v53 + 16) = 0i64;
              *(_DWORD *)(v52 + 8 * v53 + 4) = v48;
              if( !*(_BYTE *)(v45 + 60) && v48 == *(unsigned __int8 *)(v45 + 61) )
                *(_BYTE *)(v52 + 24i64 * (v51 - v48 - 1) + 1) = 1;
              if( v48 >= *(unsigned __int8 *)(v47 + 8 * v44 + 4) )
              {
                *(_BYTE *)(v52 + 24i64 * (v51 - v48 - 1) + 2) = 1;
                if( !*(_BYTE *)(v47 + 8 * v44 + 6) )
                  *(_BYTE *)(v52 + 24i64 * (v51 - v48 - 1)) = 1;
              }
              v51 = *(_DWORD *)(v49 + 8 * v50 + 8);
              ++v48;
            }
            while( v48 < v51 );
          }
          v44 = (unsigned int)(v44 + 1);
        }
        while( (unsigned int)v44 < *(_DWORD *)(v45 + 72) );
      }
      if( *(_BYTE *)(v45 + 60) )
      {
        ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber((_PROCESSOR_NUMBER *)(v45 + 56));
        v55 = *(_QWORD *)(v46 + v14 + 312);
        v56 = 3i64 * ProcessorIndexFromNumber;
        memset(*(_QWORD *)(v55 + 24i64 * ProcessorIndexFromNumber + 16), 0i64);
        v57 = *(unsigned __int8 *)(v45 + 61);
        v58 = 3i64 * (unsigned int)(*(_DWORD *)(v55 + 8 * v56 + 8) - v57 - 1);
        v59 = *(_QWORD *)(v55 + 8 * v56 + 16);
        *(_DWORD *)(v59 + 8 * v58 + 4) = v57;
        *(_BYTE *)(v59 + 8 * v58 + 1) = 1;
      }
      v43 = (unsigned int)(v43 + 1);
    }
    while( (unsigned int)v43 < *(_DWORD *)(v1 + 8) );
    v5 = v77;
  }
  for( j = 0; j < v5; ++j )
  {
    KeGetPrcb(j);
    v61 = 0i64;
    v63 = *(_QWORD *)(v62 + 0x8000);
    v64 = *(_DWORD *)(v63 + 776);
    if( v64 )
    {
      do
      {
        v65 = v1 + 48 * v61 + 56;
        v66 = 3i64 * (v64 - (unsigned int)v61 - 1);
        v76 = *(_QWORD *)(v63 + 784);
        v67 = !*(_BYTE *)(v65 + 4) || (unsigned int)KeGetProcessorIndexFromNumber((_PROCESSOR_NUMBER *)v65) == j;
        v61 = (unsigned int)(v61 + 1);
        *(_BYTE *)(v76 + 8 * v66 + 1) = v67;
        v64 = *(_DWORD *)(v63 + 776);
      }
      while( (unsigned int)v61 < v64 );
    }
  }
  if( !PpmPlatformStates )
  {
    PpmEnableCoordinatedIdleStates((UINT64 *)v14, 0);
    v2 = 0;
  }
  v3 = 0;
LABEL_74:
  if( v2 )
    goto LABEL_75;
  return v3;
}

Referenced by:

No references.