PpmTestAndLockProcessor

INT64 __fastcall PpmTestAndLockProcessor(INT64 a1, _WORD *a2, INT64 a3){
  UINT64 *v3; 
  UINT32 *v4; 
  UINT32 v5; 
  __int64 v6; 
  _WORD *v8; 
  _RTL_PROCESS_MODULES *v9; 
  unsigned int v11; 
  unsigned int v12; 
  __int64 i; 
  unsigned __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  _LIST_ENTRY LoadOrderListHead; 
  INT64 v20; 
  __int64 v21; 
  v4 = (UINT32 *)(a1 + 32832);
  v5 = *(_DWORD *)(a1 + 32832);
  v6 = 0i64;
  v21 = 0x100000000i64;
  v20 = a1;
  v8 = a2;
  v9 = PopIdleTransitionTimeout;
  LoadOrderListHead.Flink = 0i64;
  LoadOrderListHead.Blink = (_LIST_ENTRY *)PopIdleTransitionTimeout;
  if( (v5 & 0xFF000000) == 0x2000000 )
  {
    do
    {
      PpmIdleTransitionStall(&LoadOrderListHead, v9, a3, v3);
      v5 = *v4;
    }
    while( (*v4 & 0xFF000000) == 0x2000000 );
    v8 = a2;
  }
  v11 = -1073741782;
  if( HIBYTE(v5) - 3 <= 2u )
  {
    if( a3 )
    {
      v12 = *(_DWORD *)a3;
      for( i = 0i64; (unsigned int)i < v12; i = (unsigned int)(i + 1) )
      {
        v6 = *(_QWORD *)(a3 + 8) + 24 * i;
        if( *(_DWORD *)(v6 + 4) == *(_DWORD *)(a1 + 32820) )
          break;
      }
      if( (_DWORD)i == v12 || !*(_BYTE *)(v6 + 2) )
        return v11;
      if( !*(_BYTE *)v6 )
        return 0;
    }
    v14 = (unsigned int)KiProcessorIndexToNumberMappingTable[*(unsigned int *)(a1 + 36)];
    v15 = *(_QWORD *)&v8[4 * (v14 >> 6) + 4] >> (v14 & 0x3F);
    if( (v15 & 1) != 0 )
      return 0;
    LODWORD(v15) = *((_DWORD *)KeGetPcr() + 105);
    v16 = *(_QWORD *)(a1 + 0x8000);
    v17 = (unsigned int)v15;
    _InterlockedOr64(
      (volatile signed __int64 *)(v16
                                + 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v15] >> 6)
                                + 80),
      1i64 << (KiProcessorIndexToNumberMappingTable[v15] & 0x3F));
    v11 = PpmIdleLockProcessor(v4);
    if( (v11 & 0x80000000) != 0 )
    {
      _InterlockedAnd64(
        (volatile signed __int64 *)(v16
                                  + 8 * ((unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[v17] >> 6)
                                  + 80),
        ~(1i64 << (KiProcessorIndexToNumberMappingTable[v17] & 0x3F)));
      return v11;
    }
    KeAddProcessorAffinityEx(a2, *(_DWORD *)(a1 + 36));
    if( !a3 || *(_DWORD *)(v6 + 4) == *(_DWORD *)(a1 + 32820) )
      return 0;
  }
  return v11;
}

Referenced by:

PpmIdleCheckCoordinatedDependencies
PpmIdleCheckCoordinatedDependency
PpmIdleExecuteTransition