PpmInstallCoordinatedIdleStates

INT64 __fastcall PpmInstallCoordinatedIdleStates(UINT64 *a1){
  UINT64 *v1; 
  char v2; 
  int updated; 
  __int64 v4; 
  int v5; 
  int v6; 
  int v7; 
  _DWORD *v8; 
  __int64 v9; 
  int v10; 
  int v11; 
  UINT64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  VOID *PoolWithTag; 
  INT64 v17; 
  __int64 v18; 
  UINT64 i; 
  __int64 v20; 
  _QWORD *v21; 
  _DWORD *v22; 
  UINT64 v23; 
  UINT64 v24; 
  unsigned __int16 *v25; 
  __int64 v26; 
  UINT64 v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  unsigned int v32; 
  UINT64 v33; 
  unsigned int v34; 
  __int64 v35; 
  __int64 v36; 
  _QWORD *v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  UINT64 v41; 
  char *v42; 
  __int64 v43; 
  __int64 v44; 
  __int64 v45; 
  __int64 v46; 
  __int64 v47; 
  __int64 v48; 
  unsigned int v49; 
  __int64 v50; 
  __int64 v51; 
  __int64 v52; 
  int v53; 
  __int64 v54; 
  __int64 v55; 
  unsigned int j; 
  __int64 v57; 
  unsigned int v58; 
  __int64 v59; 
  __int64 k; 
  char v61; 
  __int64 v62; 
  __int64 v63; 
  unsigned int v65; 
  int v66; 
  int v67; 
  unsigned int v68; 
  unsigned int v70; 
  unsigned int v71; 
  unsigned int v72; 
  v1 = a1;
  PopAcquireRwLockExclusive((_POP_RW_LOCK *)&PpmIdlePolicyLock);
  v2 = 1;
  if( PpmPlatformStates && !*((_BYTE *)v1 + 40) )
  {
    updated = -1073741431;
LABEL_51:
    PopReleaseRwLock((UINT64)&PpmIdlePolicyLock);
    return(unsigned int)updated;
  }
  updated = PpmIdleUpdateCoordinatedDependencies(v1);
  if( updated < 0 )
    goto LABEL_51;
  v4 = *(unsigned int *)v1;
  v68 = v4;
  if( !(_DWORD)v4 )
  {
    updated = -1073741811;
    goto LABEL_51;
  }
  v5 = KeNumberProcessors_0;
  v6 = 0;
  v70 = KeNumberProcessors_0;
  v7 = KeNumberProcessors_0 * v4;
  v8 = v1 + 31;
  v9 = *(unsigned int *)v1;
  do
  {
    v10 = v8[1];
    v6 += v10;
    v11 = *v8 * v10;
    v8 += 56;
    v7 += v11;
    --v9;
  }
  while( v9 );
  v12 = PpmPlatformStates;
  if( PpmPlatformStates )
  {
    if( *(_DWORD *)(PpmPlatformStates + 8) != (_DWORD)KeNumberProcessors_0
      || *(_QWORD *)PpmPlatformStates != ((unsigned int)v4 | 0x100000000i64) )
    {
      updated = -1073741811;
      goto LABEL_50;
    }
  }
  else
  {
    v13 = (384 * v4 + 71) & 0xFFFFFFF8;
    v72 = v13 + 24 * v6;
    v65 = v72 + 24 * v7;
    v14 = (v65 + 4 * KeNumberProcessors_0 * v4 + 7) & 0xFFFFFFF8;
    v66 = (4 * v4 + 15) & 0xFFFFFFF8;
    v15 = ((v14 + 1008 * v4 + 31) & 0xFFFFFFF8) + KeNumberProcessors_0 * v66;
    v67 = (v14 + 1008 * v4 + 31) & 0xFFFFFFF8;
    v71 = v15;
    if( PpmIdleVetoList )
      v15 += ((_DWORD)v4 * *(_DWORD *)PpmIdleVetoList) << 6;
    PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNxCacheAligned, v15, 0x694D5050ui64);
    v12 = (UINT64)PoolWithTag;
    if( !PoolWithTag )
    {
      updated = -1073741670;
      goto LABEL_51;
    }
    memset((INT64)PoolWithTag, 0i64);
    *(_DWORD *)v12 = v4;
    *(_DWORD *)(v12 + 4) = 1;
    *(_BYTE *)(v12 + 12) = 1;
    *(_DWORD *)(v12 + 8) = v5;
    *(_QWORD *)(v12 + 16) = v1[1];
    *(_QWORD *)(v12 + 24) = v1[2];
    *(_QWORD *)(v12 + 32) = v1[3];
    *(_QWORD *)(v12 + 40) = v1[4];
    v17 = v12 + v14;
    *(_QWORD *)(v12 + 48) = v17;
    *(_DWORD *)(v17 + 4) = v4;
    PpmResetPlatformIdleAccounting(v17);
    v18 = 0i64;
    for( i = v12 + v71; (unsigned int)v18 < *(_DWORD *)v1; v18 = (unsigned int)(v18 + 1) )
    {
      v20 = 384 * v18;
      v21 = (_QWORD *)(384 * v18 + v12 + 88);
      v21[1] = v21;
      *v21 = v21;
      *(_BYTE *)(384 * v18 + v12 + 104) = 7;
      if( PpmIdleDisableStatesAtBoot )
        *(_DWORD *)(v20 + v12 + 80) = 0x80000000;
      v22 = (_DWORD *)PpmIdleVetoList;
      if( PpmIdleVetoList )
      {
        if( (_DWORD)v18 == *(_DWORD *)v1 - 1 )
          *(_BYTE *)(v20 + v12 + 105) = 1;
        *(_DWORD *)(v20 + v12 + 108) = *v22;
        *(_QWORD *)(v20 + v12 + 112) = i;
        i += (unsigned __int64)(unsigned int)*v22 << 6;
        *(_QWORD *)(1008i64 * (unsigned int)v18 + v17 + 192) = v12 + v20 + 80;
      }
    }
    v23 = v12 + v72;
    v24 = v12 + v13;
    v25 = (unsigned __int16 *)v1 + 126;
    v26 = v4;
    v27 = v24;
    v28 = v12 + 128;
    do
    {
      *(_OWORD *)(v28 + 168) = *(_OWORD *)(v25 - 18);
      *(_QWORD *)(v28 - 64) = *(_QWORD *)(v25 - 10);
      KeCopyAffinityEx(v28, v25 - 102);
      v29 = 0i64;
      *(_DWORD *)(v28 - 4) = *(_DWORD *)v25;
      *(_QWORD *)(v28 + 184) = v27;
      v30 = *(unsigned int *)v25;
      v27 += 24 * v30;
      if( (_DWORD)v30 )
      {
        do
        {
          v31 = 3 * v29;
          v29 = (unsigned int)(v29 + 1);
          *(_QWORD *)(*(_QWORD *)(v28 + 184) + 8 * v31 + 16) = v23;
          v23 += 24i64 * *((unsigned int *)v25 - 1);
        }
        while( (unsigned int)v29 < *(_DWORD *)v25 );
      }
      v25 += 112;
      v28 += 384i64;
      --v26;
    }
    while( v26 );
    v1 = a1;
    v32 = 0;
    v33 = v12 + v65;
    if( v70 )
    {
      do
      {
        KeGetPrcb(v32);
        v34 = 0;
        v36 = *(_QWORD *)(v35 + 0x8000);
        *(_QWORD *)(v36 + 784) = v23;
        v23 += 24 * v4;
        *(_QWORD *)(v36 + 808) = v33;
        v33 += 4 * v4;
        *(_DWORD *)(v36 + 776) = v4;
        *(_QWORD *)(v36 + 752) = v12 + v67 + v32 * v66;
        *(_DWORD *)(v36 + 792) = v4;
        v37 = (_QWORD *)(v12 + 312);
        do
        {
          v38 = *(_QWORD *)(v36 + 784);
          v39 = 3i64 * ((unsigned int)v4 - v34 - 1);
          *(_DWORD *)(v38 + 8 * v39 + 4) = v34++;
          *(_DWORD *)(v38 + 8 * v39 + 8) = *((_DWORD *)v37 - 47);
          v40 = *v37;
          v37 += 48;
          *(_QWORD *)(v38 + 8 * v39 + 16) = v40;
        }
        while( v34 < (unsigned int)v4 );
        ++v32;
      }
      while( v32 < v70 );
      v1 = a1;
    }
  }
  v41 = v12 + 76;
  v42 = (char *)v1 + 244;
  v43 = v4;
  do
  {
    v44 = 0i64;
    *(_DWORD *)(v41 - 4) = *((_DWORD *)v42 - 1);
    *(_DWORD *)v41 = *(_DWORD *)v42;
    for( *(_BYTE *)(v41 + 45) = v42[12]; (unsigned int)v44 < *((_DWORD *)v42 + 2); v44 = (unsigned int)(v44 + 1) )
    {
      v45 = *(_QWORD *)(v41 + 236);
      v46 = 3 * v44;
      v47 = 0i64;
      v48 = *(_QWORD *)(v42 + 20) + 16i64 * (unsigned int)v44;
      *(_DWORD *)(v45 + 8 * v46) = *(_DWORD *)v48;
      *(_DWORD *)(v45 + 8 * v46 + 8) = *(_DWORD *)(v48 + 4);
      v49 = *(_DWORD *)(v48 + 4);
      if( v49 )
      {
        do
        {
          v50 = *(_QWORD *)(v48 + 8);
          v51 = *(_QWORD *)(v45 + 24 * v44 + 16);
          v52 = 3i64 * (v49 - (unsigned int)v47 - 1);
          v53 = *(unsigned __int8 *)(v50 + 4 * v47);
          *(_DWORD *)(v51 + 8 * v52 + 4) = v53;
          *(_BYTE *)(v51 + 8 * v52) = *(_BYTE *)(v50 + 4 * v47 + 1) == 0;
          *(_BYTE *)(v51 + 8 * v52 + 1) = *(_BYTE *)(v50 + 4 * v47 + 2);
          *(_BYTE *)(v51 + 8 * v52 + 2) = *(_BYTE *)(v50 + 4 * v47 + 3);
          if( *(_DWORD *)(v45 + 24 * v44) == -1 )
          {
            v54 = 384i64 * (unsigned __int8)v53;
            *(_DWORD *)(v51 + 8 * v52 + 8) = *(_DWORD *)(v54 + v12 + 124);
            v55 = *(_QWORD *)(v54 + v12 + 312);
          }
          else
          {
            *(_DWORD *)(v51 + 8 * v52 + 8) = 0;
            v55 = 0i64;
          }
          *(_QWORD *)(v51 + 8 * v52 + 16) = v55;
          v47 = (unsigned int)(v47 + 1);
          v49 = *(_DWORD *)(v48 + 4);
        }
        while( (unsigned int)v47 < v49 );
      }
    }
    v41 += 384i64;
    v42 += 224;
    --v43;
  }
  while( v43 );
  for( j = 0; j < v70; ++j )
  {
    KeGetPrcb(j);
    v58 = 0;
    for( k = *(_QWORD *)(v59 + 0x8000); v58 < v68; *(_BYTE *)(v62 + 8 * v63 + 1) = v61 )
    {
      v61 = PpmCheckCoordinatedStateInitiator(
              j,
              *(_DWORD *)(*(_QWORD *)(k + 784) + 24i64 * (v68 - v58 - 1) + 8),
              *(_QWORD *)(*(_QWORD *)(k + 784) + 24i64 * (v68 - v58 - 1) + 16),
              v57);
      ++v58;
    }
  }
  if( !PpmPlatformStates )
  {
    PpmEnableCoordinatedIdleStates((UINT64 *)v12, 1);
    v2 = 0;
  }
  updated = 0;
LABEL_50:
  if( v2 )
    goto LABEL_51;
  return(unsigned int)updated;
}

Referenced by:

No references.